本文只讨论Ubuntu

安装 Nginx

如果还未安装 Nginx,可以通过以下命令进行安装

# Ubuntu/Debian
sudo apt update
sudo apt install nginx

# CentOS/RHEL
sudo yum install epel-release
sudo yum install nginx

安装 Certbot

Certbot 用来自动申请和更新 SSL 证书,这也是为了 HTTPS。

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

修改创建并修改Nginx配置文件

# 创建 Nginx 配置文件:
cd /etc/nginx/sites-enabled

sudo touch config
# 使用 vim 编辑配置文件:
sudo vim ./config
添加

server{
    server_name <domain>;

    location / {
        client_max_body_size  64m;
        proxy_http_version 1.1;
        proxy_pass http://localhost:<port>;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Accept-Encoding gzip;
    }
}

注意要将上面的 <domain>​ 和 <port>​ 替换为实际的域名和端口号。

对于使用了 WebSocket 的应用,我们可能还需要设置更长的超时时间:

proxy_read_timeout 300s;
proxy_send_timeout 300s; 

编辑好之后保存(:wq!​),继续下面的流程:

# 使用 certbot 获取 SSL 证书:
sudo certbot --nginx
# 按照提示选择即可。
# 之后使用 vim 再次编辑配置文件。
sudo vim ./config
# 我们会发现配置文件此时已经加入了 SSL 相关内容。
# (可选)启用 HTTP2:
# 在配置文件内,把 
listen 443 ssl; # managed by Certbot 
# 改为:
listen 443 ssl http2; # managed by Certbot 
# 之后重启 Nginx:
sudo service nginx restart

至此,大功告成,SSK应该已经生效,添加替换访问的http为https即可。

对于配置子域名SSL的情况,我们也可以使用certbot来生产

在当前文件夹下输入

certbot certonly -d *.使用自己的域名替换.com -d 使用自己的域名替换.com --manual --preferred-challenges dns

certonly: 这个子命令表示只获取证书,而不会自动安装或配置它。
-d *.使用自己的域名替换.com: 这个参数指定了你要获取证书的域名,其中*.使用自己的域名替换.com表示获取一个通配符证书,适用于该域名下的所有子域名。
-d 使用自己的域名替换.com:这个参数是将主域名也加入到证书中,否则会导致子域名正常了,主域名提示证书不合法。
--manual: 这个参数表示手动模式。在手动模式下,你需要按照指示手动完成一些步骤,例如DNS验证。
--preferred-challenges dns: 这个参数指定了首选的验证方式为DNS验证。DNS验证需要你在你的DNS管理后台添加一个TXT记录来验证你对域名的所有权。

certbot certonly -d *.by2tech.com -d by2tech.com --manual --preferred-challenges dns

输入后会要求你在域名解析中加入txt记录类型,并且地址已经打印出来了

imageimage

之后证书就生成完毕了,并且有效期为三个月

image

配置SSL证书

配置主、子域名使用SSL证书并监听443端口

#主域名
server {
    server_name xx.com;
    client_max_body_size 1024m;
    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; 
	ssl_certificate /etc/letsencrypt/live/{你证书所在的位置}/fullchain.pem; 
	ssl_certificate_key /etc/letsencrypt/live/{你证书所在的位置}/privkey.pem; 

	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

	ssl_session_cache shared:le_nginx_SSL:10m;
	ssl_session_timeout 1440m;
	ssl_session_tickets off;

	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_prefer_server_ciphers off;

	ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

  location / {
    proxy_pass http://127.0.0.1:8090;
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Upgrade $http_upgrade;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header Accept-Encoding gzip;
  }
}
#子域名1
server {
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; # 

    ssl_certificate /etc/letsencrypt/live/{你证书所在的位置}/fullchain.pem; 
	ssl_certificate_key /etc/letsencrypt/live/{你证书所在的位置}/privkey.pem; 

	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

	ssl_session_cache shared:le_nginx_SSL:10m;
	ssl_session_timeout 1440m;
	ssl_session_tickets off;

	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_prefer_server_ciphers off;

	ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

    server_name xx.xxx.com;
    client_max_body_size 1024m;
  location / {
    proxy_pass http://127.0.0.1:3501;
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Upgrade $http_upgrade;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header Accept-Encoding gzip;
  }
}

配置http跳转至https

在当前目录下
vim http
加入配置来强制跳转,并将无效地址返回404

server {
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    }

  listen 80;
	#支持ipv6访问
  listen [::]:80;
  return 404; 

}

之后执行nginx -s reload​ 访问网站即可进入