이틀 전에 프로덕션 서버(CentOS 6.8)에서 PHP7(PHP 7.0.14)로 업그레이드했습니다. 이제 nginx(1.10.2-1) 로그에 다음과 같은 오류가 발생합니다.
2017/01/20 08:20:04 [오류] 7654#7654: *153301 업스트림에서 예기치 않은 FastCGI 레코드를 보냈습니다: 업스트림에서 응답 헤더를 읽는 동안 3, 클라이언트: XXX.XXX.XXX.XXX, 서버: example.com, 요청 : "GET / HTTP/1.0", 업스트림: "fastcgi://unix:/var/run/php-fpm/example.fpm.sock:", 호스트: "www.example.com"
- 우리는 개별 php-fpm 풀을 실행하는 여러 웹사이트를 보유하고 있으며 이 오류는 모든 웹사이트에서 동시에 발생합니다.
- 모든 웹사이트에서 이 오류가 발생하면 브라우저에 "502 Bad Gateway"가 표시됩니다.
- 이 오류는 1~2분 동안 발생하며 그 후 모든 것이 자동으로 정상으로 돌아갑니다.
- 하루에 세 번씩 다른 시간에 일어났습니다.
- PHP5에는 문제가 없었습니다.
- opcache의 모든 응용 프로그램 캐시 폴더를 블랙리스트에 추가하려고 했습니다.
PHP7로 업그레이드된 유사한 설정을 가진 다른 서버가 있는데 그러한 문제는 없습니다.
이 문제를 어떻게 해결하고 해결책을 찾아야 합니까?
업데이트 1
서버 세부 정보
CPU: 2x Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz
RAM: 256GB
OS: CentOS 릴리스 6.8
커널: 2.6.32-504.8.1.el6.x86_64
PHP: 7.0.14-3 사용 IUS 저장소
Nginx에서: 1.10.2-1
서버는 널리 사용되는 오픈 소스 PHP 애플리케이션을 실행하는 여러 사이트를 실행하기 위한 웹 서버로 사용됩니다. 우리는 백엔드로 php-fpm과 함께 Nginx를 사용합니다. 각 웹사이트에는 별도의 php-fpm 풀과 다른 소켓이 있습니다. PHP 애플리케이션은 이미 php7과 호환되며 유일한 변경 사항은 PHP7로 업그레이드하는 것입니다.
업데이트 2
Nginx 기본 구성
user apache;
worker_processes auto;
error_log /var/log/nginx/error.log alert;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 4024;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 256;
server_names_hash_max_size 1024;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
client_max_body_size 512M;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
gzip on;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_min_length 1000;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/javascript text/xml application/xml application/rss+xml application/atom+xml application/rdf+xmli font/ttf font/otf image/svg+xm;
gzip_buffers 16 24k;
gzip_disable msie6;
fastcgi_connect_timeout 120;
fastcgi_send_timeout 1200;
fastcgi_read_timeout 1200;
fastcgi_buffer_size 256k;
fastcgi_buffers 16 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
keepalive_requests 10000;
include /etc/nginx/conf.d/*.conf;
# Load all vhosts !
include /etc/nginx/sites-enabled/*.conf;
}
개별 nginx 사이트 템플릿
server {
server_name @@HOSTNAME@@ www.@@HOSTNAME@@;
root "@@PATH@@";
index index.php index.html index.htm;
add_header Cache-Control public;
client_max_body_size 512m;
access_log @@LOG_PATH@@/access.log;
error_log @@LOG_PATH@@/error.log;
location / {
# This is cool because no php is touched for static content
try_files $uri $uri/ $uri/index.php @rewrite /index.php$uri?$args;
}
location @rewrite {
rewrite ^ /index.php;
}
location ~ \.php$ {
send_timeout 1200;
proxy_read_timeout 1200;
proxy_connect_timeout 120;
fastcgi_read_timeout 1200;
fastcgi_pass unix:@@SOCKET@@;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
access_log off;
}
location ~* \.(html|htm)$ {
expires 30m;
}
location ~* /\.(ht|git|svn|bak) {
deny all;
}
location ~ ^/sites/.*/files/styles/ {
try_files $uri @rewrite;
}
}
PHP FPM 풀 템플릿
[@@USER@@]
listen = /var/run/php-fpm/@@USER@@.fpm.sock
listen.owner = nobody
listen.group = nobody
listen.mode = 0666
user = @@USER@@
group = @@USER@@
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 300s
pm.max_requests = 5000
rlimit_files = 1024
request_terminate_timeout = 1200s
security.limit_extensions = .php
php_admin_value[session.save_path] = "@@HOME_DIR@@/_sessions"
php_admin_value[error_log] = "@@HOME_DIR@@/logs/www-error.log"
업데이트 3 문제가 발생한 경우
요청 1
GET /moodle/ HTTP/1.0
User-Agent: Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)
Host: www.example.com
수신된 헤더
502 Bad Gateway
Server: nginx/1.10.2
Date: Wed, 25 Jan 2017 12:32:00 GMT
Content-Type: text/html
Content-Length: 173
Connection: close
받은 내용
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.10.2</center>
</body>
</html>
답변1
좋아, 모든 php-fpm 풀은 동시에 몇 분 동안 작동하지 않습니다. 그리고 php 5.6 => php 7에서 변경된 유일한 사항입니다. php7에서 변경된 사항은 무엇입니까? 모든 php-fpm 풀에서 전역은 무엇입니까? opcache. php.ini를 친절하게 제공해 주시겠습니까? 그렇지 않은 경우 opcache 구성을 확인하고 최소한 다음 매개변수를 확인하십시오.
zend_extension=opcache.so;
opcache.enable=1; # on or off on your config ?
opcache.memory_consumption=64; # Too small for you ?
opcache.max_accelerated_files=2000; # maybe to small for you ?
opcache.force_restart_timeout="180"; # Oh!!! This is the time of your outage!!
force_restart_timeout을 180에서 120으로 변경하고 opcache.log_verbosity_level을 3보다 큰 값으로 변경한 다음 중단이 평소보다 짧은지 확인합니다. 그런 다음 검토해 보시기 바랍니다.opcache 런타임 구성귀하의 사이트에 맞게 올바르게 조정하세요.
답변2
이는 2017년 2월 16일자 버전 7.0.16에서 수정된 PHP의 버그인 것으로 보입니다.
수정된 버그 #67583(max_children 제한에서 fastcgi_end_request를 두 배로 늘림)
답변3
서버 차단 확인fastcgi_passnginx 사이트 구성에서.
모든 사이트 구성에 대해 fastcgi_pass를 업데이트하려면 다음을 실행하세요.
sed "s/php5/php/php7.0/g" *.conf -i
서비스 nginx && php7.0-fpm