Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NGINX反向代理到docker应用程序_Docker_Nginx_Reverse Proxy_Devops - Fatal编程技术网

NGINX反向代理到docker应用程序

NGINX反向代理到docker应用程序,docker,nginx,reverse-proxy,devops,Docker,Nginx,Reverse Proxy,Devops,我目前正在学习设置nginx,但我已经遇到了一个问题。我的vps上运行着gitlab和nextcloud,它们都可以通过正确的端口访问。因此,我用一个简单的proxy\u pass命令创建了一个nginx配置,但我总是显示502坏网关。 Nextcloud、Gitlab和NGINX是docker容器,NGINX的端口80已打开。其余两个集装箱的港口3000和3100已打开 /etc/nginx/conf.d/gitlab.domain.com.conf /var/logs/error.log 我

我目前正在学习设置nginx,但我已经遇到了一个问题。我的vps上运行着gitlab和nextcloud,它们都可以通过正确的端口访问。因此,我用一个简单的
proxy\u pass
命令创建了一个nginx配置,但我总是显示
502坏网关
。 Nextcloud、Gitlab和NGINX是docker容器,NGINX的端口80已打开。其余两个集装箱的港口3000和3100已打开

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

/var/logs/error.log


我的配置有什么问题吗?

我认为您可以使用比这更简单的配置方式

也许是这样的:

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

location / {
  proxy_pass http://gitlab:3000;
}
}
}
 $ docker ps (use this to get the container id)
我假设您使用docker的内部DNS访问容器,例如gitlab指向gitlab容器内部IP。如果是这种情况,那么您可以打开一个容器并尝试从另一个容器ping gitlab容器。 例如,您可以从nginx容器ping gitlab容器,如下所示:

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

location / {
  proxy_pass http://gitlab:3000;
}
}
}
 $ 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
$docker exec-it bash
#apt获取更新-y
#apt get安装iputils ping-y
#ping-c2gitlab
如果不能ping,则表示容器之间的通信有问题。你在使用docker compose吗?如果你是的话,我建议你看看“links”关键字,它用来链接应该能够相互通信的容器。例如,您可能会将gitlab容器链接到postgresql


让我知道这是否有帮助

另一个利用Docker容器只是独立控制组中的进程这一优势的选项是将每个进程(容器)绑定到主机网络(而不是独立网络组)上的端口。这绕过了Docker路由,因此请注意主机上的端口可能不会重叠(与共享同一主机网络的任何正常进程没有区别)

您提到运行Nginx和Nextcloud(我假设您使用的是Nextcloud fpm映像,因为支持FastCGI)。在这种情况下,我必须在我的Arch Linux机器上执行以下操作:

  • /usr/share/webapps/nextcloud
    绑定(绑定安装)到位于
    /var/www/html
    的容器
  • 主机和容器进程的UID必须相同(在我的例子中,用户主机
    http
    和容器
    www-data
    都是UID=33)
  • nginx.conf中的443服务器块必须将root设置为主机的nextcloud路径,
    root/usr/share/webapps/nextcloud;
  • 必须调整通过FastCGI调用php fpm的每个服务器块的FastCGI脚本路径,以引用Docker容器的Nextcloud基本路径,
    FastCGI\u参数script\u FILENAME/var/www/html$FastCGI\u script\u name;
    。换句话说,您不能像通常那样使用
    $document\u root
    ,因为这指向主机的nextcloud根路径
  • 可选:在
    config.php
    文件中调整数据库和Redis的路径,使其不使用
    localhost
    ,而使用主机的主机名。
    localhost
    似乎引用了容器的主机,尽管已绑定到主机的主网络

  • 是的,它终于开始工作了。我忘了在我的nginx配置中按名称或容器id引用容器。谢谢!!:)