Я знаю, что есть много других подобных вопросов, но решения этих вопросов, как мне кажется, у меня уже есть.
У меня есть 3 сайта, работающих локально на сервере VirtualBox Ubuntu 12.04.4 LTS, я использую 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 Я не помню, чтобы мне приходилось делать что-либо еще, кроме добавления нового номера порта в оба conf файлы
ОБНОВИТЬ Корень сайта фактически обслуживает, это только api / test.php страница, возвращающая 502
ОБНОВИТЬ Я переместил порты, я поменял местами web и dev, так что dev теперь находится на порту 9001, но это не имело значения. Я обновил вопрос, чтобы отразить это.
Все 3 порта обслуживают контент - я думаю, это как-то связано с перенаправлениями, которые я настроил для раздела API.
Вот разница между конфигурациями dev и deploy 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
И вот полный файл conf для сайта разработчиков на порту 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 / { }
}
Ваш вывод lsof выглядит довольно убедительным, что php-fpm не прослушивает порт 9001 (хотя вы можете использовать sudo netstat -plnt
для более краткого списка, который можно быстрее создать).
Предположительно, проблема в php-fpm. Я предлагаю вам на время забыть о nginx и использовать telnet localhost 9001
для отладки. Я ожидаю, что вы увидите ошибку при подключении. Вернитесь к использованию nginx, как только сможете установить соединение.
Я предполагаю, что либо у вас есть проблема с конфигурацией сайта, который должен находиться на порту 9001, либо php-fpm по какой-то причине не смог привязаться к этому порту.
В любом случае, первое, что я буду искать, - это записи журнала php-fpm во время запуска. Возможно, вам потребуется включить эти журналы. См. Этот вопрос для этого: Как настроить php-fpm для ведения журнала журналов в файлы журналов, настроенные в nginx virtualhosts
Эти различия в конфигурационном файле выглядят достаточно прямолинейно. Возможно, проверьте наличие управляющих символов в этих строках (например, концы строк в стиле Windows могут заползать при некоторых рабочих приемах). Кроме того, не забудьте проверить различия в правах доступа к файлам, а также в их содержимом.
Если проблема связана с привязкой к порту, то использование другого порта может изменить поведение. Стоит попробовать, даже если это исключить. Вы также можете просмотреть вывод strace, чтобы увидеть, что там происходит, если / когда fpm пытается привязать порт 9001. Например, strace -p [pid] | grep -n 10 9001
.
Имена пулов PHP FPM
Из вашего различия кажется, что вы дублировали имена пулов PHP в /etc/php-fpm.d
. Я почти уверен, что будет действовать только тот файл конфигурации, который загружается последним.
В результате при повторяющихся именах пулов будет вращаться только последняя загруженная пара имя / порт.
Глядя на ваши данные, возможно my-app-dev.conf
и my-app-deploy.conf
использовать одно и то же имя пула, поскольку оно не отображается в diff
. В результате действует только один из этих пулов.
Я рекомендую дважды проверить имена пулов php.