(13:权限被拒绝)连接上游时:[nginx]

时间:2014-05-30 06:37:10

标签: django python-2.7 nginx gunicorn

我正在使用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

我做错了什么?

12 个答案:

答案 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

http://www.linuxproblems.org/wiki/Selinux

答案 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)

  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
  1. 就我而言,它对 CentOS7 有帮助:
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)

  1. /etc/nginx/nginx.conf中检查用户
  2. 将所有权更改为用户。
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;
    }

这是一个很好的教程,其中包含分步实施的实现

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.sock文件,则必须首先创建,请使用上述或任何其他方法或教程来创建它。

答案 11 :(得分:-3)

sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx

sudo semodule -i mynginx.pp