📚 开源资源分享——颜佐光的个人书架
✉️ 联系站长
书架 / docker / nginx

Docker 环境下配置多域名 SSL

2017-10-18 16:55 · 约 3,681 字 · 浏览 3,068 次 · 更新 2020-05-06 14:44nginx

服务器介绍:

  • 服务器配置:aliyun最低配:CPU: 1核 内存: 1024 MB 1Mbps(峰值)
  • 服务器环境:centos 7.0,暂时只安装了 docker 和 nginx 1.10

构想:

  • 通过宿主的 nignx 根据域名进行分发,分发至不同的 docker 实例。
  • 具体参考 docker搭建nginx配置多域名以及多端口号
  • 尝试使用多种不同的方式对不同的子域名进行 HTTPS 配置,1>阿里云本身的免费证书,2> Let's Encrypt 免费证书
  • 域名为 auww.me,域名的解析类型为泛解析,即 *.auww.me 均指向我的阿里云服务器

一. 通过端口区分(已实现)

  1. 具体项目 http://git.oschina.net/auwaiyung/docker_lnmp_example , 使用方法在项目的 README.md
  2. ps: checkout 后,需要稍微修改一下 docker-composer.yml 的端口部分,docker容器不可同时映射到宿主的同一个端口,会冲突。
  3. 具体访问url: http://www.auww.me:81/phpinfo.php, http://www.auww.me:82/phpinfo.php
  4. pps: 修改过配置后,一定要重新build,然后使用 down 和 up 来重启,restart 重启不生效。

二. 考虑实际

  1. 首先,先不可能让用户提前知道你除了开放80端口外,还有没有别的端口开放访问。再者,即便是知道,应该也没有多少人愿意在链接上带上端口号,因为这看起来就很非主流很山寨。
  2. 具体想法:通过宿主机的nginx进行分发
server {
    server_name wordpress.auww.me
    listen 80;

    location / {
        proxy_redirect off;
        # 真实 ip
        proxy_set_header X-Real-IP $remote_addr;
        # 真实 ip
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 真实的 host
        proxy_set_header Host $host;
        # 转发
        proxy_pass http://www.auww.me:81;
    }
}
  1. 初级想法实现,根据域名分到不同的docker容器也可实现,但是其中发现有点问题
    - 由于使用 wordpress 作为 demo 项目,可是wordpress大量使用了 $_SERVER 变量。这导致 proxy_pass 前后的变量不一致.
    解决方法:可以通过 proxy_set_header REQUEST-URI $request_uri; 或 fastcgi_param REQUEST_URI $http_request_uri; # set in the nginx config on the host 进行实际的设置,适配项目的需要
    - 由于希望域名 http://wordpress.auww.me 直接就是 wordpress 项目,可是实际上是有访问 phpmyadmin 管理 MySQL 的需要,又不想通过 http://www.auww.me:[port]/phpMyAdmin 的形式进行访问。主要是通过location{} 来实现这个功能。这里,也有两个方向:
    - 对宿主机nginx进行配置
    - 对容器的nginx进行配置

  2. 第一个实现如下:感觉,第一个的实现比第二个还是有点优点的:
    - 修改 location 方便,以防我哪天心血来潮,想改点什么东西,可以立即生效。如果写在容器的config,需要重新 build,然后down,然后up,才可以生效。
    - 由于写在容器里面,每一项的更改需要需要重新 build,然后down,然后up,才可以生效。对于我在尝试搭建的时候,实在是十分不友好。故,先使用第一个,第二个再挖坑。等未来有机会补上。
    故将nginx 的 conf 设置成如下

# /etc/nginx/conf.d/wordpress.conf
server {
    server_name wordpress.auww.me
    listen 80;

    #proxy_redirect off;
    #proxy_set_header X-Real-IP $remote_addr;
    #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #proxy_set_header Host $host;

    location / {
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header REQUEST-URI $request_uri;
        proxy_pass http://www.auww.me:81/wordpress/;
    }

    location ^~ /phpMyAdmin/ {
       proxy_pass http://www.auww.me:81/phpMyAdmin/;
    }
}

使匹配 /phpmyadmin/ 的跳转到 http://www.auww.me:[port]/phpMyAdmin/ 里面去,然后其余的就直接指向 http://www.auww.me:81/wordpress/。

pps: proxy_set_header 这个命令,只要在 location 里面设置一条,server 里面的 proxy_set_header 都会失效,失效,失效。

  • 另附上容器的nginx配置
    fastcgi_param REQUEST_URI $http_request_uri; 这个就是根据wordpress 的需要设置的参数,参数来源于宿主nginx的设置。如果不设置的话,进入 wordpress (domain.com/wp-admin)的管理后台,会被 wordpress 处理成 domain.com/wordpress/wp-admin
# /home/au/docker/wordpress/project/nginx/sites-enabled/default.config
server {
    listen   80 default;
    index index.html index.htm;
    server_name wordpress.auww.me;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ /index.html;
    }

    location ~ \.php {
        include fastcgi_params;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        #fastcgi_param  URIA $uri;
        #fastcgi_param  REQUEST_URIA $request_uri;
        fastcgi_param  REQUEST_URI $http_request_uri;     # set in the nginx config on the host
        fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
    }
}
← 返回《docker》目录书架 →