簡體   English   中英

NGINX 反向代理到 docker 應用程序

[英]NGINX reverse proxy to docker applications

我目前正在學習設置 nginx,但我已經遇到了問題。 我的 vps 上運行着 gitlab 和 nextcloud,兩者都可以通過正確的端口訪問。 因此,我使用簡單的proxy_pass命令創建了一個 nginx 配置,但我總是收到502 Bad Gateway Nextcloud、Gitlab 和 NGINX 是 docker 容器,NGINX 開放了 80 端口。 剩下的兩個容器打開了端口 3000 和 3100。

/etc/nginx/conf.d/gitlab.domain.com.conf

upstream gitlab {
    server x.x.x.x:3000;
}
server {
    listen 80;
    server_name gitlab.domain.com;
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;
      proxy_set_header X-NginX-Proxy true;
      proxy_pass http://gitlab/;
     }
}

/var/logs/error.log

2018/04/12 08:10:41 [error] 7#7: *1 connect() failed (113: Host is unreachable) while connecting to upstream, client: xx.201.226.19, server: gitlab.domain.com, request: "GET / HTTP/1.1", upstream: "http://xxx.249.7.15:3000/", host: "gitlab.domain.com"
2018/04/12 08:10:42 [error] 7#7: *1 connect() failed (113: Host is unreachable) while connecting to upstream, client: xx.201.226.19, server: gitlab.domain.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://xxx.249.7.15:3000/favicon.ico", host: "gitlab.domain.com", referrer: "http://gitlab.domain.com/

我的配置有什么問題?

我認為您可以使用比這更簡單的配置方式。

也許是這樣的:

http {
 ...
server {
listen 80;
charset utf-8;
...

location / {
  proxy_pass http://gitlab:3000;
}
}
}

我假設您使用 docker 的內部 DNS 來訪問容器,例如 gitlab 指向 gitlab 容器的內部 IP。 如果是這種情況,那么您可以打開一個容器並嘗試從另一個容器 ping gitlab 容器。 例如,您可以像這樣從 nginx 容器 ping gitlab 容器:

 $ docker ps (use this to get the container id)

現在做:

$ docker exec -it <container_id_for_nginx_container> bash
# apt-get update -y
# apt-get install iputils-ping -y
# ping -c 2 gitlab

如果您無法 ping 通,則意味着容器之間無法相互通信。 你在使用 docker-compose 嗎? 如果您是,那么我建議您查看“鏈接”關鍵字,該關鍵字用於鏈接應該能夠相互通信的容器。 例如,您可能會將 gitlab 容器鏈接到 postgresql。

如果這有幫助,請告訴我。

另一個利用 Docker 容器只是獨立控制組中的進程的優勢的選項是將每個進程(容器)綁定到主機網絡上的端口(而不是獨立的網絡組)。 這會繞過 Docker 路由,因此請注意端口可能不會在主機上重疊(與共享同一主機網絡的任何正常進程沒有什么不同)的警告。

您提到運行 Nginx 和 Nextcloud(我假設您使用的是 nextcloud fpm 映像,因為它支持 FastCGI)。 在這種情況下,我必須在我的 Arch Linux 機器上執行以下操作:

  1. /usr/share/webapps/nextcloud被綁定(綁定安裝)到/var/www/html的容器。
  2. 主機和容器進程的 UID 必須相同(在我的例子中,用戶主機http和容器www-data的 UID=33)
  3. nginx.conf中的443服務器塊必須設置root為宿主機的nextcloud路徑, root /usr/share/webapps/nextcloud; .
  4. 每個通過 FastCGI 調用 php-fpm 的服務器塊的 FastCGI 腳本路徑必須調整為引用 Docker 容器的 Nextcloud 基本路徑, fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; . 換句話說,您不能像往常一樣使用$document_root ,因為它指向主機的 nextcloud 根路徑。
  5. 可選:在config.php文件中調整數據庫和 Redis 的路徑,不使用localhost ,而是使用主機的主機名。 盡管localhost已綁定到主機的主網絡,但它似乎引用了容器的主機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM