Gunicorn, nginx, django внутри контейнера docker. Gunicorn успешно работает на порту 80, но nginx не работает
Я пытаюсь настроить простой блоггерский сайт, который я написал, используя фреймворк django. Сайт работает, за исключением того, что он не обслуживает статические файлы. Я предполагаю, что это потому, что не запущен nginx. Однако, когда я настраиваю его на запуск на любом порту, кроме 80, я получаю следующую ошибку:
nginx: [emerg] bind() to 172.17.0.1:9000 failed (99: Cannot assign requested address)
Когда я запускаю его на порту, который уже используется gunicorn, я получаю следующую ошибку:
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Мой файл конфигурации nginx выглядит следующим образом:
upstream django {
server 127.0.0.1:8080;
}
server {
listen 172.17.0.1:9000;
server_name my.broken.blog;
index index.html;
location = /assets/favicon.ico { access_log off; log_not_found off; }
location /assets {
autoindex on;
alias /var/www/html/mysite/assets;
}
location / {
autoindex on;
uwsgi_pass unix:///run/uwsgi/django/socket;
include /var/www/html/mysite/mysite/uwsgi_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Но если я запускаю nginx без запуска guincorn, он работает правильно, но я получаю ошибку 403 forbidden error
Настройте Nginx и Gunicorn следующим образом, чтобы они работали,
- Используйте unix сокет для обмена данными между nginx и gunicron вместо того, чтобы запускать gunicorn на каком-то порту .
Создайте файл юнитов для gunicorn в следующем месте
sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=root
Group=nginx
WorkingDirectory=/path-to-project-folder
ExecStart=/<path-to-env>/bin/gunicorn --workers 9 --bind unix:/path-to-sockfile/<blog>.sock app.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target
Затем запустите и включите службу gunicorn. Он создаст sock-файл по указанному пути.
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
Примечание: Выберите подходящее количество рабочих для gunicorn, можно разделить файлы журнала следующим образом
ExecStart=//bin/gunicorn --workers 9 --bind unix:/path-to-sockfile/.sock app.wsgi:application --access-logfile /var/log/gunicorn/access.log --error-logfile /var/log/error.log
- создайте новый файл конфигурации, специфичный для проекта, в /etct/nginx вместо того, чтобы редактировать стандартный nginx.conf .
nano /etc/nginx/blog.conf
и добавьте следующие строки (можно также добавить файл в /etc/nginx/default.d/)
server {
listen 80;
server_name 172.17.0.1; # your Ip
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /path-to-static-folder;
}
location /media/ {
root /path-to-media-folder;
}
location / {
proxy_set_header Host $http_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;
proxy_pass http://unix:/path-to-sock-file/<blog-sock-file>.sock;
}
}
включите файл /etc/nginx/blog.conf в nignx.conf
---------
----------
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/blog.conf; # the new conf file added
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
------
-------
запустите sudo nginx -t // для проверки ошибок в конфигурации nginx.
выполнить sudo systemctl nginx restart