Nginx

docker swarm 的 nginx 反向代理 - 502 網關錯誤

  • May 18, 2019

我在“swarm.example.com”上執行一個 docker swarm。在伺服器上,有一個容器正在執行,可以在“swarm.example.com:3000”上訪問。

在伺服器“example.com”上,我正在執行具有以下規則的 nginx 反向代理

server {
   listen 80;
   server_name app.example.com;

   location / {
       proxy_pass http://swarm.example.com:3000;
   }
}

當我嘗試訪問 app.example.com 時,我收到502 Bad Gatway錯誤。我錯過了什麼嗎?

所有伺服器都執行 CentOS 7.6

謝謝!

嘗試通過反向代理訪問後端會導致 502 Bad Gateway 錯誤:

$ wget -S --spider http://nginxtest.example.com/
Spider mode enabled. Check if remote file exists.
--2019-05-18 10:12:11--  http://nginxtest.example.com/
Resolving nginxtest.example.com (nginxtest.example.com)... 192.168.15.20
Connecting to nginxtest.example.com (nginxtest.example.com)|192.168.15.20|:80... connected.
HTTP request sent, awaiting response...
 HTTP/1.1 502 Bad Gateway
 Server: nginx/1.12.2
 Date: Sat, 18 May 2019 08:12:11 GMT
 Content-Type: text/html
 Content-Length: 3693
 Connection: keep-alive
 ETag: "5a9e5ebd-e6d"
Remote file does not exist -- broken link!!!

這很可能是因為 selinux 預設情況下不允許網路伺服器的傳出連接,因為這通常是他們不做的事情。

您將在 /var/log/nginx/error.log 中找到類似的條目:

2019/05/18 10:12:11

$$ crit $$1041#0:*5 connect() 到 192.168.15.52:3000 連接到上游失敗(13:權限被拒絕),客戶端:146.140.37.47,伺服器:_,請求:“HEAD / HTTP/1.1”,上游:“ http://192.168.15.52:3000/ ”,主機:“nginxtest.example.com”

此外,您會在 /var/log/audit/audit.log 中找到類似的條目:

type=AVC msg=audit(1558167131.910:463):avc: denied { name_connect } for pid=1041 comm=“nginx” dest=3000 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:ntop_port_t:s0 tclass= tcp_socket permissive=0 type=SYSCALL msg=audit(1558167131.910:463): arch=c000003e syscall=42 成功=no exit=-13 a0=8 a1=562671c4eef0 a2=10 a3=7ffcfbc72530 items=0 ppid=1006 pid=1041 auid=4294967295 uid=996 gid=994 euid=996 suid=996 fsuid=996 egid=994 sgid=994 fsgid=994 tty=(none) ses=4294967295 comm=“nginx” exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)

執行以下命令以允許 nginx 連接到其他主機:

setsebool -P httpd_can_network_connect true

(該參數-p使設置保持不變,否則下次重啟後會被重置。)

現在代理工作:

$ wget -S --spider http://nginxtest.example.com/
Spider mode enabled. Check if remote file exists.
--2019-05-18 10:15:14--  http://nginxtest.example.com/
Resolving nginxtest.example.com (nginxtest.example.com)... 192.168.15.20
Connecting to nginxtest.example.com (nginxtest.example.com)|192.168.15.20|:80... connected.
HTTP request sent, awaiting response...
 HTTP/1.1 200 OK
 Server: nginx/1.12.2
 Date: Sat, 18 May 2019 08:15:15 GMT
 Content-Type: text/html
 Content-Length: 40
 Connection: keep-alive
 Last-Modified: Sat, 18 May 2019 08:08:16 GMT
 ETag: "5cdfbd70-28"
 Accept-Ranges: bytes
Length: 40 [text/html]
Remote file exists and could contain further links,
but recursion is disabled -- not retrieving.

如果想了解更多,nginx網站上有一篇關於nginx和selinux的非常詳細的文章。

引用自:https://serverfault.com/questions/967826