docker配置nginx(openresty)
记录一下安装配置docker、docker安装nginx、acme申请证书配置网站
安装docker
国外直装
curl -fsSL get.docker.com | bash
清华源
# 设置下载源
export DOWNLOAD_URL="https://mirrors.tuna.tsinghua.edu.cn/docker-ce"
# 以下二选一执行
# 使用 curl
curl -fsSL https://raw.githubusercontent.com/docker/docker-install/master/install.sh | sh
# 使用 wget
wget -O- https://raw.githubusercontent.com/docker/docker-install/master/install.sh | sh
设置开机自启systemctl enable docker
,启动:systemctl start 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 --log-opt max-size=50m --log-opt max-file=3 --restart always -v /etc/nginx:/etc/nginx -v /home/www:/home/www --network host -d openresty/openresty:alpine
如果正常此时直接在浏览器输入服务器ip地址是能打开默认页面的
建站
此处举例域名xxx.com
域名解析
域名控制台A记录解析到服务器IP
网站配置
创建网站目录
创建一个目录存放网站文件,之前映射/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>
此时一个网站算是建好了
https配置
这里使用acme.sh做免费、自动续期的证书
域名解析
此处还得再解析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
安装完刷新一下让命令可以使用
source ~/.bashrc
修改acme申请证书目标,acme默认使用zerossl,此处改成letsencrypt
acme.sh --set-default-ca --server letsencrypt
申请证书
先给网站目录授权,防止acme无法把验证文件放进去
chmod 755 /home/www/xxx.com/
-d是域名,--webroot是网站目录
acme.sh --issue -d xxx.com --webroot /home/www/xxx.com/
配置证书
输出证书文件
证书申请下来了,但证书文件不能直接用,需要使用acme把文件输出出来才可以,因为输出出来的文件,后面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看到证书快过期就自动重新申请证书并按照配置输出证书文件并执行设置的--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打开网站了