docker配置nginx(openresty)
前言
记录一下配置docker下安装配置nginx,方便以后查看,服务器在新加坡,系统Centos8,国内服务器可能会有网络问题,望周知
安装docker
curl -fsSL get.docker.com | bash
设置开机自启systemctl enable docker
,启动:systemctl restart docker
安装nginx
搞到默认NGINX配置
容器是有默认配置文件的,但是映射之后容器内映射的那个路径就会被宿主机文件的目录顶替,所以从容器内把默认的配置文件先放到宿主机要映射的目录内。这个默认配置文件主要是做一个模板,为了方便之后的配置直接在模板上修改。
镜像不存在会自动从hub拉取最新镜像,所以直接操作,无需事先拉取镜像。此处先运行一个临时容器
docker run --name tmp-nginx-container -d openresty/openresty:alpine
复制出来默认的配置文件。nginx默认会扫描/etc/nginx/conf.d目录内的.conf结尾的配置文件,默认default.conf配置文件也在/etc/nginx/conf.d下。此处直接把容器的/etc/nginx目录复制到了宿主机的/etc/下。
docker cp tmp-nginx-container:/etc/nginx /etc/
删除临时容器
docker rm -f tmp-nginx-container
运行容器
此处启动了一个名字是nginx
,映射路径/etc/nginx
(存放配置文件),/home/www
(存放网站文件),且网络状态为host(和宿主机共享网络,省去映射端口),后台运行,镜像为openresty/openresty:alpine
的容器
docker run --name nginx -v /etc/nginx:/etc/nginx -v /home/www:/home/www --network host -d openresty/openresty:alpine
如果正常此时直接在浏览器输入服务器ip地址是能打开默认页面的
域名A记录解析
域名控制台A记录解析到服务器。
网站配置
此处假设要建的网站域名是xxx.com
创建网站目录
创建一个目录存放网站文件,之前映射/home/www就是为了存放文件,所以就在里面建目录,目录名字以网站域名为佳,以后多站便于区分
mkdir /home/www/xxx.com
nginx配置文件修改
先复制一份默认的配置文件为我们网站的配置文件,此处也是以域名为文件名为佳,便于区分。文件以conf结尾
cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/xxx.com.conf
然后修改/etc/nginx/conf.d/xxx.com.conf
修改内容如下两处,server_name改成你的域名,root改成你的创建的网站文件目录
重启ngixndocker restart nginx
,此时浏览器输入你的域名,就会有显示了,不过因为没有网站文件,所以显示403
创建一个默认网页
vi /home/www/xxx.com/index.html
把下面内容粘贴上去就显示内容了不显示403了
<pre><?php
echo 'Hello, World!';</pre>
ssl配置
这里使用acme.sh做免费、自动续期的证书
域名解析
除了解析你的A记录到你的IP,还得再解析CAA记录为:0 issue "letsencrypt.org"
,因为acme默认使用zerossl那个搞证书,我搞不下来懒得深究,就切回Let's Encrypt
了,使用Let's Encrypt
就得有这个解析
安装acme
注意命令行中邮箱换成你自己使用的,主要是域名快过期的时候发邮件通知的curl https://get.acme.sh | sh -s email=xxxx.xxx@gmail.com
修改申请目标
acme默认使用zerossl,此处改成letsencrypt
acme.sh --set-default-ca --server letsencrypt
如果执行报错命令未找到,就退出重新登陆ssh刷新环境变量。
申请证书
先给网站目录授权,防止acme.sh无法把验证文件放进去
chmod 755 /home/www/xxx.com/
-d是域名,--webroot是网站目录
acme.sh --issue -d xxx.com --webroot /home/www/xxx.com/
配置证书
输出证书文件
证书申请下来了,但证书文件不能直接用,需要使用acme把文件输出出来才可以。
把证书文件输出到一个容器nginx能读到目录下,前面这个映射了/etc/nginx目录,所以直接在/etc/nginx目录下放东西等同于直接放容器里面的,所以创建一个目录准备存放证书,目录名也是以域名为佳,便于区分
mkdir -p /etc/nginx/ssl/xxx.com
输出证书,-d是域名--reloadcmd是证书重新申请之后要执行什么命令,此处是重启nginx容器来让重新读取证书
acme.sh --install-cert -d xxx.com --key-file /etc/nginx/ssl/xxx.com/key.pem --fullchain-file /etc/nginx/ssl/xxx.com/cert.pem --reloadcmd "docker restart nginx"
这样他会生成配置文件,acme会在每天00:39读取配置文件,快过期的就自动重新申请证书并按照配置输出证书文件并执行设置的--reloadcmd命令
配置nginx文件
编辑网站配置文件。就是/etc/nginx/conf.d/xxx.com.conf
内容如下
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
ssl_certificate /etc/nginx/ssl/xxx.com/cert.pem;
ssl_certificate_key /etc/nginx/ssl/xxx.com/key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
add_header Strict-Transport-Security max-age=15768000;
ssl_stapling on;
ssl_stapling_verify on;
简单粗暴直接加在listen 80;和server_name xxx.com;之间,其中ssl_certificate和ssl_certificate_key指向证书文件位置。
如图
保存之后重启nginx:docker restart nginx
,就能以https打开网站了