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地址是能打开默认页面的
default-site.png

域名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改成你的创建的网站文件目录
nginx-webconfig.png

重启ngixndocker restart nginx,此时浏览器输入你的域名,就会有显示了,不过因为没有网站文件,所以显示403

创建一个默认网页

vi /home/www/xxx.com/index.html

把下面内容粘贴上去就显示内容了不显示403了

<pre>&lt;?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指向证书文件位置。
如图
sslconfig.png

保存之后重启nginx:docker restart nginx,就能以https打开网站了

新评论

称呼不能为空
邮箱格式不合法
网站格式不合法
内容不能为空