gpt4 book ai didi

php - 在 Docker 中通过 Nginx 的多个版本的 PHP

转载 作者:可可西里 更新时间:2023-10-31 22:51:09 26 4
gpt4 key购买 nike

我为 PHP5.6 运行了两个 docker 容器:

docker run --name php5 \
-v /html1:/var/www/html/site1 \
-d -p 9001:9000 php:5.6-fpm

对于 PHP7:

docker run --name php7 \
-v /html2:/var/www/html/site2 \
-d -p 9000:9000 php:7-fpm

我用 Nginx 运行 Docker 容器:

docker run --name nginx-cache \
-v /nginx.conf:/etc/nginx/nginx.conf \
-v /nginx/html1:/var/www/html/site1 \
-v /nginx/html2:/var/www/html/site2 \
-v /sites-enabled:/etc/nginx/sites-enabled/ \
--link php5 --link php7 -d -p 9999:80 nginx

使用nginx.conf:

user  nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
sendfile on;

gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript
application/x-javascript
application/atom+xml;
gzip_disable "msie6";


##
# Basic Settings
##

server_names_hash_bucket_size 64;

tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_body_buffer_size 128k;

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;

##
# Virtual Host Configs
##

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

}

使用 site1 配置:

server {
listen 80 default_server;

server_name site1;

root /var/www/html/site1/;
index index.php index.html index.htm default.html default.htm;

fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 180;

location ~ \.php$ {
fastcgi_pass php5:9001;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SERVER_NAME $server_name;
}
}

和 site2 配置:

server {
listen 80;

server_name site2;

root /var/www/html/site2/;
index index.php index.html index.htm default.html default.htm;

fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 180;

location ~ \.php$ {
fastcgi_pass php7:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SERVER_NAME $server_name;
}
}

这个对 site2 的请求是 200 OK 并有正确的响应:

curl -X GET \
http://localhost:9999/index.php \
-H 'host: site2'

对于对 site1 的请求:

curl -X GET \
http://localhost:9999/index.php \
-H 'host: site1'

在 Nginx 容器日志中,我总是看到:

2017/04/26 21:18:27 [error] 7#7: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: site1, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://172.17.0.3:9001", host: "site1"

如有解决此问题的任何想法,我们将不胜感激。

最佳答案

好的,我解决了,非常愚蠢的错误。出于某种原因,我假设如果我像这样公开端口 9001:

docker run --name php5 \
-v /html1:/var/www/html/site1 \
-d -p 9001:9000 php:5.6-fpm

那么这个端口 9001 应该在连接到另一个 php5 容器的 Nginx 容器中使用。这是错误的,因为暴露的网络连接与链接的网络连接不同。

所以正确的site1配置应该是这样的(端口也是9000):

server {
listen 80 default_server;

server_name site1;

root /var/www/html/site1/;
index index.php index.html index.htm default.html default.htm;

fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 180;

location ~ \.php$ {
fastcgi_pass php5:9000; # <-- BOOOM!
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SERVER_NAME $server_name;
}
}

关于php - 在 Docker 中通过 Nginx 的多个版本的 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43644963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com