我正在使用Nginx和Gunicorn配置Django项目。
当我进入gunicorn端口时。在Nginx服务器中,我在错误日志文件中得到以下错误;
2014/05/30 11:59:42 [crit] 4075#0: *6 connect()到127.0.0.1:8001失败(13:权限被拒绝)而连接到上游,客户端:127.0.0.1,服务器:localhost,请求:“GET / HTTP/1.1”,上游:“http://127.0.0.1:8001/”,主机:“localhost:8080”
下面是我的nginx.conf文件的内容;
server {
listen 8080;
server_name localhost;
access_log /var/log/nginx/example.log;
error_log /var/log/nginx/example.error.log;
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
}
}
在HTML页面中,我得到502坏网关。
我犯了什么错误?
另一个原因可能是;您正在通过nginx使用代理访问您的应用程序,但您没有添加gunicorn。袜子文件代理gunicorn。
需要在nginx配置中添加代理文件路径。
location / {
include proxy_params;
proxy_pass http://unix:/home/username/myproject/gunicorn.sock;
}
这是一个很好的教程,一步一步地实现这个功能
https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04#configure-nginx-to-proxy-pass-to-gunicorn
注意:如果你没有创建anyname。袜子文件你必须创建如果首先,要么使用上述或任何其他方法或教程来创建它。
我也遇到过这个问题。另一个解决方案是将httpd网络连接的SELinux布尔值切换为on (Nginx使用httpd标签)。
setsebool httpd_can_network_connect on
要保持更改,请使用-P标志。
setsebool httpd_can_network_connect on -P
您可以看到httpd使用的所有可用SELinux布尔值的列表
getsebool -a | grep httpd
我也有同样的问题。我尝试了运行以下命令的@joebarbere解决方案,解决了这个问题,但我担心安全性
setsebool -P httpd_can_network_relay 1
然后我想到了下面的解决方案
https://serverfault.com/questions/634294/nodejs-nginx-error-13-permission-denied-while-connecting-to-upstream
我使用了非标准端口,SELinux阻塞了端口。
使用以下命令检查端口是否被允许
sudo semanage port --list | grep 4343
并将端口添加到允许列表中
sudo semanage port --add --type http_port_t --proto tcp 4343
我重新启动了nginx服务,然后url就可以访问了。我觉得这样更安全。
免责声明
在运行此操作之前,请确保您的用例没有安全隐患。
回答
我有类似的问题,让Fedora 20, Nginx, Node.js和Ghost(博客)工作。原来我的问题是由于SELinux。
这应该可以解决问题:
setsebool -P httpd_can_network_connect 1
细节
我检查了SELinux日志中的错误:
sudo cat /var/log/audit/audit.log | grep nginx | grep denied
并发现运行以下命令修复了我的问题:
sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx
sudo semodule -i mynginx.pp
选项2(可能更安全)
setsebool -P httpd_can_network_relay 1
https://security.stackexchange.com/questions/152358/difference-between-selinux-booleans-httpd-can-network-relay-and-httpd-can-net
参考文献
http://blog.frag-gustav.de/2013/07/21/nginx-selinux-me-mad/
https://wiki.gentoo.org/wiki/SELinux/Tutorials/Where_to_find_SELinux_permission_denial_details
http://wiki.gentoo.org/wiki/SELinux/Tutorials/Managing_network_port_labels
另一个原因可能是;您正在通过nginx使用代理访问您的应用程序,但您没有添加gunicorn。袜子文件代理gunicorn。
需要在nginx配置中添加代理文件路径。
location / {
include proxy_params;
proxy_pass http://unix:/home/username/myproject/gunicorn.sock;
}
这是一个很好的教程,一步一步地实现这个功能
https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04#configure-nginx-to-proxy-pass-to-gunicorn
注意:如果你没有创建anyname。袜子文件你必须创建如果首先,要么使用上述或任何其他方法或教程来创建它。