当连接到upstream的时候:[nginx]

我正在使用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()到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 Bad Gateway

我犯了什么错误?

269065 次浏览

我已经解决了我的问题,通过运行我的Nginx作为我目前登录的用户,mulagala

默认情况下,用户nginx定义在nginx.conf文件的最上面部分,如下所示;

user nginx; # Default Nginx user

nginx更改为当前用户的名称——这里是mulagala

user mulagala; # Custom Nginx user (as username of the current logged in user)

然而,这可能不能解决实际的问题,实际上可能会有偶然的副作用。

有效的解决方案,请参考约瑟夫·巴贝尔的解决方案

免责声明

在运行此操作之前,请确保您的用例没有安全隐患。

回答

我有类似的问题,让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 < a href = " https://security.stackexchange.com/questions/152358/difference-between-selinux-booleans-httpd-can-network-relay-and-httpd-can-net " > < / >

参考文献

< p > 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 < / p >

我也遇到过这个问题。另一个解决方案是将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

我也遇到过这个问题。我使用Nginx与HHVM,下面的解决方案修复了我的问题:

sudo semanage fcontext -a -t httpd_sys_rw_content_t "/etc/nginx/fastcgi_temp(/.*)?"


sudo restorecon -R -v /etc/nginx/fastcgi_temp

在Centos 7上也有类似的问题。当我试着使用索林开出的溶液时,我开始循环运动。首先,我的权限{写}被拒绝了。然后,当我解决了,我有一个权限{连接}拒绝。然后回到权限{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
< p >获得使用 Sudo cat /var/log/audit/audit.log | grep nginx | grep denied 如上所述。

所以我一次解决了一个问题,一次切换一个旗帜。

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'ing' audit.log nginx中获得的错误关联起来,拒绝

  1. 检查/etc/nginx/nginx.conf中的用户
  2. 将所有权变更为用户。
sudo chown -R nginx:nginx /var/lib/nginx

现在看看它的魔力。

如果nginx上的api网关代理通道的centos api url抛出“502 Bad Gateway”错误,执行以下命令解决此问题

sudo setsebool -P httpd_can_network_connect 1

在centos服务器上连接到上行ginx的权限被拒绝

setsebool -P httpd_can_network_connect

另一个原因可能是;你正在通过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文件,你必须先创建它,使用上述或任何其他方法或教程来创建它。

  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

如果你正在使用oracle linux,禁用强制可以解决这个问题

sudo setenforce 0