簡體   English   中英

如何使用Nginx將傳入請求從端口80上的特定URL轉發到各種Docker應用程序

[英]How can I use nginx to forward incoming requests from a certain URL on port 80 to various docker applications

這是我的故事。

我正在運行一個Meteor.js應用,該應用在同一主機上啟動Docker容器。 Meteor.js設置為在端口8080上運行; 所有對“ /”的http和https請求都轉發到的位置。 我在/ etc / nginx / project / sites-available / site中的nginx配置如下:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    root /usr/share/nginx/html;
    index index.html index.htm;
    server_name **projectdomain.com**;

    location / {
        rewrite     ^ https://$server_name$request_uri? permanent;
    }
}

server {
    listen 443 ssl spdy; 
    server_name **projectdomain.com**;
    root html;
    index index.html;
    ssl_certificate /etc/nginx/ssl/project.crt;
    ssl_certificate_key /etc/nginx/ssl/project.key;
    ssl_stapling on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-$
    add_header Strict-Transport-Security "max-age=31536000;";
    if ($http_user_agent ~ "MSIE" ) {
        return 303 https://browser-update.org/update.html;
    }
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Forwarded-For $remote_addr;
        if ($uri != '/') {
            expires 30d;
        }
    }

}

我想要某個URL,例如projectdomain.com/4200指向projectdomain.com:4200,我的Docker容器將在其中偵聽。 我之所以要這樣做,是因為我的項目的目標受眾位於公司防火牆之后,該防火牆無法使他們訪問在端口4200上運行的應用程序。我的意思是,docker應用程序運行得很好,並且可以通過以下方式訪問:前往projectdomain.com:4200。 我只希望它橋接80或443以符合我當前的nginx設置。

當我做

location /4200 {
proxy_pass http://127.0.0.1:4200;
}

盡管我的Docker容器在4200上運行,但轉到projectdomain.com/4200會出現nginx 502錯誤。 這可能與netstat -tulpn輸出有關。

而我的流星項目似乎在127.0.0.1:8080上運行,則docker容器顯示正在::: 4200運行。 我認為,我得到502的原因是因為nginx將請求以/ 4200轉發到127.0.0.1:4200,但沒有任何運行(如netstat所述)。

問題是,我應該怎么做才能使docker在127.0.0.1:4200而不是::: 4200運行容器,或者我應該遵循其他方法嗎?

首先,您可以嘗試nginx代理映像

nginx-proxy設置了一個運行nginx和docker-gen的容器。 docker-gen為nginx生成反向代理配置,並在容器啟動和停止時重新加載nginx。

該圖像無法與位置一起使用。 但是您可以使用子域。 就像4200.projectdomain.com一樣。 這是最簡單的方法。

其次,您可以手動配置nginx。
您需要鏈接容器,並按此處所述配置nginx

首先,proxy_pass應該在運行容器的主機上設置IP地址,而不是localhost,也不要設置127.0.0.1。 如果您有許多動態端口URL,要將它們映射到上游端口,請使用以下命令:

location ~ ^/(\d{4,})$ {
    set $p_port $1;
    proxy_pass http://HOSTIP:$p_proxy;
}

暫無
暫無

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

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