nginx将所有域redirect到另一个端口,但为pipe理应用保留一个域

我尝试使用Docker设置Web服务器,所以我将使用我的服务器“server.domain.com”的主要域用于pipe理员使用(server.domain.com/phpmyadmin,等…),我想redirect所有另一个域名是一个在端口81上侦听的apache容器。所以我在default.conf有这样的代码:

 server { listen 80; listen [::]:80 default_server; location / { proxy_pass http://web/; } } 

main.conf

 server { listen 80; listen [::]:80; server_name server.domain.com; location /phpmyadmin/ { proxy_pass http://phpmyadmin/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } 

(更新conf)

而我的nginx.conf

 user nginx; worker_processes 2; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; keepalive_timeout 65; gzip on; gzip_comp_level 5; gzip_http_version 1.0; gzip_min_length 0; gzip_types *; gzip_vary on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites/*; } 

“docker-compose.yml”的一部分:

 nginx: build: ./server/proxy ports: - "80:80" #volumes: #- nginx_conf:/etc/nginx/ networks: - web_network depends_on: - web - phpmyadmin - panel 

在这一刻我使用“depends_on”在我的configuration使用容器的名称,但你只谈论networking,所以我认为“depends_on”是不是有义务?

但是,这给了我一个错误的connection refused 。 如果我通过server.domain.comreplace127.0.0.1 ,则第一个虚拟主机不工作,并redirect到nginx webRoot。

所以我不知道为什么…

谢谢 !

据我了解,这个nginx容器正在侦听端口80,所有连接请求将传递给你的机器。 所以它只是一个代理容器。 我有一个类似的实施项目。 让我们试着做出来。

为了清晰起见,我build议你有两个conf文件。

1)main.conf – 将服务于你的“server.domain.com”

 server { listen 80; listen [::]:80; server_name server.domain.com; location /phpmyadmin { proxy_pass http://server.domain.com:82; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } That's all of the configuration you basically need here. Later if you need them, you'll pass headers. 

2)default.conf – 将服务于任何其他域

 server { listen 80; listen [::]:80 default_server; location / { proxy_pass http://server.domain.com:81; } } 

该configuration假定:

1)有一个运行apache的容器,请求通过端口81到达您的机器的请求将被传递到apache2容器的端口80(或者任何正在监听的端口)

2)有一个容器运行phpmyadmin和请求到您的机器在端口82将被传递到phpmyadmin容器的端口80(或任何…)

你应该考虑一些改进:

1)如果你用docker-compose启动所有的容器,你可以为它们build立一个虚拟networking。 这将允许您通过名称直接向容器传递请求。 在我的项目中,我这样做:

 proxy_pass http://adminer; 

在这里admine被定义为:

 adminer: image: phpmyadmin/phpmyadmin volumes: - ./db_interface/conf/config.inc.php/:/etc/phpmyadmin/config.inc.php networks: - demo_webnet - prod_webnet 

如果你有问题,我会解释。

2)你可以将另一个nginx服务器与你的apache2服务器放在它的容器中。 他们捆绑工作很好。 Nginx更适合服务器静态。 Apache2更适合你的情况。 我可以告诉你如何做到这一点。

如果你需要它

看起来你正在尝试做类似于我为公司需求做的事情。 如果你有兴趣,我可以让你访问我的项目。 我已经用Docker构build了一个完整的服务器基础架构,现在它完全部署在我们的服务器上。 总之它的工作原理如下:

  • 首先是nginx代理容器
  • 用于演示应用程序的apache2-nginx-php5.6的容器
  • 用于演示应用程序的apache2-nginx-php7.0的容器
  • 一个用于生产应用程序的apache2-nginx-php5.6的容器
  • 一个用于生产应用程序的apache2-nginx-php7.0容器
  • 一个容器与玛丽亚db演示
  • 与玛丽亚db生产容器
  • 一个容器与phpmyadmin访问两个数据库服务

  • 任何请求来nginx代理。

  • 它匹配一些虚拟主机,并被代理到内部有apache2和nginx的4个容器之一。

还有很多很酷的东西,如configuration为自动重新加载apache2和nginx,当它检测到文件的变化,监督服务,https支持等等。

我打算进一步开发它作为一个开源项目,谁有兴趣应该让我知道。