我正在使用nginx和gunicorn配置django项目。当我在nginx服务器中访问我的端口gunicorn mysite.wsgi:application --bind=127.0.0.1:8001
时,我的错误日志文件中出现以下错误。
2014/05/30 11:59:42 [crit] 4075#0: *6 connect() to 127.0.0.1:8001 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8001/", host: "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 Bad Gateway
。
我做错了什么?
答案 0 :(得分:502)
我有类似的问题让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
参考文献:
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
答案 1 :(得分:164)
我也遇到过这个问题。另一种解决方案是将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
答案 2 :(得分:11)
在Centos 7上遇到了类似的问题。当我尝试应用索林规定的解决方案时,我开始进行循环。首先,我获得了{write}拒绝的许可。然后,当我解决了我的权限{connectto}被拒绝。然后又回到权限{write}被拒绝。
在@Sid回答上面使用getsebool -a | grep httpd
检查标志并切换它们后,我发现除了httpd_can_network_connect关闭之外。 http_anon_write也被关闭,导致权限被拒绝写入和权限被拒绝{connectto}
type=AVC msg=audit(1501830505.174:799183): avc:
denied { write } for pid=12144 comm="nginx" name="myroject.sock"
dev="dm-2" ino=134718735 scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:object_r:default_t:s0 tclass=sock_file
获得使用 sudo cat /var/log/audit/audit.log | grep nginx | grep否认 如上所述。
所以我一次解决了一个,一次切换一个标志。
setsebool httpd_can_network_connect on -P
然后运行@sorin和@Joseph指定的命令
sudo cat /var/log/audit/audit.log | grep nginx | grep denied |
audit2allow -M mynginx
sudo semodule -i mynginx.pp
基本上,您可以检查在setsebool上设置的权限,并将其与从grepp'获得的错误相关联。 audit.log nginx,被拒绝
答案 3 :(得分:10)
我已经通过将我的nginx作为我当前正在使用mulagala
的工作用户运行来解决了我的问题。默认情况下,我的nginx
文件中的用户为nginx.conf
。我们可以在nginx.conf
文件的顶部。
user nginx;
将此更改为您当前的工作用户名,例如
user mulagala;
答案 4 :(得分:2)
在centos服务器上连接到upstreamnginx的13权限被拒绝-
setsebool -P httpd_can_network_connect 1
答案 5 :(得分:1)
我也遇到过这个问题。我正在使用Nginx和HHVM,下面的解决方案解决了我的问题:
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/etc/nginx/fastcgi_temp(/.*)?"
sudo restorecon -R -v /etc/nginx/fastcgi_temp
答案 6 :(得分:1)
sudo cat /var/log/audit/audit.log | grep nginx | grep denied
type=AVC msg=audit(1618940614.934:38415): avc: denied { connectto } for
pid=18016 comm="nginx" path="/home/deployer/project/tmp/sockets/puma.sock" scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
tclass=unix_stream_socket permissive=1
sudo setenforce 0
setsebool httpd_can_network_connect on -P
setsebool httpd_can_network_relay on -P
在你看到什么是启用后:
getsebool -a | grep httpd
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> on
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> on
httpd_can_network_memcache --> off
httpd_can_network_relay --> on
httpd_can_sendmail --> off
httpd_dbus_avahi --> off
httpd_dbus_sssd --> off
httpd_dontaudit_search_dirs --> off
httpd_enable_cgi --> off
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_graceful_shutdown --> on
httpd_manage_ipa --> off
httpd_mod_auth_ntlm_winbind --> off
httpd_mod_auth_pam --> off
httpd_read_user_content --> off
httpd_run_ipa --> off
httpd_run_preupgrade --> off
httpd_run_stickshift --> off
httpd_serve_cobbler_files --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_sys_script_anon_write --> off
httpd_tmp_exec --> off
httpd_tty_comm --> off
httpd_unified --> off
httpd_use_cifs --> off
httpd_use_fusefs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
httpd_use_openstack --> off
httpd_use_sasl --> off
httpd_verify_dns --> off
答案 7 :(得分:0)
/etc/nginx/nginx.conf
中检查用户sudo chown -R nginx:nginx /var/lib/nginx
现在看魔术。
答案 8 :(得分:0)
如果在nginx上传递api网关代理的centos api URL抛出“ 502 Bad Gateway”错误,请运行以下命令来解决该问题
sudo setsebool -P httpd_can_network_connect 1
答案 9 :(得分:0)
谢谢,伙计们:)现在,我可以将Nginx代理用于我的Kibana URL
非常有用的命令:) setsebool -P httpd_can_network_connect 1
答案 10 :(得分:0)
另一个原因可能是;您正在使用代理通过nginx访问您的应用程序,但没有为gunicorn添加gunicorn.sock
代理文件。
您需要在nginx配置中添加代理文件路径。
location / {
include proxy_params;
proxy_pass http://unix:/home/username/myproject/gunicorn.sock;
}
这是一个很好的教程,其中包含分步实施的实现
注意:如果您没有创建anyname.sock
文件,则必须首先创建,请使用上述或任何其他方法或教程来创建它。
答案 11 :(得分:-3)
sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx
sudo semodule -i mynginx.pp