林中健 · 25网络A1 · 服务器运维课程 · 部署于 notes.linzhonjian.icu
做了:创建阿里云 ECS 实例,用密钥登录,准备普通用户
study,日常操作都用它,超管操作再加 sudo。# 用私钥登录服务器(密钥文件权限必须是 600,否则 ssh 会拒绝使用)
ssh -i ~/.ssh/你的私钥 study@47.114.74.168
# 普通用户自己配好密钥登录:目录 700,authorized_keys 600,属主必须是本人
mkdir -p ~/.ssh && chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys # 粘贴本地公钥
chmod 600 ~/.ssh/authorized_keys
chown -R study:study ~/.ssh
# 看系统版本、CPU 核数(Nginx 工作进程数就等于核数)
cat /etc/redhat-release
nproc
~/.ssh 属主被我 sudo 操作后变成了 root,sshd 认为权限不安全直接拒绝。执行 sudo chown -R study:study ~/.ssh 后恢复;另外 authorized_keys 必须是 600,.ssh 必须是 700。curl / ssh)而不是 ping。做了:安装 Nginx、建站点目录、写 mysite.conf、弄清 403 的真正原因
dnf 安装 Nginx,设为开机自启并立即启动。/var/www/mysite,属主给 study,以后传网页不用 sudo。/etc/nginx/conf.d/mysite.conf,一站一文件。Host 不同,Nginx 据此把请求交给不同站点。# 安装并启动
sudo dnf install -y nginx
sudo systemctl enable --now nginx
# 站点目录:目录 755(工作进程要能进入并读取),属主给 study
sudo mkdir -p /var/www/mysite
sudo chown -R study:study /var/www/mysite
sudo chmod 755 /var/www/mysite
ls -ld /var/www/mysite # 应看到 drwxr-xr-x study study
# 放行端口(firewalld 与阿里云安全组两处都要放)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
# 改完配置的固定三步:查语法 → 重载 → 看进程/日志
sudo nginx -t
sudo systemctl reload nginx
ps -ef | grep [n]ginx
server {
listen 80;
server_name linzhonjian.icu www.linzhonjian.icu;
root /var/www/mysite;
index index.html;
access_log /var/log/nginx/mysite_access.log;
error_log /var/log/nginx/mysite_error.log;
location / {
try_files $uri $uri/ =404;
}
}
sudo mkdir 建的,属主 root、权限 700,Nginx 工作进程以 nginx 用户身份运行,进不去目录,于是 403。改成属主 study、目录 755、文件 644 就好了。记牢:目录 755,文件 644。nginx -t 后 systemctl reload nginx。(第 4 讲我才真正搞懂这条——见下面那次 404。)mysite.conf.bak 放在 conf.d 里没问题;但如果备份名还以 .conf 结尾(如 mysite-copy.conf),会一起被 include /etc/nginx/conf.d/*.conf 加载,出现重复的 server_name,nginx -t 报冲突。做了:用 Let's Encrypt 免费证书,80 端口做验证、443 端口出内容
--webroot 方式申请证书:验证文件放在站点目录里,Let's Encrypt 从公网来取。/.well-known/acme-challenge/ 这个 location,其余请求 301 跳到 https。TLSv1.2 TLSv1.3,主站用自己独立的访问日志和错误日志。certbot renew --dry-run 演练自动续期,确认能成功。# 安装 certbot
sudo dnf install -y certbot
# 先演练:确认 -w 的目录和 80 端口配置对得上,再去掉 --dry-run 正式申请
sudo certbot certonly --webroot -w /var/www/mysite \
-d linzhonjian.icu -d www.linzhonjian.icu --dry-run
sudo certbot certonly --webroot -w /var/www/mysite \
-d linzhonjian.icu -d www.linzhonjian.icu
# 看本机有哪些证书、到期时间
sudo certbot certificates
# 演练续期(不真的换证)
sudo certbot renew --dry-run
# 80 端口:只负责证书验证 + 跳转,不提供内容
server {
listen 80;
server_name linzhonjian.icu www.linzhonjian.icu;
location /.well-known/acme-challenge/ { root /var/www/mysite; }
location / { return 301 https://$host$request_uri; }
}
# 443 端口:真正提供内容,证书与本域名对应
server {
listen 443 ssl;
server_name linzhonjian.icu www.linzhonjian.icu;
ssl_certificate /etc/letsencrypt/live/linzhonjian.icu/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/linzhonjian.icu/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/mysite;
index index.html;
access_log /var/log/nginx/mysite_access.log;
error_log /var/log/nginx/mysite_error.log;
location / { try_files $uri $uri/ =404; }
}
-w 的目录必须和配置里 acme location 的 root 一致,否则验证文件找不到。另外 --webroot 后面跟的是 -w 目录,我第一次写成 -w /var/www/mysite 漏了 -d,参数写错一样失败。/etc/naginx/conf.d/ 少了个 e、cerbot-renew.timer 少了个 t,都会静默失败或提示找不到,改配置前先确认路径拼对。/etc/letsencrypt/renewal-hooks/deploy/ 放一个内容为 systemctl reload nginx 的脚本并 chmod +x,certbot 续期成功会自动执行它。做了:这个 notes 子站点本身就是第 4 讲的成果
同一个 IP 上再加一个网站,Nginx 靠请求头里的域名(Host)分发:解析加一条 notes 的 A 记录 → 建 /var/www/notes 目录 → 写 notes.conf 的 80 段 → 单独申请 notes 的证书 → 补 443 段。一站一文件、一站一日志、一站一证书。
# 盘点全部站点:看 listen 与 server_name
sudo nginx -T 2>/dev/null | grep -n -E "^\s*(listen|server_name)"
# 看 443 端口对某个域名出示的是哪张证书
openssl s_client -connect 127.0.0.1:443 -servername notes.linzhonjian.icu </dev/null 2>/dev/null \
| openssl x509 -noout -ext subjectAltName
notes.conf 写好了、nginx -t 也通过,但访问 acme 验证路径一直是 404,certbot 反复失败。原因是配置只在磁盘上,重载没有真正生效(reload 前后工作进程没换)。重载之后再取验证文件立刻 200。结论:nginx -t 成功只说明文件写对了,不代表已经生效,改完一定要 reload 并复测。