it-swarm-pt.tech

PHP-FPM e Nginx: 502 Gateway Incorreto

Configuração

  • Ubuntu Server 11.10 64 bits
  • Amazon AWS, Ec2, hospedado na nuvem
  • instância t1.micro

Antes de escrever mais alguma coisa, gostaria de dizer que verifiquei os tópicos nginx 502 bad gateway e Nginx + PHP-FPM 502 Bad Gateway , que infelizmente me ajudou nesse sentido.

O problema parece ser bastante comum: uma configuração incorreta de nginx ou php-fpm pode levar a um erro 502 Bad Gateway, que é algo de que não consegui me livrar. Observe que isso aparece mesmo quando eu vou para o meu domínio root , sem especificar nenhum diretório em particular.

Estou executando um servidor da Web do Amazon EC2, com a porta 9000 ativada, a porta 80 aberta, etc.

A questão em particular é: como posso me livrar desse erro desagradável? Ou, melhor ainda, como posso obter php5-fpm para realmente funcionar .

O que eu tentei até agora

Edição consistente de arquivos de configuração, principalmente php-fpm.conf e nginx.conf.

i. php-fpm.conf

Eu adicionei o seguinte, que não ajudou muito:

;;;;;;;;;;;;;
; Fpm Start ;
;;;;;;;;;;;;;

;pm.start_servers = 20
;pm.min_spare_servers = 5
;pm.max_spare_servers = 35

Agora, depois tentei incluir meus arquivos de configuração:

include=/etc/php5/fpm/*.conf

Que só me ferrou ainda mais.

Configuração completa

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamicaly changed by using the
; '-p' argument from the command line.

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
;  - the global prefix if it's been set (-p arguement)
;  - /usr otherwise
;include=/etc/php5/fpm/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /var/run/php5-fpm.pid

; Error log file
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php5-fpm.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
;emergency_restart_threshold = 0

; Interval of time used by emergency_restart_interval to determine when 
; a graceful restart will be initiated.  This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
emergency_restart_interval = 0

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
daemonize = no

;;;;;;;;;;;;;
; Fpm Start ;
;;;;;;;;;;;;;

;pm.start_servers = 20
;pm.min_spare_servers = 5
;pm.max_spare_servers = 35

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ; 
;;;;;;;;;;;;;;;;;;;;

; Multiple pools of child processes may be started with different listening
; ports and different management options.  The name of the pool will be
; used in logs and stats. There is no limitation on the number of pools which
; FPM can handle. Your system will tell you anyway :)

; To configure the pools it is recommended to have one .conf file per
; pool in the following directory:
include=/etc/php5/fpm/pool.d/*.conf

ii . nginx.conf

Com toda a honestidade, esta configuração é um punhado de alguns sites que visitei, mas posso dizer-lhe que antes deste negócio 502 Bad Gateway, o servidor estava funcionando bem (sem PHP trabalhando. Período.).

A questão reside principalmente no fato de que algo está terrivelmente errado. E agora, quando eu tento fazer um service php5-fpm restart, ele paira no que eu estou supondo ser um loop infinito ou algo assim, que eu não posso nem CTRL-C fora de.

Configuração completa

user www-data;
worker_processes 1;
pid /var/run/nginx.pid;

events {
    worker_connections 64;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush off;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    server {
        listen 80;
        server_name ec2-xx-xx-xx-xx.compute-x.amazonaws.com;

        location ~ ^(.+\.php)(.*)$ {
            root   /home/wayvac/public;
            fastcgi_pass   unix:/var/run/php5-fpm.pid;  
            #fastcgi_pass   127.0.0.1:9000; #Un-comment this and comment "fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;" if you are not using php-fpm.
            fastcgi_index  index.php;
            set $document_root2 $document_root;
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            fastcgi_split_path_info ^(.+\.php)(.*)$;
            fastcgi_param   SCRIPT_FILENAME $document_root2$fastcgi_script_name;
            fastcgi_param   PATH_INFO   $fastcgi_path_info;
            fastcgi_param   PATH_TRANSLATED $document_root2$fastcgi_path_info;
            include fastcgi_params;
            fastcgi_param  DOCUMENT_ROOT      $document_root2;
        }       

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        location / {
            root /home/wayvac/public;   
            index index.html index.htm index.php;
        }

        location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
            # Some basic cache-control for static files to be sent to the browser
            expires max;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        }

        #include drop.conf;
        #include php.conf;
    }
}
76
zeboidlund

Se alguém encontrar esta página encontrando o mesmo problema que eu tive, encontrei a resposta aqui: http://www.howtoforge.com/installing-nginx-with-php5-and-php-fpm-and-mysql-support -lemp-on-ubuntu-12.04-lts

Para aqueles de vocês que não podem ser incomodados para clicar e resolver isso por si mesmos ...;)

A condição:

O servidor Ubuntu ou Debian com NGINX e PHP 5.3 funciona bem, mas o upgrade de PHP para 5.4 fornece 502 erros de Gateway Incorreto. Procurando serviços em execução na porta 9000 (normalmente executando netstat -lp ou similar) não retorna nada.

O conserto:

Abra /etc/php5/fpm/pool.d/www.conf e anote o parâmetro 'listen' (no meu caso /var/run/php5-fpm.sock):

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /var/run/php5-fpm.sock

e substitua a variável fastcgi_pass no seu vhost pela localização que você acabou de notar.

Então, esta amostra de configuração do symfony2 (tirada daqui: http://wiki.nginx.org/Symfony ):

  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  location ~ ^/(app|app_dev)\.php(/|$) {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  HTTPS              off;
  }

torna-se isso:

  # pass the PHP scripts to FastCGI server at /var/run/php5-fpm.sock
  location ~ ^/(app|app_dev)\.php(/|$) {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  HTTPS              off;
  }

Então reinicie o nginx:

Sudo /etc/init.d/nginx restart

Nota: substitua ~ ^/(app|app_dev)\.php(/|$) { por ~ ^/index\.php(/|$) { se você não estiver no SF2 **

Espero que isso salve alguém um pouco de tempo :)

Editar

Claro, você poderia mudar o listen = /var/run/php5-fpm.sock para listen = 127.0.0.1:9000 no /etc/php5/fpm/pool.d/www.conf e então reiniciar o php5-fpm (o que evitaria que você tivesse que mudar seus vhosts), mas você deve assumir que eles mudaram o php5-fpm para rodar através de um socket ao invés de escutar na porta 9000 por um motivo.

Edit2

Se você ainda estiver com erro 502, veja esta resposta: erro nginx se conectar ao php5-fpm.sock falhou (13: Permission denied)

152
nealio82

Tente definir esses valores, resolve problema em fast-cgi

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
28
ananthan

Eu fiz todos esses ajustes semelhantes, mas de vez em quando eu estava recebendo erros 501/502 (diariamente).

Estas são as minhas configurações em /etc/php5/fpm/pool.d/www.conf para evitar erros nginx 501 e 502… O servidor tem 16Gb RAM. Esta configuração é para um servidor de 8Gb RAM, por isso…

Sudo nano /etc/php5/fpm/pool.d/www.conf

em seguida, defina os seguintes valores para

pm.max_children = 70
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500

Após esta alteração, reinicie o php-fpm

Sudo service php-fpm restart
10
PJunior

Se você encontrou o problema depois de atualizar o php-fpm como eu, tente isto: Abra /etc/php5/fpm/pool.d/www.conf desconforme as seguintes linhas:

listen.owner = www-data
listen.group = www-data
listen.mode = 0666

então reinicie o php-fpm.

4
yang

Não se esqueça que php-fpm é um serviço. Depois de instalá-lo, certifique-se de iniciá-lo:

# service php-fpm start
# chkconfig php-fpm on
3
Jake Wilson

Para qualquer outra pessoa lutando para chegar ao fundo disso, eu tentei ajustar o tempo limite conforme sugerido, pois eu não queria parar de usar soquetes Unix ... depois de muita solução de problemas e não muito para continuar, descobri que esse problema estava sendo causado pela extensão APC que eu habilitei em php-fpm alguns meses atrás. Desativar esta extensão resolveu os erros intermitentes do 502, a maneira mais fácil de fazer isso foi comentando a seguinte linha:

;extension = apc.so

Isso fez o truque para mim!

2
William Emmerson

A porta foi alterada para 9001 em 5.4, apenas mudando a porta de 9000 para 9001 no conf nginx e na configuração do php-fpm funcionou para mim.

1
Aaron Judd

Espero que esta dica salve a vida de outra pessoa. No meu caso, o problema foi que fiquei sem memória, mas apenas um pouco, foi difícil pensar nisso. Desperdiçou 3hrs nisso. Eu recomendo correr:

Sudo htop

ou

Sudo free -m

... juntamente com a execução de solicitações problemáticas no servidor para ver se sua memória não está esgotada. E se isso acontecer no meu caso, você precisa criar um arquivo de troca (a menos que você já tenha um).

Eu segui este tutorial para criar um arquivo de troca no Ubuntu Server 14.04 e funcionou muito bem: Http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/

1
Rav

Antes de mexer na configuração do Nginx, tente desativar o ChromePHP primeiro.

1 - Abra app/config/config_dev.yml

2 - Comente estas linhas:

chromephp:
    type:   chromephp
    level:  info

O ChromePHP empacota as informações de depuração codificadas json no cabeçalho X-ChromePhp-Data, que é muito grande para a configuração padrão do nginx com o fastcgi.

0
Lucas Bustamante

Estou muito atrasado para este jogo, mas meu problema começou quando atualizei o php no meu servidor. Consegui apenas remover o arquivo .socket e reiniciar meus serviços. Então tudo funcionou. Não sei por que isso fez a diferença, já que o arquivo tem tamanho 0 e a propriedade e as permissões são as mesmas, mas funcionou.

0
humanity

No seu arquivo NGINX vhost, no bloco de localização que processa seus arquivos PHP (geralmente location ~ \.php$ {) através do FastCGI, certifique-se de ter as próximas linhas: 

proxy_buffer_size          128k;
proxy_buffers              4 256k;
proxy_busy_buffers_size    256k;
fastcgi_buffer_size        16k;
fastcgi_buffers            4 16k;

Depois disso, não esqueça de reiniciar o fpm e o nginx. 


Adicional:  

Caminhos vhost NGINX

  • /etc/nginx/sites-enabled/ - Linux
  • '/ usr/local/etc/nginx/sites-enabled /' - Mac

Reinicie o NGINX: 

  • Sudo service nginx restart - Linux
  • brew service restart nginx - Mac

Reinicie o FPM: 

Determine o nome do processo do fpm: - systemctl list-unit-files | grep fpm - Linux - brew services list | grep php - Mac

e reinicie-o com: 

  • Sudo service <service-name> restart - Linux
  • brew services restart <service-name> - Mac
0
М.Б.

Tudo bem depois de tentar todas as soluções na web acabei figurando o problema usando um método muito simples, primeiro chequei php-fpm err log 

cat /var/log/php5-fpm.log 

e o erro mais repetido foi 

" WARNING: [pool www] server reached pm.max_children setting (5), consider raising it "

Eu edito a configuração de pools PHP-fpm 

nano /etc/php5/fpm/pool.d/www.conf

Eu chutei esta linha 

pm.max_children = 5

Para novo valor 

pm.max_children = 10

BTW Estou usando o VPS de baixo custo com 128MB de RAM Como todos os outros que eu estava pensando em usar o pm.max_children, meu servidor vai consumir menos memória, mas a configuração que usamos foi muito baixa até mesmo iniciar o processo PHP-fpm. Espero que isso ajude os outros desde que eu encontrei isso após 24 horas de teste e falhando, sempre o meu suporte de hospedagem não foi capaz de resolver o problema.

0
Salem

Eu também achei este erro pode ser causado ao escrever dados json_encoded () para o MySQL. Para contornar isso eu base64_encode () o JSON. Por favor, não quando decodificado, a codificação JSON pode alterar valores. Nb 24 podem se tornar 24.00

0
Lionel Morrison

Você deve ver o log de erros. Por padrão, sua localização está em /var/log/nginx/error.log

No meu caso, o 502 fica por causa de:

GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", Host: "symfony2.local"
2016/05/25 11:57:28 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", Host: "symfony2.local"
2016/05/25 11:57:29 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", Host: "symfony2.local"
2016/05/25 11:57:29 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", Host: "symfony2.local"

Quando sabemos exatamente o que está errado, conserte-o. Para esse erro, basta modificar o buffer:

fastcgi_buffers 16 512k; 
fastcgi_buffer_size 512k;
0
De Nguyen