Docker 部署 Nginx 并在容器内配置申请免费 SSL 证书

文章目录

docker

bash 复制代码
docker pull nginx:1.27

注: 国内网络原因无法下载镜像,nginx 镜像文件下载链接 https://pan.baidu.com/s/1O35cPbx6AHWUJL1v5-REzA?pwd=yjsv 提取码: yjsv

  • 导入 nginx 镜像
bash 复制代码
docker load -i nginx-1.27.tar
  • 创建缩主机目录
bash 复制代码
cd /home
mkdir nginx && cd nginx
mkdir ssl logs
  • 拷贝容器内目录与文件
bash 复制代码
docker run --name nginx -d nginx:1.27
# 拷贝容器内目录与文件
docker cp nginx:/etc/nginx/nginx.conf /home/nginx
docker cp nginx:/etc/nginx/conf.d /home/nginx
docker cp nginx:/usr/share/nginx/html /home/nginx

docker-compose.yml

yml 复制代码
services:
  nginx:
    image: nginx:1.27
    container_name: nginx
    restart: always
    # network_mode: "host"
    ports:
      - 8080:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /home/nginx/conf.d:/etc/nginx/conf.d
      - /home/nginx/ssl:/etc/nginx/ssl
      - /home/nginx/logs:/var/log/nginx
      - /home/nginx/html:/usr/share/nginx/html
bash 复制代码
docker-compose up -d nginx
  • 查看 80 端口被占用情况
bash 复制代码
# Linux 环境
netstat -tulpn | grep :80
# Mac 环境
sudo lsof -iTCP -sTCP:LISTEN -n -P | grep LISTEN | grep ":80"

申请免费 SSL 证书

  • 配置 Nginx 以验证域名所有权
bash 复制代码
cd /home/nginx/conf.d
vim default.conf
bash 复制代码
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
	
    # 配置 Nginx 验证域名所有权
    location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root /usr/share/nginx/html; 
    }
}
  • 重新加载 nginx 配置
bash 复制代码
# 进入容器
docker exec -it nginx /bin/bash
# 测试配置
nginx -t
# 重新加载配置
nginx -s reload
bash 复制代码
# 或直接执行命令
docker exec nginx nginx -v
docker exec nginx nginx -t
docker exec nginx nginx -s reload

注意: 以下所有操作均在容器内执行。

bash 复制代码
apt-get update
apt-get install -y git socat cron vim
bash 复制代码
# 下载源码
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
# 查看帮助
./acme.sh -h
# 安装 acme.sh
./acme.sh --install -m xxxxxxxx@qq.com
# 查看 acme.sh 更新证书任务
crontab -l

注: 目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心。

  • 域名所有权完成验证后将自动生成证书
bash 复制代码
./acme.sh --issue -d mydomain.com -w /usr/share/nginx/html
  • 生成 SSL 证书
bash 复制代码
./acme.sh --install-cert -d mydomain.com \
--key-file       /etc/nginx/sslmydomain.com.key  \
--fullchain-file /etc/nginx/sslmydomain.com.pem
  • 修改配置文件,添加 SSL 证书配置
bash 复制代码
cd /home/nginx/conf.d
vim default.conf
bash 复制代码
server {
    listen        80;
    server_name   mydomain.com;
    rewrite ^(.*) https://mydomain.com$1 permanent;
}

server {
    listen       443 ssl;
    server_name  mydomain.com;
    
    # 配置 SSL 证书
    ssl_certificate /etc/nginx/ssl/sslmydomain.com.pem;
    ssl_certificate_key /etc/nginx/ssl/sslmydomain.com.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;

    client_max_body_size 20M;
    client_body_buffer_size 128k;
	
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
  • 重新加载 nginx 配置
bash 复制代码
nginx -s reload
  • 查看已安装证书
bash 复制代码
./acme.sh --info -d mydomain.com

请求头参数带下划线

bash 复制代码
cd /home/nginx
vim nginx.conf
bash 复制代码
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;
	  
    # 请求头参数带下划线
    underscores_in_headers on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
相关推荐
tellmewhoisi8 小时前
项目部署docker(指令解析和docker-compose基础指令)
docker·容器
dinl_vin9 小时前
FastAPI 系列 ·(十二):生产部署——Docker + 配置管理(系列完结)
docker·容器·fastapi
難釋懷10 小时前
Nginx-UrlRewrite
运维·nginx
蠢货爱好者11 小时前
Docker基础操作
运维·docker·容器
山人在山上11 小时前
docker zlmediakit 部署
docker·zlmediakit
不像程序员的程序媛12 小时前
nginx日志配置
运维·nginx
hopsky12 小时前
phoenix docker 启动
运维·docker·容器
Nontee16 小时前
Docker基础
docker·容器·eureka
烟雨江南aabb17 小时前
Docker第一弹 Docker是什么?
运维·docker·容器
ai产品老杨17 小时前
解耦异构算力与多协议接入:基于 Docker 与 GB28181 的企业级 AI 视频管理平台架构演进与源码交付实践
人工智能·docker·音视频