Gunicorn、nginx、django,在 docker 容器内。 Gunicorn 在端口 80 上成功运行,但 nginx 失败
Gunicorn, nginx, django, inside of a docker container. Gunicorn successfully runs on port 80 but nginx fails
我正在尝试建立一个我使用 django 框架编写的简单博客站点。该网站可以正常工作,但它不提供静态文件。我想那是因为 nginx 不是 运行ning。但是,当我在 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 禁止错误。
按照建议的答案,我没有收到任何错误,但网站返回 403 forbidden 并且没有显示网站 gunicorn 应该提供的部分。
按照以下方式配置 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 enable gunicorn
sudo systemctl start gunicorn
注意:为gunicorn选择合适的worker数量,可以指定日志文件如下
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 重启
我正在尝试建立一个我使用 django 框架编写的简单博客站点。该网站可以正常工作,但它不提供静态文件。我想那是因为 nginx 不是 运行ning。但是,当我在 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 禁止错误。
按照建议的答案,我没有收到任何错误,但网站返回 403 forbidden 并且没有显示网站 gunicorn 应该提供的部分。
按照以下方式配置 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 enable gunicorn
sudo systemctl start gunicorn
注意:为gunicorn选择合适的worker数量,可以指定日志文件如下
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 重启