Bri*_*ian 4 nginx proxy reverse-proxy docker
我有一个简单的 Nginx 代理 Docker 容器侦听端口 80。这是 Dockerfile:
FROM centos:7
MAINTAINER Brian Ogden
# Not currently being used but may come in handy
ARG ENVIRONMENT
RUN yum -y update && \
yum clean all && \
yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
yum -y makecache && \
yum -y install nginx-1.12.0 wget
# Cleanup some default NGINX configuration files we don’t need
RUN rm -f /etc/nginx/conf.d/default.conf
COPY /conf/proxy.conf /etc/nginx/conf.d/proxy.conf
COPY /conf/nginx.conf /etc/nginx/nginx.conf
CMD ["nginx"]
Run Code Online (Sandbox Code Playgroud)
对于这个 Nginx 代理,这里是我的 nginx.conf:
daemon off;
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
accept_mutex off;
}
http {
include /etc/nginx/mime.types;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
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;
client_max_body_size 300m;
client_body_buffer_size 300k;
large_client_header_buffers 8 64k;
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_min_length 0;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
include /etc/nginx/conf.d/*.conf;
}
Run Code Online (Sandbox Code Playgroud)
这是我的代理配置:
upstream accountstaging {
server 127.0.0.1:5023;
}
server {
listen 80;
server_name account.staging.mysite.com;
location / {
proxy_pass http://accountstaging;
proxy_redirect off;
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-Host $server_name;
}
}
Run Code Online (Sandbox Code Playgroud)
我的代理配置正在侦听端口 80,并尝试将来自 account.staging.mysite.com 的请求请求到与侦听端口 5023 的 Ngnix 代理在同一 Docker 主机上运行的 Docker 容器。
这是我的 Nginx 代理的 docker-compose.yml:
version: '3'
services:
reverseproxy:
build:
context: ./
dockerfile: docker/Dockerfile
image: tsl.devops.reverseproxy.image
container_name: tsl.devops.reverseproxy.container
ports:
- "80:80"
Run Code Online (Sandbox Code Playgroud)
这是监听 5023 端口的 Docker 容器的 docker-compose.yml:版本:'3'
services:
apistaging:
build:
context: ./
dockerfile: docker/staging/Dockerfile
image: tsl.api.example.image
container_name: tsl.api.example.container
ports:
- "127.0.0.1:5023:80"
Run Code Online (Sandbox Code Playgroud)
Dockerfile 对我的问题并不重要,但无论如何都在这里:
FROM tsl.devops.dotnetcore.base.image:2
MAINTAINER Brian Ogden
WORKDIR /app
COPY ./src/Tsl.Example/bin/Release/netcoreapp2.0/publish .
ENTRYPOINT ["dotnet", "Tsl.Example.dll"]
Run Code Online (Sandbox Code Playgroud)
我按照这个例子来设置我的代理。
我之前曾在此处和此处的Stackexchange 论坛上问过一个相关问题。这个问题我已经将场景提炼并简化为一个简单的代理,将请求转发到一个侦听端口 5023 的 Docker 容器。
多亏了这里的问题和答案,我才意识到我遇到了两个问题:
所以 docker-compose 为我的 Nginx 代理 docker 容器和我的 api docker 容器创建的不同默认网络是因为我在使用两个不同的 docker-compose.yml 文件。这是因为我为许多 API 微服务构建了 Jenkins,因此它们具有独立的 docker-compose 文件,我需要一个 Nginx 代理将端口 80 上的请求转发到每个微服务。
为了测试这一点,为两个容器、API 和 Nginx 代理创建了一个 docker-compose.yml:
version: '3'
services:
reverseproxy:
build:
context: ./
dockerfile: docker/nginxproxy/docker/Dockerfile
image: tsl.devops.reverseproxy.image
container_name: tsl.devops.reverseproxy.container
ports:
- "80:80"
apistaging:
build:
context: ./
dockerfile: docker/staging/Dockerfile
image: tsl.api.example.image
container_name: tsl.api.example.container
ports:
- "5023:5023"
environment:
ASPNETCORE_URLS: http://+:5023
Run Code Online (Sandbox Code Playgroud)
是的,仍然存在一个问题,代理传递到 http//:127.0.0.1:5023,该转发保留在 Nginx Docker 容器中,并且从未找到在 Docker 主机上运行的 API,我只需要使用 docker-compose。 yml 服务名称以获取它:
upstream accountstaging {
server apistaging:5023;
}
server {
listen 80;
server_name account.staging.mysite.com;
location / {
proxy_pass http://accountstaging;
proxy_redirect off;
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-Host $server_name;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25570 次 |
| 最近记录: |