获取证书

acme

申请证书

1
2
3
4
5
6
acme.sh --register-account -m YourEmail
#国内服务器推荐 letsencrypt
acme.sh --set-default-ca --server letsencrypt
#设置命令
echo 'alias acme.sh=~/.acme.sh/acme.sh' >> ~/.bashrc
source ~/.bashrc

腾讯云托管域名

1
2
3
4
#腾讯云token,而不是腾讯云api
export DP_Id=""
export DP_Key=""
acme.sh --issue --dns dns_dp -d aa.com -d *.aa.com

cloudflare托管域名

1
2
3
4
5
6
7
8
9
# Global API申请证书
export CF_Key="" //此处替换成你自己的Key
export CF_Email="" //此处填写你给Cloudflare绑定的邮箱账号
acme.sh --issue --dns dns_cf -d aa.com -d *.aa.com

# 局部API申请证书,需要创建api令牌
export CF_Token=""
export CF_Account_ID=""
export CF_Zone_ID="" //此项非必须,上面两项需要提供

root用户安装证书并自动更新证书

1
2
3
4
acme.sh --installcert -d xxx.com   \
--key-file /etc/nginx/ssl/xxx.key \
--fullchain-file /etc/nginx/ssl/xxx.crt \
--reloadcmd "service nginx reload"

查看修改自动检测时间

1
sudo crontab -e

配置Nginx

通常在/etc/nginx/sites-available下创建配置文件,然后在/etc/nginx/sites-enabled下创建软连接

1
2
3
4
cd /etc/nginx
sudo touch sites-available/demo #创建新配置
sudo rm sites-enabled/default #删除默认配置的链接文件
sudo ln -s sites-available/demo sites-enabled/demo #创建软链接

根据自己的域名等信息将下面内容修改后粘贴到demo文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80;
server_name your_domain.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
server_name your_domain.com;

ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;

# 可选:加密套件和其他 SSL 配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
}

重启Nginx服务

1
2
3
sudo nginx -s reload #重载
sudo service nginx restart
sudo service nginx status #查看运行信息

反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#青龙
server {
#SSL 默认访问端口号为 443
listen 443 ssl; #ipv4
listen [::]:443 ssl; #ipv6
#请填写绑定证书的域名
server_name ql.xxx;
#请填写证书文件的相对路径或绝对路径
ssl_certificate /etc/nginx/ssl/ql.xxx.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /etc/nginx/ssl/ql.xxx.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:5700;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址。

但是,nginx是可以获得用户的真实ip的,也就是说nginx使用$remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx里作一个赋值操作,即:

1
proxy_set_header X-Real-IP $remote_addr;

$remote_addr 只能获取到与服务器本身直连的上层请求ip,所以设置$remote_addr一般都是设置在在第一个代理服务器上。

多级代理时:
比如有时候是通过cdn访问的,那么后面web服务器获取到的,永远都是 cdn 的 ip 而非不是用户ip,那么这个时候就要用到X-Forwarded-For了,这个变量的意思,其实就像是链路反追踪,从客户的真实ip为起点,穿过多层级的代理,最终到达web服务器,都会记录下来,所以在获取用户真实ip的时候,一般就可以设置成:

1
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;