为Confluence添加Nginx反向代理

由于公司内网不仅仅会用到Confluence,未来还会部署JIRA、GitLab、Jenkins、SonarQube等团队协作和CI/CD工具,并且会通过VPN开放给其他办公场所使用,因此有必要搭建一套反向代理系统,将这些工具隐藏在反向代理后方,这样不仅可以提高安全性,也方便域名和IP的管理。本文将选用Nginx作为反向代理服务器,在开始搭建之前,请先按照《容器化部署和破解Confluence知识库》搭建知识库服务器。

一、环境配置

  1. 操作系统
    版本:Deepin GNU/Linux 15.11
  2. Docker
    版本:Docker version 19.03.5, build 633a0ea838
    安装方式:《Get Docker Engine – Community for Debian
  3. Confluence
    版本:7.2.1
    安装方式:《容器化部署和破解Confluence知识库
  4. Nginx
    版本:1.17.9
    安装方式:容器化

二、获取Nginx配置文件

如果使用官方的Nginx镜像,推荐使用只读的方式来部署Nginx容器,但这样就无法在容器内部修改配置文件了。因此,本文将运行一个临时的Nginx容器,然后将配置目录从容器中拷贝到宿主机。

打开两个终端,假设名称分别是A和B,在A终端运行以下命令:

# 运行临时的Nginx容器
docker run -it --rm --name temp-nginx nginx:1.17.9 /bin/bash

然后,在B终端运行以下命令:

cd ~/Downloads
docker cp temp-nginx:/etc/nginx ./

最后,在A终端中退出临时的Nginx容器:

exit

此时,Nginx的配置文件就已经复制到宿主机中了,稍后会将配置目录作为外部存储卷挂载到Nginx容器之中。

三、部署Nginx容器

本文会将Nginx的缓存、运行时、日志和配置目录作为外部存储卷挂载至Nginx容器,在shell中运行以下命令,创建这些目录:

sudo mkdir -pv /var/lib/nginx/{cache,run,log,conf}

然后,将前文从临时容器获取的配置文件,移动至Nginx的配置目录:

sudo mv nginx/* /var/lib/nginx/conf/

最后,以只读方式部署Nginx容器,将必要的目录作为外部存储卷挂载至容器,并且公开HTTP和HTTPS端口:

docker run --detach \
           --restart=always \
           --name nginx \
           --hostname nginx \
           --volume /etc/localtime:/etc/localtime:ro \
           --volume /etc/timezone:/etc/timezone:ro \
           --volume /var/lib/nginx/cache:/var/cache/nginx \
           --volume /var/lib/nginx/run:/var/run \
           --volume /var/lib/nginx/log:/var/log/nginx \
           --volume /var/lib/nginx/conf:/etc/nginx \
           --publish 80:80 \
           --publish 443:443 \
           --read-only \
           nginx:1.17.9

四、设置反向代理

新建confluence.conf文件,配置confluence的反向代理:

sudo touch /var/lib/nginx/conf/conf.d/confluence.conf

confluence.conf文件的内容,如下所示:

server {
    listen       80;
    server_name  <domain-name>;


    location / {
            try_files $uri @confluence;
    }


    location @confluence {
            internal;
            proxy_pass http://<container-ip-address>:8090;
            proxy_connect_timeout 30s;
            proxy_send_timeout 120;
            proxy_read_timeout 120;
            proxy_buffer_size 32k;
            proxy_buffers 4 32k;
            proxy_busy_buffers_size 64k;
            proxy_redirect off;
            proxy_hide_header Vary;
            proxy_set_header Accept-Encoding '';
            proxy_set_header Host $host;
            proxy_set_header Referer $http_referer;
            proxy_set_header Cookie $http_cookie;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 100m;
    }
}

注意:

  • 请用实际的知识库域名来替换,确保域名能够解析成Nginx宿主机的IP地址;
  • 请用实际的confluence容器的IP地址来替换;
  • 确保client_max_body_size参数值和Confluence支持的附件大小一致,否则上传附件可能会出现HTTP 413错误。

最后,重启Nginx容器:

docker restart nginx

五、测试验证

在浏览器中访问http://,输入用户名/密码,即可通过Nginx反向代理访问Confluence知识库了,如下图所示:

登录Confluence控制台