首先感谢两位大佬的文章
docker安装nginx并配置https-腾讯云开发者社区-腾讯云 (tencent.com)
NGINX缓存详解(二)之服务端缓存 - 知乎 (zhihu.com)
安装nginx并且配置HTTPS域名
第一步安装nginx
输入命令
docker run -d -p 80:80 -p 443:443 --name nginx -v /home/ubuntu/nginx/web:/usr/share/nginx/html -v /home/ubuntu/nginx/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/ubuntu/nginx/nginx/conf.d:/etc/nginx/conf.d -v /home/ubuntu/nginx/nginx/logs:/var/log/nginx -v /home/ubuntu/nginx/nginx/ssl:/etc/nginx/ssl nginx
docker run -d
端口号 -p 80:80 -p 443:443
容器名称 --name nginx
web目录 -v /home/ubuntu/nginx/web:/usr/share/nginx/html
配置目录 -v /home/ubuntu/nginx/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
配置目录 -v /home/ubuntu/nginx/nginx/conf.d:/etc/nginx/conf.d
日志 -v /home/ubuntu/nginx/nginx/logs:/var/log/nginx
https证书 -v /home/ubuntu/nginx/nginx/ssl:/etc/nginx/ssl
缓存临时存储 -v /home/ubuntu/nginx/nginx/temp:/usr/share/temp
缓存 -v /home/ubuntu/nginx/nginx/cache:/usr/share/cache nginx镜像名称 nginx
其中web目录、缓存临时存储、缓存是本环节不需要的,可加可不加
要注意的是,挂载的目录 也就是-v后面 :前面的文件路径,是需要自己提前创建好的
其中 第一个配置目录nginx.conf是文件,其他的都是文件夹
检查没问题之后就可以执行命令了,会返回一个容器ID
第二步配置nginx
我这里的目录是/home/ubuntu/nginx/nginx/conf/nginx.conf,直接用xftp拖出来用多文本编辑器打开
复制代码进去
events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; server { #listen 80; # 监听80端口 listen 443 ssl; #侦听443端口,用于SSL # 这里填写你自己的域名,域名需要购买,去各个云平台有很便宜的 10块钱一年 server_name xxx.com www.xxx.com; # 这里填写你的证书名称 证书需要去云平台自己下载,方式为Nginx,之后会有一个压缩包解压 # /etc/nginx/ssl/后缀名为.crt的文件 ssl_certificate /etc/nginx/ssl/xxx.crt; # /etc/nginx/ssl/后缀名为.key的文件 ssl_certificate_key /etc/nginx/ssl/xxx.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; client_max_body_size 1024m; 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; # 这里填写你对应的服务,例如我的后端服务端口是8888,就IP:8888就可以 proxy_pass http://www.xxx.com:8888/; } } server { listen 80; # 监听80端口 server_name xxx.com www.xxx.com; # 绑定证书的域名 #把http的域名请求转成https return 301 https://$host$request_uri; } }
将你下载的证书文件 复制到 刚才挂载的目录下
例如我的就放在/home/ubuntu/nginx/nginx/ssl/文件夹下面
第三步重启容器
输入命令就可以 docker restart nginx
填写nginx的原因是之前创建容器时 容器的name是nginx
重启之后 直接访问https://你的域名/,就可以跳转到你代理的服务里面了
nginx静态资源缓存配置
第一步准备两个nginx,第一台A用于请求文件,第二台B用于存放文件
例如 A请求静态资源,先检查是否有缓存,没有缓存则会去获取B的资源
1)先创建A(创建容器 ,根据上面的参数和你自身的需求来填写,不要无脑复制!)
输入命令
docker run -d -p 8080:8080 --name nginxA -v /home/ubuntu/nginxA/web:/usr/share/nginx/html -v /home/ubuntu/nginxA/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/ubuntu/nginxA/nginx/conf.d:/etc/nginx/conf.d -v /home/ubuntu/nginxA/nginx/logs:/var/log/nginx -v /home/ubuntu/nginxA/nginx/temp:/usr/share/temp -v /home/ubuntu/nginxA/nginx/cache:/usr/share/cache nginx
这里的参数可以参考上面,如果重复了 一定要修改文件位置
2)配置A
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
proxy_temp_path /usr/share/temp;
#用于指定本地目录来缓冲较大的代理请求
proxy_cache_path /usr/share/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#设置web缓存区名为cache_one,内存缓存空间大小为200m,自动清除超过1天没有被访问过的缓存数据,硬盘缓存空间大小30g
server {
listen 8080;
server_name localhost;
client_max_body_size 100m;
#location ~ ^/profile/(.*).(gif|jpg|jpeg|png)$
location /profile
{
#请求方IP地址(这里填写B的服务地址就可以)
proxy_pass https://xxx.xxx.xxx:8081;
# 指定上面设置的缓存区域
proxy_cache cache_one;
#对响应状态码为200 302的响应缓存100s
proxy_cache_valid 200 302 100s;
#对响应状态码为404的响应缓存200
proxy_cache_valid 404 200s;
#请求参数带有nocache或者comment时不使用缓存
proxy_cache_bypass $arg_nocache $arg_comment;
#忽略被代理服务器设置的"Cache-Control"头信息
proxy_ignore_headers "Cache-Control";
#对GET HEAD POST方法进行缓存
proxy_cache_methods GET HEAD POST;
#当缓存过期时,当构造上游请求时,添加If-Modified-Since和If-None-Match头部,值为过期缓存中的Last-Modified值和Etag值。
proxy_cache_revalidate on;
#当被代理服务器返回403时,nginx可以使用历史缓存来响应客户端,该功能在一定程度上能能够为客户端提供不间断访问
proxy_cache_use_stale http_403;
#默认开启,开启代理缓冲区(内存)
proxy_buffering on;
#设置响应头的缓冲区设为20m
proxy_buffer_size 20m;
#设置网页内容缓冲区个数为8,单个大小为20m
proxy_buffers 8 20m;
#设置当nginx还在读取被代理服务器的数据响应的同时间一次性向客户端响应的数据的最大为20m
proxy_busy_buffers_size 20m;
#临时文件最大为1024m
proxy_max_temp_file_size 1024m;
#设置一次往临时文件的大小最大为20m
proxy_temp_file_write_size 20m;
#设置临时文件存放目录
proxy_temp_path /usr/share/temp;
#设置和被代理服务器连接的超时时间为60s
proxy_connect_timeout 60;
#设置向被代理服务器发送请求的超时时间为60s
proxy_send_timeout 60;
#设置从被代理服务器读取响应的超时时间为60s
proxy_read_timeout 60;
#添加缓存状态参数,方便测试是否命中缓存
add_header cache $upstream_cache_status;
}
}
}
配置好之后 重启容器即可,这个配置会监听8080端口下带/profile的请求,例如IP:8080/profile会去先寻找缓存,没有缓存就回去寻找服务B
3)创建B(创建容器 ,根据上面的参数和你自身的需求来填写,不要无脑复制!)
docker run -d -p 8081:8081 --name nginxB -v /home/ubuntu/nginxB/web:/usr/share/nginx/html -v /home/ubuntu/nginxB/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/ubuntu/nginxB/nginx/conf.d:/etc/nginx/conf.d -v /home/ubuntu/nginxB/nginx/logs:/var/log/nginx nginx
4)配置B
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 8081;
server_name localhost;
#location ~ ^/profile/(.*).(gif|jpg|jpeg|png)$
location /profile {
add_header X-Accel-Expires 200; #通知代理服务器缓存200s
alias /usr/share/nginx/html/ ;
}
}
}
配置好之后 重启容器即可