创建一个nginx反向代理容器,以根据请求的URL转发到特定的URL /端口

时间:2017-06-29 13:44:22

标签: nginx docker proxy

我想设置一个nginx反向代理docker容器,它根据请求的URL转发。我已经设置了从domain.com的所有子域指向nginx服务器容器的dns。

示例场景:

请求:subdomain1.domain.com 应该转发到abc.xyz.com:8087

请求:subdomain2.domain.com 应该转发到abc.xyz.com:8088

我需要知道我应该在dockerfile和nginx.conf文件中写什么来实现上述目标。这些前锋也将在未来增长,有没有办法以编程方式添加这些?

1 个答案:

答案 0 :(得分:0)

Dockerfile

(我必须进行SSL终止,所以在这里你也会找到与SSL相关的文件,如果它不适合你,请忽略它们。)

FROM nginx:alpine
#create the server and location configuration
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY cert.pem /etc/nginx-certs/cert.pem
COPY key.pem /etc/nginx-certs/key.pem
COPY ssl.pass /etc/nginx-certs/ssl.pass
RUN mkdir -p /etc/nginx-logs/

nginx.conf

此nginx配置为将来自http s ://的任何请求反向代理到http://:8080

server {

    listen 443;
    server_name localhost;

    ssl_certificate           /etc/nginx-certs/cert.pem;
    ssl_certificate_key       /etc/nginx-certs/key.pem;
    ssl_password_file         /etc/nginx-certs/ssl.pass;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
    underscores_in_headers on;

    access_log            /etc/nginx-logs/<MYAPPLICATION NAME>.access.log;
    client_body_in_file_only on;

    location / {

      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;

      # Fix the “It appears that your reverse proxy set up is broken" error.
      proxy_pass          http://<MYIPADDRESS>:8080/;
      proxy_read_timeout  90;

      proxy_redirect      http://<MYIPADDRESS>:8080 https://localhost;
    }
  }

请注意,我们有一个非常原始的需求,所以这个设置为我们做了诀窍。以此为出发点。不要将此示例用于nginx最佳实践等。

满足您的特殊需求

  

请求:subdomain1.domain.com应转发到abc.xyz.com:8087

     

请求:subdomain2.domain.com应转发到abc.xyz.com:8088

您可以进一步自定义nginx.conf,可以为不同的路由添加更多位置。这里https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms数字海洋在记录nginx的基础知识方面做得很好。

而且,为了管理,nginx.conf,我不会自动化配置,我只是将它添加到像git这样的版本控制系统,并设置像drone.io或travis这样的CI-CD系统来管理部署。再一次,那就是我,你可能会有完全不同的需求。

如果要将所有http呼叫重定向到https

server {
    listen 80;
    return 301 https://$host$request_uri;
}