基于docker-compose配置的nginx多域名转发

基于docker-compose配置的nginx多域名转发

目的不用多说了,一台云服务器配置多个站点,对应多个域名。用到了nginx, nginx-proxy, 分发到一个静态网站和本dokuwiki。静态网站直接挂到了nginx下。

容器配置感觉比直接配Nginx还简单,关键还安全,对外只提供一个接口。这源于docker-compose的内部消息机制

docker-compose的配置 #

首先建立一个子网络,用于内部消息分发

docker network create nginx-proxy

# 查看
docker network ls

然后是docker-compose的配置文件,包含三个服务,nginx-basic是对外的接口; dokuwiki是其中一个网络服务; blog是另一个。

# yaml 配置
version: '3'
services:
  nginx-basic:
    image: nginx:stable-alpine
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /path/to/nginx.conf:/etc/nginx/nginx.conf
      - /path/to/nginx/certs:/etc/nginx/certs
  dokuwiki:
    image: "bitnami/dokuwiki:latest"
    restart: always
    volumes:
      - /path/to/dokuwiki_data:/bitnami/dokuwiki
  blog:
    image: nginx:stable-alpine
    container_name: blog
    restart: always
    volumes:
      - /path/to/blog_data:/usr/share/nginx/html

networks:
  default:
    name: nginx-proxy

nginx的配置 #

用的是nginx-proxy,看一下能懂。注意上面的events {},第一次配置不生效就是因为这玩意儿,不然一次就成了。如果不加,会报错:

nginx: [emerg] no “events” section in configuration

从配置可以看到几个优点:

  1. 不用再考虑给各服务分配什么服务器端口了,每个容器端口独立,爽得很。
  2. 内部不需要IP,直接使用服务名传递消息,容易部署了。
  3. 对外的接口完全可控,内部接口不对外,安全性杠杠的。

Nginx常用配置如下。现在遇到问题不用去查了,chatgpt能够快速给出答案,比网上的答案准多了。

events {}
http {
  # 跳转链接
    server {
        listen 80;
        listen 443;
        server_name duxy.cc;

        location / {
            return 301 http://kd.duxy.cc$request_uri;
        }
    }
  # 多域名反向代理
    server {
      listen 80;
      listen 443;
      server_name imag.duxy.cc v3.imag-njust.net;
      location / {
        proxy_pass http://imag:80;
      }
    }
  # https配置
    server {
      listen 80;
      listen 443;
      server_name wiki.duxy.cc;
      location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://wikitten:80;
      }
    }
}