502 Неисправный шлюз Nginx | Django | Gunicorn на балансировщике нагрузки
У меня есть AWS Elastic Load Balancer (ELB) и прослушиватели, которые перенаправляют на внутренний порт 80 (сертификаты и завершение SSL на ELB). Я запускаю nginx на экземплярах EC2, а также php, gunicorn и django/python. Кластер настраивается для размещения нескольких доменных имен с отдельными веб-сайтами/приложениями для каждого.
Внешние http/https запросы прекрасно работают для html и php, возвращая страницы. Для запросов django с использованием сокетов я получаю внешнюю ошибку шлюза 502 Bad, но внутренне через curl (например, curl --unix-socket /tmp/gunicorn_.sock http:///app/) это работает нормально.
Внешне https:///test (простая конечная точка Nginx) работает нормально
Ни в одном из журналов, которые я могу найти, нет ошибок. например:
[2025-07-31 00:05:07 +0000] [776767] [INFO] Handling signal: term
[2025-07-31 00:05:07 +0000] [776771] [INFO] Worker exiting (pid: 776771)
[2025-07-31 00:05:07 +0000] [776769] [INFO] Worker exiting (pid: 776769)
[2025-07-31 00:05:07 +0000] [776768] [INFO] Worker exiting (pid: 776768)
[2025-07-31 00:05:08 +0000] [778670] [INFO] Starting gunicorn 23.0.0
[2025-07-31 00:05:08 +0000] [778670] [INFO] Listening at: unix:/tmp/gunicorn_<domain>.sock (778670)
[2025-07-31 00:05:08 +0000] [778670] [INFO] Using worker: sync
[2025-07-31 00:05:08 +0000] [778672] [INFO] Booting worker with pid: 778672
[2025-07-31 00:05:08 +0000] [778673] [INFO] Booting worker with pid: 778673
[2025-07-31 00:05:08 +0000] [778674] [INFO] Booting worker with pid: 778674
Конфигурация моего сервера
server {
listen 80;
server_name <domain> www.<domain> localhost;
root /mnt/efs/www/<domain>;
index index.php index.html;
location ~ /app/ {
error_log /mnt/efs/log/nginx-app-debug.log debug;
proxy_pass http://unix:/tmp/gunicorn_<domain>.sock/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_intercept_errors on;
}
location = /test {
default_type text/plain;
return 200 "Nginx test";
}
}
Мой служебный файл gunicorn
[Unit]
Description=Gunicorn instance for Django app
After=network.target
[Service]
User=ec2-user
Group=ec2-user
WorkingDirectory=/mnt/efs/www-private/<domain>/<ver>
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
ExecStart=/usr/local/bin/gunicorn --workers 3 --bind unix:/tmp/gunicorn_<domain>.sock hello_world.wsgi:application --access-logfile /mnt/efs/log/django_<domain>.log --error-logfile /mnt/efs/log/django_<domain>.log
Restart=always
[Install]
WantedBy=multi-user.target
Другая важная информация:
- Для SELinux установлено допустимое значение
- Служба Gunicorn запущена, и для разрешений сокета установлено значение 777 (для тестирования)
- Во время запуска не сообщалось о пропавших зависимостях
Я рассмотрел все похожие проблемы здесь, но ни одно из перечисленных решений не работает. Буду благодарен за любую помощь!
Для тех, кто смотрит в будущее, ответ @IvanShatsky, приведенный выше, решил проблему. Отключите PrivateTmp, и это сработает
sudo bash -c "cat > /etc/systemd/system/nginx.service.d/override.conf" <<EOF
[Service]
PrivateTmp=false
EOF