[英]Using Docker Nginx Reverse Proxy for Docker containers applications
[英]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 機器上執行以下操作:
/usr/share/webapps/nextcloud
被綁定(綁定安裝)到/var/www/html
的容器。http
和容器www-data
的 UID=33)root /usr/share/webapps/nextcloud;
.fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
. 換句話說,您不能像往常一樣使用$document_root
,因為它指向主機的 nextcloud 根路徑。config.php
文件中調整數據庫和 Redis 的路徑,不使用localhost
,而是使用主機的主機名。 盡管localhost
已綁定到主機的主網絡,但它似乎引用了容器的主機。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.