【问题标题】:how to configure nginx for 2 different projects (2 different docker compose files)如何为 2 个不同的项目配置 nginx(2 个不同的 docker compose 文件)
【发布时间】:2021-04-29 20:09:00
【问题描述】:

我有 2 个项目:

  1. myapi 服务于所有 api 调用
  2. django_web 使用 myapi。

如果我将它们放在 2 个不同的服务器上 - 它们工作得很好(因为它们是完全独立的)但是,我希望它们都在同一台服务器上(命名:www.example.com)但我不知道我们如何他们都可以共享同一个nginx。我正在使用 docker,它抱怨 0.0.0.0:443 已在使用中。

myapi nginx 配置:

upstream flask_server {    
   server flaskapp2:8000;
}


server {
  listen 80;
  server_name example.com;

 location / {
     return 301 https://$server_name$request_uri;
  }
}

server {
listen 443 ssl;
 
server_name example.com;

location / {
    proxy_pass http://flaskapp2:8000;
    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;       
    proxy_no_cache 1;
    proxy_cache_bypass 1; 
}

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

对于 django_web

server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;        
}


server {
 client_max_body_size 20M;
 listen 443 ssl;
  server_name example.com;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location /static/ {
      alias /www/static/;
    }

    location /websocket/ {
   proxy_http_version 1.1;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";
   #proxy_pass http://$server_name:8080/websocket/my_random_number/;
   proxy_pass http://$server_name:8080;

 }



location / {
     proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Forwarded-Port $server_port;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://$server_name:8080;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

} }

myapi 的 docker 设置:

  nginx:
image: "nginx:1.13.5"
ports:
  - "80:80"
  - "443:443"
volumes:
  - ./config/nginx/conf.d:/etc/nginx/conf.d
  - ./static:/static
  - /etc/letsencrypt:/etc/letsencrypt/ 
restart: always
networks:
  - my_network
depends_on: 
  - flaskapp2
container_name: hnginx

对于 django_web:

  nginx:
    restart: always
    image: "nginx"
    container_name: hnginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./config/example:/etc/nginx/conf.d
      - ./static2:/static
      - ./media2:/media
      - .:/www
      - /etc/letsencrypt:/etc/letsencrypt/ 
      - ./config/html_pages:/usr/share/nginx/html
    networks:
      - hnetwork

【问题讨论】:

    标签: docker nginx configuration share


    【解决方案1】:

    如果您想通过容器处理跨同一主机的共享端口,我建议您使用名为 Traefik 的中间件服务。

    将 Nginx 提供的两个服务放在 Traefik 后面。 Traefik 将按照域名或路径前缀规则将您在 443 上传入的 Web 请求路由到良好的服务。

    这是一个简短的 docker-compose 实施建议:

    myapi:
      [Your configuration]
      expose:
        - 80
        - 443
      labels:
        - [Traefik configuration labels here]
    
    django:
      [Your configuration]
      expose:
        - 80
        - 443
      labels:
        - [Traefik configuration labels here]
    
    traefik:
      [Traefik configuration]
      ports:
         # single access point on 443 that route incoming request
         - 443:443
    

    【讨论】:

    • 谢谢。这是(Traefik)是代替 nginx 还是替代?
    • 除了我的 Nginxs 服务之外,我还在生产环境中使用它。从我的 Nginxs 服务中,我公开了 80 端口,然后我为 Traefik 配置了 Let's encrypt for HTTPs,你就可以开始了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2018-12-22
    • 2021-12-27
    相关资源
    最近更新 更多