Назад | Перейти на главную страницу

Nginx 502 Bad Gateway - 111: соединение отклонено, порт не прослушивается

Я знаю, что есть много других подобных вопросов, но решения этих вопросов, как мне кажется, у меня уже есть.

У меня есть 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.