在《打造个人写作系统》中,部署的服务都是http的,然后使用群晖提供的反向代理配置的https
,其实群晖内部使用的也是nginx
,是不是可以通过docker部署nginx,并配置https
呢?
一、安装配置nginx
安装配置nginx,主要是把nginx默认的配置拷贝出来,并且创建容器时,指定配置文件映射;
1.1 拉取镜像
可以指定版本,也可以使用默认的最新版本。
docker pull nginx
1.2 创建映射配置目录
这里是把docker相关的数据放在了/mnt/nvme0n1p1/docker/data
目录下,当然大家可以根据自己的需要来设置,为了方便后续的目录操作,这里定义一个NGINX_DIR
。
NGINX_DIR=/mnt/nvme0n1p1/docker/data/nginx
mkdir -p $NGINX_DIR
cd $NGINX_DIR
mkdir html logs cert
1.3 启动临时nginx
docker run -d --name nginx_tmp nginx
1.4 拷贝容器的挂载文件
docker cp nginx_tmp:/etc/nginx $NGINX_DIR
mv $NGINX_DIR/nginx $NGINX_DIR/conf
docker cp nginx_tmp:/usr/share/nginx/html/index.html $NGINX_DIR/html
1.5 删除临时镜像
docker rm -f nginx_tmp
1.6 创建nginx
nginx
容器可以选择host
网络或者默认的bridge
网络,最简单的区别是bridge
网络要指定接口映射,比如后续nginx中增加了对其他端口的监听,也需要在端口映射中进行添加。
- 使用host网络
docker run -d \
--name=nginx \
--restart=unless-stopped \
--network=host \
-v $NGINX_DIR/html:/etc/nginx/html \
-v $NGINX_DIR/logs:/var/log/nginx \
-v $NGINX_DIR/conf:/etc/nginx \
-v $NGINX_DIR/cert:/etc/nginx/cert \
nginx
- 指定端口的方式
docker run -d \
--name=nginx1 \
--restart=unless-stopped \
-p 5195:5195 \
-v $NGINX_DIR/html:/etc/nginx/html \
-v $NGINX_DIR/logs:/var/log/nginx \
-v $NGINX_DIR/conf:/etc/nginx \
-v $NGINX_DIR/cert:/etc/nginx/cert \
nginx
二、反向代理配置
要达到的效果非常简答,就是把监控到的HTTPS
请求转发到另一台主机提供的HTTP
服务,并且配置ssl证书。
2.1 上传文件到cert
目录
可以通过scp
或桌面文件操作等方式,把ssl
证书上传到证书目录。
ls -R $NGINX_DIR/cert
/mnt/nvme0n1p1/docker/data/nginx/cert:
69d1128d_zwenkai.com_nginx
/mnt/nvme0n1p1/docker/data/nginx/cert/69d1128d_zwenkai.com_nginx:
zwenkai.com.key zwenkai.com.pem
2.2 添加反响代理配置
- 在
nginx.conf
配置文件中最后添加,include sites-enabled/*;
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
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;
#gzip on;
include /etc/nginx/conf.d/*.conf;
include sites-enabled/*;
}
- 创建
sites-enabled
文件夹以及反响代理配置文件
mkdir $NGINX_DIR/conf/sites-enabled
cd $NGINX_DIR/conf/sites-enabled
touch server.ReverseProxy.conf
- 在
server.ReverseProxy.conf
添加配置
server {
listen 5195 ssl;
listen [::]:5195 ssl;
server_name www.zwenkai.com;
if ( $host !~ "(^www.zwenkai.com$)" ) { return 404; }
ssl_certificate_key /etc/nginx/cert/69d1128d_zwenkai.com_nginx/zwenkai.com.key;
ssl_certificate /etc/nginx/cert/69d1128d_zwenkai.com_nginx/zwenkai.com.pem;
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload" always;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
location / {
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_intercept_errors off;
proxy_http_version 1.1;
proxy_set_header Host $http_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-Proto $scheme;
proxy_pass http://192.168.2.115:28168;
}
error_page 403 404 500 502 503 504 /dsm_error_page;
location /dsm_error_page {
internal;
root /usr/syno/share/nginx;
rewrite (.*) /error.html break;
allow all;
}
}
三、其他说明
当然内网穿透也要穿透到这台设备上,之后网站就可以正常访问了。
原创文章,作者:Kevin,如若转载,请注明出处:https://zwenkai.com/migrate-response-proxy-to-nginx-in-docker/