知者不惑,仁者不忧,勇者不惧。

此时此刻,心情还是溢于言表的,一年前想实现这个目标一个人鼓捣了好久,oh不是,还有王哥。此前太年轻,路子走错了,这回花了一周时间,又从0到1搞了个小的项目,准备部署到服务器上,勇者不惧,直面一年前的困难。只能说这次确实有所成长,一年前两周都没搞好的,现在一天下午就OK了。。。

正文开始分割线----------------------------------------------------------------

首先让目标清晰一点:

本站域名 zhr.wiki 部署在一台阿里云服务器上,基于纯前端的的静态框架Hexo搭建而成,现在有一个基于Ant Design Pro + Umi + Spring Boot的全栈项目用户中心也想部署在这台服务器上,而且要保证http(80端口)和https(443)端口共享,即两个项目可以同时访问的目的,下面就流水线似得走一遍

1 申请zhr.wiki的二级域名 user-center.zhr.wiki

这个非常快,参考教程 阿里云二级域名的申请、创建及解析

2 配置新的nginx.conf文件

我们有zhr.wiki配置好的nginx.conf文件 /etc/nginx/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
worker_connections 768;
# multi_accept on;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

server {
listen 80;
server_name zhr.wiki;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}

server {
listen 443 ssl;
server_name zhr.wiki.com;
ssl_certificate cert/www.zhr.wiki.pem;
ssl_certificate_key cert/www.zhr.wiki.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
charset utf-8;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

client_max_body_size 10M;
location / {
root /home/www/website;
index index.html;
try_files $uri $uri/ /index.html;
}
}
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;


ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;


access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;


gzip on;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
include /etc/nginx/vhost/*.conf;
}

注意到上述代码中有 include /etc/nginx/conf.d/*.conf;

于是我们选择在 /etc/nginx/conf.d/ 目录下新建 user-center.conf文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
server {
listen 80;
server_name user-center.zhr.wiki;

# 强制将 HTTP 重定向到 HTTPS
rewrite ^(.*)$ https://$host$1 permanent;
}

server {
listen 443 ssl;
server_name user-center.zhr.wiki;

# 使用生成的 SSL 证书和私钥路径
ssl_certificate /etc/letsencrypt/live/user-center.zhr.wiki/fullchain.pem; # 证书路径
ssl_certificate_key /etc/letsencrypt/live/user-center.zhr.wiki/privkey.pem; # 私钥路径
ssl_session_timeout 5m;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 支持 TLS 协议
ssl_prefer_server_ciphers on;

# 静态文件服务
location / {
root /home/user-center/web/; # 指定静态文件路径
index index.html index.htm;
try_files $uri $uri/ =404;
}

# API 请求反向代理到 8080 端口
location /api/ {
proxy_pass http://localhost:8080; # 将 /api/ 请求转发到后端的 8080 端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# 记录日志
access_log /var/log/nginx/user-center.access.log;
error_log /var/log/nginx/user-center.error.log;
}

暂时还没学过nginx,只见到了解了其反向代理等功能,所以上述conf文件写的可能有冗余

3 申请免费SSL证书

配置好了之后就是给二级域名user-center.zhr.wiki申请免费自动更新SSL证书

这里使用certbot来申请

安装 certbot:

1
2
sudo apt update
sudo apt install certbot python3-certbot-nginx

获取 SSL 证书:

1
sudo certbot --nginx -d user-center.zhr.wiki

自动更新证书: Let’s Encrypt 证书有效期为 90 天,certbot 会自动处理续期。确保在 crontab 中设置了自动更新任务:

1
sudo crontab -e

添加以下行来每天检查证书并更新:

1
0 3 * * * /usr/bin/certbot renew --quiet

重启nginx

1
sudo systemctl restart nginx

至此,就配置好了。当然这些都是手动配置,各种环境,比如mysql等都要手动下载几次,如果能使用docker那自然是更好了。。。