Tenho 2 instâncias do AWS EC2, uma das quais reside em uma sub-rede pública e está configurada para atuar como uma instância NAT , e executa Nginx. A outra instância reside em uma sub-rede privada, mas pode se comunicar com a pública. Os respectivos endereços IP das instâncias são, por exemplo:
- 172.25.48.14 - Instância Nginx em uma sub-rede pública (172.25.48.0/28), tem um IP elástico atribuído
- 172.25.48.140 - instância executando php-fpm em uma sub-rede privada (172.25.48.128/28)
A questão é que eu quero que este site seja acessível por uma certa URL - eu supus que o Nginx agisse como um servidor proxy reverso que mapeia solicitações para certos subdomínios ou URLs para recursos respectivos. Então, aqui está minha configuração do Nginx:
http {
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
server_names_hash_bucket_size 128;
include /etc/nginx/mime.types;
default_type text/html;
proxy_headers_hash_bucket_size;
access_log /var/log/nginx/access.log
error_log /var/log/nginx/error.log
server {
listen 80;
location ~ ^/site1(.*)$ {
# These are commented out because no matter if specified or not the result is the same
# index index.php;
# try_files $uri $uri/ /site1/index.php?$request_uri;
location ~ \.php$ {
include fastcgi.conf;
try $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 172.25.48.140:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
}
E aqui está, respectivamente, a configuração do pool php-fpm para o site na instância privada:
[site1]
user = www-data
group = www-data
listen = 172.25.48.140:9000
listen.allowed_clients = 172.25.48.14, 172.25.48.140, 127.0.0.1
php_admin_value[disable_functions] = exec, passthru, shell_exec, system
php_admin_flag[allow_url_fopen] = off
pm = dynamic
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 8
pm.process_idle_timeout = 30s
pm.status_path = /php_status
ping.path = /ping
ping.response = wrrrrrrrrryyyyyyyyyyy
access.log = /var/log/php/8.3/$pool.access.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}d %{kilo}M %C%%"
Para simplificar, vamos supor que eu tenha apenas um único index.php
arquivo, que também reside na instância privada em /apps/site1/
, que tem um link simbólico em /var/www/html/site1
.
O problema é que não importa o que eu tente, recebo 404, e a julgar pelos logs no lado da instância privada, a solicitação nem chega lá - mesmo sabendo que tenho os grupos de segurança da instância configurados corretamente e nas portas certas, porque, de outra forma, posso conectar da instância privada para a pública e vice-versa sem problemas. A única vez que recebi uma solicitação para o php-fpm (embora um 404 também) foi quando movi a pesquisa de "localização" mais profunda (aquela que corresponde aos scripts .php) para o nível superior do servidor - então, basicamente, a solicitação foi direto para 172.25.48.14
, e não para 172.25.48.14/site1
como eu pretendia.
Estou esquecendo de algo? O problema pode ser que os arquivos de origem estão localizados na mesma instância que o php-fpm, e não no lado do Nginx? Estou entendendo errado o conceito de como ele funciona? Por favor, se você tiver alguma ideia sobre isso, ficarei extremamente grato pela sua ajuda. Obrigado antecipadamente!
Sua configuração, sendo testada com
nginx -t
comando, deve fornecer uma mensagem de erro comodevido a
linha. Se fosse para ser o
diretiva, também não funcionará. Esta diretiva faz com que o nginx verifique o URI da sua solicitação para ser um arquivo físico relativo à raiz do seu servidor web (que não está definido de forma alguma), obviamente falhando (já que seu arquivo PHP está localizado no outro host). Esta linha deve ser removida do seu local aninhado.
Como você não definiu explicitamente a raiz do seu site, por padrão ela é igual a
{prefix}/html
onde{prefix}
há algum valor pré-compilado (pode ser visualizado usandonginx -V
o comando). Então, o que quer que você esteja passando para sua instância privada por meio dodiretiva, provavelmente não é a correta. Você deve usar qualquer um
ou
dentro do seu local aninhado (embora eu não saiba como o PHP-FPM tratará os caminhos com links simbólicos incluídos).
Como já foi dito no StackOverflow:
Adicione qualquer um
ou
para o seu local de origem.
Você não precisa usar os dois
e
no seu local aninhado. Eles são quase os mesmos, a única diferença é que
fastcgi.conf
o arquivo inclui olinha while
fastcgi_params
não (ao usar ofastcgi_params
arquivo em vez defastcgi.conf
, você deve incluir esta linha).Qualquer
PATH_INFO
coisa relacionada, comonão faz sentido nos
location ~ \.php$ { ... }
locais (ao contrário doslocation ~ \.php(?:/|$) { ... }
outros).Por que não usar um prefixo simples de localização como
ou
(especialmente porque você não usa o grupo de captura de regex de qualquer maneira)?