
내 질문은 간단합니다.
인터넷 어디에서나 Nginx에서 PHP 버전을 변경하려면 fastcgi_pass
매개변수의 UNIX 소켓을 변경해야 한다는 내용을 읽었습니다. 하지만 내 fastcgi_pass
매개변수는 TCP 소켓을 가리키고 있습니다 127.0.0.1:9250
. UNIX 소켓으로 변경하려고 시도했지만 이로 인해 502 Bad Gateway 오류가 발생했고 거기서부터 계속하는 방법을 몰랐습니다.
현재 PHP 8.2를 실행하고 있는데 PHP 8.1이 필요합니다. 나는 그것을 사용하여 설치했으며 apt-get
를 수행할 때 나열됩니다 sudo update-alternatives --list php
. 접근 방식 을 시도했지만 sudo update-alternatives
이는 CLI의 PHP 버전만 변경합니다. FPM이 아닙니다.
내 nginx 구성은 매우 간단합니다.
/etc/nginx/nginx.conf
:
user www-data;
worker_processes 4;
pid /run/nginx.pid;
# master_process off;
events {
worker_connections 768;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
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";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;
}
/etc/nginx/sites-enabled/daan.conf
:
server {
listen 80;
server_name "~(?'project'([^.]+))\.dev.local$";
return 301 https://$project.dev.local$request_uri;
}
server {
listen 443 ssl http2;
server_name "~(?'project'([^.]+))\.dev.local$";
root "/etc/nginx/development/$project";
index index.php;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log /var/log/nginx/dev.log;
error_log /var/log/nginx/dev-error.log error;
sendfile off;
client_max_body_size 100m;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_pass 127.0.0.1:9250;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
}
location ~ /\.ht {
deny all;
}
}
의 Listen 매개변수는 etc/php/8.2/fpm/pool.d/www.conf
동일한 TCP 소켓을 가리킵니다 127.0.0.1:9250
.
편집하다:요청한 대로 에서 변경한 내용은 다음과 같습니다 /etc/php/8.1/fpm/pool.d/www.conf
. 이러한 편집 내용은 에서도 동일합니다 /etc/php/8.2/fpm/pool.d/www.conf
.
; Unix user/group of the child processes. This can be used only if the master
; process running user is root. It is set after the child process is created.
; The user and group can be specified either by their name or by their numeric
; IDs.
; Note: If the user is root, the executable needs to be started with
; --allow-to-run-as-root option to work.
; Default Values: The user is set to master process running user by default.
; If the group is not set, the user's group is used.
user = daanvandenbergh
group = daanvandenbergh
; 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 IPv4 address on
; a specific port;
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses
; (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9250
답변1
귀하의 질문은 약간 혼란 스럽습니다. 구성 중 하나에 대한 nginx conf 만 3 개 이상의 구성 (네트워크 소켓이있는 8.2, 네트워크 소켓이있는 8.1, 네트워크 소켓이있는 8.1)이 있고 php-fpm 구성을 변경한 방법에 대한 세부 정보는 없습니다. .
UNIX 소켓으로 변경하려고 시도했지만 502 잘못된 게이트웨이 오류가 발생했습니다.
클라이언트가 연결을 시도하는 곳에서 서버가 수신 대기해야 합니다. Unix 도메인 소켓(TCP 소켓과 비교)의 추가적인 복잡성은 파일에 소유자와 그룹(일반적으로 웹 서버가 실행하는 uid와 동일한 소유자)이 있어야 한다는 것입니다(예: www.conf).
listen = /var/run/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
당신은 또한매우동일한 호스트에 두 가지 버전의 PHP가 설치되어 있으면 주의하십시오. 새 것을 설치하기 전에 원하지 않는 것이 완전히 제거되었는지 확인하겠습니다.
TCP 소켓이 명시적으로 필요하지 않은 한 Unix 도메인 소켓을 사용하는 것이 좋습니다. localhost는 물리적 인터페이스에 바인딩된 주소보다 훨씬 빠르고 암묵적인 보안 이점도 있지만 Unix 소켓은 여전히 더 빠릅니다.
답변2
아마도 제 질문이 명확하지 않았을 것입니다. 저는 시스템 관리자가 아니기 때문에 아마도 필요한 만큼 명확하지 않을 것입니다. 그러나 @symcbean의 답변을 읽으면서 UNIX 소켓으로 전환하는 것이 문제의 근본 원인이 되어서는 안 된다는 것이 분명해졌습니다. 이는 제가 질문을 작성할 때 가정했던 것입니다. 그래서 나는 그 길을 가고 내 길에 닥친 모든 일을 처리하기로 결정했습니다.
다음은 다른 PHP 버전으로 전환하기 위해 편집한 내용입니다. 추가 보너스로 Nginx에서 PHP 버전 간에 쉽게 전환하는 방법을 알아냈습니다.
매개변수 를 로 fastcgi_pass
변경 했습니다 ./etc/nginx/sites-enabled/daan.conf
/var/run/php/php-fpm.sock
listen
매개변수를 /etc/php8.1/fpm/pool.d/www.conf
동일한 값으로 변경했습니다 . 나는 /etc/php8.2/fpm/pool.d/www.conf
및 에 대해서도 동일한 작업을 수행했습니다 /etc/php8.0/fpm/pool.d/www.conf
.
이제 를 실행하면 sudo update-alternatives --config php
파일 php-fpm.sock
은 PHP FPM과 Nginx가 모두 수신하는 선택한 PHP 버전에 대한 심볼릭 링크가 됩니다.
그 후(그리고 이 부분으로 인해 이전 질문에서 언급한 잘못된 게이트웨이 오류가 발생했을 수 있음) Nginx와 PHP-FPM을 올바르게 다시 시작하는 것이 중요합니다.여기):
sudo mkdir -p /var/run/php
sudo service restart nginx
sudo service php(old version)-fpm stop -v
sudo service php(new version)-fpm start -v
sudo chown mysql:mysql /var/run/mysqld
sudo service mysql start
이제 작동합니다.