快速启动一个Nginx的https服务器

2023 年 10 月 30 日 星期一(已编辑)
/
26
1
摘要
这篇文章描述了如何在具有强制开启HSTS的.dev域名上配置Nginx来提供HTTPS服务,并使用CloudFlare的API Key申请和安装SSL证书。
这篇文章上次修改于 2023 年 10 月 30 日 星期一,可能部分内容已经不适用,如有疑问可询问作者。

快速启动一个Nginx的https服务器

因为我的域名“yuzi.dev”是强制开启了 HSTS 的 dev 域名,所以时常需要面对 https 问题,故以此文来记录这个过程。

启动 Nginx

这里使用 docker 启动,docker 安装不再赘述。 创建一个文件夹,以~/nginx 为例,在其中创建docker-compose.yml

version: "3.8"
services:
  nginx:
    image: nginx:stable
    container_name: nginx-web
    hostname: nginx-web
    restart: always
    ports:
      - 23333:23333  #此处填写想要暴露的端口
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./cert:/etc/nginx/cert

随后在同一目录创建nginx.conf,内容如下:

worker_processes 1;

events {
  worker_connections 1024;
}

http {
  #http 全局块
  include mime.types;
  default_type application/octet-stream;
  sendfile on;

  server {
    listen 23333;  #要暴露的地址
    server_name server.blog.yuzi.dev;

    #增加 ssl
    ssl on;
    ssl_certificate cert/cert.crt;
    ssl_certificate_key cert/cert.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;

    ssl_protocols SSLv2 SSLv3 TLSv1.2;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Range $http_range;
      proxy_set_header If-Range $http_if_range;
      proxy_redirect off;
      proxy_pass http://172.17.0.1:2333;  #转发到的地址,一般容器内访问主机的地址是 172.17.0.1
      # the max size of file to upload
      client_max_body_size 20000m;
    }
  }
}

如果要转发多个地址,视情况复制 server 块(不同的端口)或不同的 location(覆写路径)

申请证书,以 CloudFlare 为例

我们使用 acme.sh 来申请,一键安装:

curl  https://get.acme.sh | sh

这会把 acme 安装到家目录的.acme.sh文件夹中。 安装好后,cd ~/.acme.sh 进入目录, 随后在环境变量中填入 cf 的 api key

export CF_Key="cloudflare中查看你的APIkey"
export CF_Email="你的邮箱"
./acme.sh  --issue  --dns dns_cf -d 你的域名

安装证书并重启 nginx

./acme.sh --installcert -d 你的域名 --keypath ./cert/cert.key  --fullchainpath ./cert/cert.crt
mv ./cert ~/nginx

随后重启,测试是否有 https

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...