我知道还有很多其他类似的问题,但我觉得我已经找到这些问题的解决方案了。
我在 VirtualBox Ubuntu 12.04.4 LTS 服务器上本地运行了 3 个站点,我使用的是 nginx 和 php-fpm。
它们配置为在端口 9001 -> 9003 上运行:
server:/etc/php5/fpm/pool.d$ grep 900 *
my-app-deploy.conf:listen = 127.0.0.1:9002
my-app-dev.conf:listen = 127.0.0.1:9001
my-web.conf:listen = 127.0.0.1:9003
server:/etc/nginx/conf.d$ grep 900 *
my-app-deploy.conf: fastcgi_pass 127.0.0.1:9002;
my-app-dev.conf: fastcgi_pass 127.0.0.1:9001;
my-app-web.conf: fastcgi_pass 127.0.0.1:9003;
我已经重启了php-fpm和nginx成功地:
server:$ sudo service nginx restart
* Restarting nginx nginx
...done.
server:$ sudo service php5-fpm restart
* Restarting PHP5 FastCGI Process Manager php5-fpm
...done.
但如果我查看正在监听的端口,我只会看到9002和9003:
server:$ sudo lsof -i | grep 900
php5-fpm 1020 root 7u IPv4 8557 0t0 TCP localhost:9002 (LISTEN)
php5-fpm 1020 root 8u IPv4 8558 0t0 TCP localhost:9003 (LISTEN)
php5-fpm 1021 www-data 0u IPv4 8557 0t0 TCP localhost:9002 (LISTEN)
php5-fpm 1022 www-data 0u IPv4 8557 0t0 TCP localhost:9002 (LISTEN)
php5-fpm 1023 www-data 0u IPv4 8557 0t0 TCP localhost:9002 (LISTEN)
php5-fpm 1024 www-data 0u IPv4 8557 0t0 TCP localhost:9002 (LISTEN)
php5-fpm 1025 www-data 0u IPv4 8558 0t0 TCP localhost:9003 (LISTEN)
php5-fpm 1026 www-data 0u IPv4 8558 0t0 TCP localhost:9003 (LISTEN)
php5-fpm 1027 www-data 0u IPv4 8558 0t0 TCP localhost:9003 (LISTEN)
php5-fpm 1028 www-data 0u IPv4 8558 0t0 TCP localhost:9003 (LISTEN)
我收到以下错误nginx:
server:~/vhosts/my-app/logs$ tail -n 1 nginx/error.log
2014/06/20 11:07:36 [error] 2434#0: *4 connect() failed
(111: Connection refused) while connecting to upstream, client: 192.168.0.10,
server: my.app.dev, request: "GET /api/test.php HTTP/1.1", upstream:
"fastcgi://127.0.0.1:9001", host: "my.app.dev"
我希望我只是错过了一些非常基本的东西,但当我在9002我不记得除了向会议文件
更新站点根目录实际上正在提供服务,它只是api/测试.php返回 502 的页面
更新我移动了端口,交换了 web 和 dev,所以 dev 现在位于 9001 端口,但这并没有什么区别。我已更新问题以反映这一点。
所有 3 个端口都在提供内容 - 我认为这与我为 API 部分设置的重定向有关。
以下是开发和部署 PHP 和 nginx 配置之间的差异:
server:/etc/nginx/conf.d$ diff my-app-dev.conf my-app-deploy.conf
3c3
< server_name my.app.dev;
---
> server_name my.app.deploy;
10c10
< root /var/www/vhosts/my-app/public_html/mobile;
---
> root /var/www/vhosts/my-app/public_html/mobile_deploy;
47c47
< fastcgi_pass 127.0.0.1:9001;
---
> fastcgi_pass 127.0.0.1:9002;
server:/etc/php5/fpm/pool.d$ diff my-app-dev.conf my-app-deploy.conf
33c33
< listen = 127.0.0.1:9001
---
> listen = 127.0.0.1:9002
384c384
< php_admin_value[doc_root] = /var/www/vhosts/my-app/public_html/mobile
---
> php_admin_value[doc_root] = /var/www/vhosts/my-app/public_html/mobile_deploy
这是开发站点的完整配置文件,在端口 9001 上,它给了我 502
server {
listen 80;
server_name my.app.dev;
error_log /var/www/vhosts/logs/my-app/nginx/error.log;
access_log /var/www/vhosts/logs/my-app/nginx/access.log main;
error_page 404 /404;
root /var/www/vhosts/my-app/public_html/mobile;
index index.html index.php;
client_max_body_size 10M;
proxy_read_timeout 180s;
# deny any attempt to access hidden files
location ~ /\. { deny all; }
# disable logging for favicon
location = /favicon.ico {
log_not_found off;
}
location ~* \/api\/[0-9]\/.*\.zip {
try_files $uri /api/3/nomarket.data.zip;
}
location ~* \/api\/picture\/[a-z]+\/? {
if (!-e $request_filename) {
rewrite ^/api/picture/([a-z]+)/? /api/picture.php?type=$1 last; break;
}
}
location /api {
if (!-e $request_filename) {
rewrite ^/api/(.*)$ /api/router.php?rest_data=$1 last; break;
}
}
# allow php files to be executed
location ~ \.php$ {
# only call php if the file exists. Very important for security!
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9001;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
}
# just serve static files, please.
location / { }
}
答案1
您的 lsof 输出看起来相当确定,php-fpm 没有监听端口 9001(尽管您可能希望使用sudo netstat -plnt
更简洁且生成速度更快的列表)。
那么问题可能出在 php-fpm 上。我建议你暂时忘掉 nginx,然后使用它telnet localhost 9001
进行调试。我预计你会看到连接失败。一旦你可以建立连接,就重新使用 nginx。
我猜测要么是您在端口 9001 上的站点存在配置问题,要么是 php-fpm 由于某种原因无法绑定到该端口。
无论如何,我首先要查找的是启动时来自 php-fpm 的日志条目。您可能需要启用这些日志。请参阅此问题: 如何配置php-fpm将日志记录到nginx虚拟主机中配置的日志文件
这些配置文件的差异看起来足够直观。也许可以检查这些行上的控制字符(例如,Windows 样式的行尾可能会在某些工作实践中出现)。此外,请记住检查文件权限以及文件内容的差异。
如果问题与端口绑定有关,那么使用其他端口可能会改变行为。值得一试,即使只是为了排除这种情况。您还可以查看 strace 输出,看看当 fpm 尝试绑定端口 9001 时会发生什么。例如strace -p [pid] | grep -n 10 9001
。
答案2
PHP FPM 池名称
从 diff 来看,似乎您在 中重复了 PHP 池名称/etc/php-fpm.d
。我非常确定只有最后加载的配置文件才会生效。
因此,如果池名称重复,则只有最后加载的名称/端口对才会启动。
查看您的数据,可能my-app-dev.conf
和my-app-deploy.conf
共享相同的池名称,因为它未显示在中diff
。因此,这些池中只有一个有效。
我建议仔细检查你的 php 池名称。