AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1167703
Accepted
AlexNikolaev94
AlexNikolaev94
Asked: 2024-11-13 02:36:36 +0800 CST2024-11-13 02:36:36 +0800 CST 2024-11-13 02:36:36 +0800 CST

Proxy reverso Nginx para um servidor php-fpm remoto com fastcgi

  • 772

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.phparquivo, 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/site1como 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!

nginx
  • 1 1 respostas
  • 43 Views

1 respostas

  • Voted
  1. Best Answer
    Ivan Shatsky
    2024-11-13T05:30:50+08:002024-11-13T05:30:50+08:00
    1. Sua configuração, sendo testada com nginx -tcomando, deve fornecer uma mensagem de erro como

      nginx: [emerg] unknown directive "try" in ...
      

      devido a

      try $uri =404;
      

      linha. Se fosse para ser o

      try_files $uri =404;
      

      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.

    2. Como você não definiu explicitamente a raiz do seu site, por padrão ela é igual a {prefix}/htmlonde {prefix}há algum valor pré-compilado (pode ser visualizado usando nginx -Vo comando). Então, o que quer que você esteja passando para sua instância privada por meio do

      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      

      diretiva, provavelmente não é a correta. Você deve usar qualquer um

      root /apps/site1;
      

      ou

      root /var/www/html/site1;
      

      dentro do seu local aninhado (embora eu não saiba como o PHP-FPM tratará os caminhos com links simbólicos incluídos).

    3. Como já foi dito no StackOverflow:

      Você tem um local aninhado lá que processa .phpsolicitações, mas não parece que você está solicitando um arquivo PHP real em sua URL de teste. O padrão típico seria ter uma try_filesdiretiva que tenta carregar o arquivo/diretório solicitado no disco, ou voltar a rotear a solicitação por meio de um index.phparquivo como um controlador frontal. Você não parece ter isso.

      Adicione qualquer um

      try_files $uri /site1/index.php$is_args$args;
      

      ou

      error_page 404 = /site1/index.php$is_args$args;
      

      para o seu local de origem.

    4. Você não precisa usar os dois

      include fastcgi.conf;
      

      e

      include fastcgi_params;
      

      no seu local aninhado. Eles são quase os mesmos, a única diferença é que fastcgi.confo arquivo inclui o

      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      

      linha while fastcgi_paramsnão (ao usar o fastcgi_paramsarquivo em vez de fastcgi.conf, você deve incluir esta linha).

    5. Qualquer PATH_INFOcoisa relacionada, como

      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      

      não faz sentido nos location ~ \.php$ { ... }locais (ao contrário dos location ~ \.php(?:/|$) { ... }outros).

    6. Por que não usar um prefixo simples de localização como

      location /site1/ {
          ...
      }
      

      ou

      location ^~ /site1/ {
          ...
      }
      

      (especialmente porque você não usa o grupo de captura de regex de qualquer maneira)?

    • 3

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve