Atualmente, estou tentando separar três aplicativos de um repositório em três, mas mantendo a estrutura do URL, portanto, basicamente, diferentes locais no mesmo domínio precisam ser entregues por aplicativos diferentes.
O que eu estou enfrentando é que um dos aplicativos precisa ser o substituto para URLs inexistentes; portanto, se o primeiro não corresponder e o segundo não, o terceiro deverá lidar com a solicitação
A estrutura que eu tenho é:
/ etc / nginx / sites-enabled / main_site, aqui, além do server_name e dos logs que tenho include /etc/nginx/subsites-enabled/*
, onde tenho 3 arquivos de configuração, um para cada um dos aplicativos.
Cada um dos 3 arquivos de configuração contém um bloco de localização.
Eu tentei lookahead negativo no regex (basicamente tentando codificar os URLs que os outros aplicativos manipulam), mas falhei.
Então, para resumir:
/ e / community devem ser entregues por /etc/nginx/subsites-enabled/example.org/home (alguns scripts perl)
/ news deve ser entregue em /etc/nginx/subsites-enabled/example.org/news (wordpress)
todo o resto deve ser entregue por /etc/nginx/subsites-enabled/example.org/app (aplicativo de bolo)
O bit perl funciona bem. O problema que estou enfrentando é que o aplicativo está assumindo as notícias (provavelmente porque corresponde. *). Tentei várias opções (já estou nisso há 2 dias), mas nenhuma delas resolveu todos os problemas (às vezes ativos estáticos não funcionariam etc.).
Minha configuração é:
/etc/nginx/sites-enabled/example.org:
server {
listen 80;
server_name example.org;
error_log /var/log/nginx/example.org.log;
include /etc/nginx/subsites-enabled/example.org/*;
}
/etc/nginx/subsites-enabled/example.org/home:
location = / {
rewrite ^.*$ /index.pl last;
}
location ~* /community(.*) {
rewrite ^.*$ /index.pl last;
}
location ~ \.pl {
root /var/www/vhosts/home;
access_log /var/log/nginx/home/access.log;
error_log /var/log/nginx/home/error.log;
include /etc/nginx/fastcgi_params;
fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/home$fastcgi_script_name;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
/ etc / ngins / ativado por subsites / news
location /news {
access_log /var/log/nginx/news/access.log;
error_log /var/log/nginx/news/error.log debug;
error_page 404 = /news/index.php;
root /var/www/vhosts/news;
index index.php;
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/news$fastcgi_script_name;
}
}
/ etc / nginx / subsites-enabled / app:
location ~ .* {
access_log /var/log/nginx/app/access.log;
error_log /var/log/nginx/app/error.log;
rewrite_log on;
index index.php;
root /var/www/vhosts/app/app/webroot;
if (-f $request_filename) {
expires 30d;
break;
}
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/app/app/webroot$fastcgi_script_name;
}
}
@
prefixo) que mapeia para o aplicativo padrão. Você também pode configurar uma página de erro que mapeia um 404 para um local nomeado.location ^~ /news
. b) para o seu bloco de aplicativos, você deve poder fazerlocation /
(isso não é o mesmo quelocation = /
, mas deve corresponder a tudo que ainda não corresponde). c) em alguns casos (principalmente regexes), a ordem importa - você pode combinar os 3 arquivos em um único arquivo com os blocos na ordem correta. Além disso, use try_files em vez de!-e
. Por fim, consulte wiki.nginx.org/HttpCoreModule#location .Respostas:
Existem algumas coisas erradas na sua configuração, sendo as duas relevantes:
Por exemplo, use o URL example.org/news/test.htm
location /news
bloco irá corresponder/news/test.htm
- isso não muda, apenas porque está no bloco de localização/var/www/vhosts/news/news/test.htm
if (!-e $request_filename)
declaração deve capturar esse arquivo inexistente/index.php
last
os processos, recomeça (quebrando o bloco de localização)/index.php
agora é capturado pelolocation /app block
.O problema mencionado acima, com a diretiva raiz, é agravado quando você acessa o bloco de localização do aplicativo. Diferente do bloco 'news', no qual você pode simplesmente remover 'news' do caminho (já que será adicionado novamente), não é possível fazer isso no caminho do aplicativo, que termina em 'webroot'.
A solução está na
alias
diretiva. Isso não altera a raiz do documento, mas altera o caminho do arquivo usado para atender à solicitação. Infelizmente,rewrite
etry_files
tendem a se comportar um pouco inesperadamente comalias
.Vamos começar com um exemplo simples - sem PHP - apenas HTML e seu bloco Perl - mas com uma estrutura de pastas correspondente à sua (testada no Nginx 1.0.12, CentOS 6):
location = /
- corresponderá apenas ao caminho raizlocation ^~ /community
- corresponderá a todos os caminhos que começam com / communitylocation ~ \.pl
- corresponderá a todos os arquivos que contêm .pllocation ^~ /news
- corresponderá a todos os caminhos que começam com / newslocation ^~ /app
- corresponderá a todos os caminhos que começam com / applocation /
- corresponderá a todos os caminhos que não correspondem acimaVocê deve conseguir remover o
^~
- mas ele pode oferecer uma ligeira melhora no desempenho, pois para de procurar quando a correspondência é encontrada.Embora deva ser simples adicionar os blocos PHP novamente, há, infelizmente, uma pequena dificuldade -
try_files
(e sua reescrita) não acaba passando o caminho desejado para o bloco de localização aninhado - e usandoalias
quando apenas a extensão é especificado no bloco de localização não funciona.Uma solução é usar blocos de localização separados que executam uma captura juntamente com a diretiva de alias - não é muito elegante, mas tanto quanto posso dizer, funciona (novamente, testado no Nginx 1.0.12, CentOS 6 - of claro, não configurei CakePHP, Wordpress e Perl - usei apenas alguns arquivos PHP e HTML em cada pasta)
A configuração acima, pega a simples acima e faz duas alterações:
location ~* ^/news/(.*\.php)$
- corresponderá a todos os arquivos que terminam em .php, com caminhos iniciados por / news /location ~* ^/app/(.*\.php)$
- corresponderá a todos os arquivos que terminam em .php, com caminhos iniciados por / app /^~
correspondência - isso é necessário para que os dois blocos de localização adicionados possam corresponder aos caminhos (caso contrário, a correspondência seria interrompida nos blocos / news ou / app).Note-se que a ordem para correspondência de local é muito importante aqui:
=
)^~
segundoUm regex correspondente substituirá uma string reta!
Um ponto importante de menção é que, quando as capturas são usadas com alias, todo o URL é substituído - não apenas a pasta principal. Infelizmente, isso significa que
$fastcgi_script_name
é deixado vazio - então, eu usei$1
acima.Estou certo de que você precisará fazer algumas alterações, mas a premissa básica deve ser funcional. Você deve poder separar os blocos em vários arquivos, conforme necessário - a ordem não deve afetar a configuração.
fonte