我的运维笔记

林中健 · 25网络A1 · 服务器运维课程 · 部署于 notes.linzhonjian.icu

第 1 讲 · 拿到服务器并成功登录

做了:创建阿里云 ECS 实例,用密钥登录,准备普通用户

做了什么

关键命令

# 用私钥登录服务器(密钥文件权限必须是 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。
ping 不通不一定是服务器坏了:阿里云安全组默认不放行 ICMP,判断服务是否存活看端口(curl / ssh)而不是 ping。

第 2 讲 · 装 Nginx,把第一个网站跑起来

做了:安装 Nginx、建站点目录、写 mysite.conf、弄清 403 的真正原因

做了什么

关键命令

# 安装并启动
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

站点配置(mysite.conf 的 80 端口部分)

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;
    }
}

遇到的问题

403 Forbidden:一开始目录是 sudo mkdir 建的,属主 root、权限 700,Nginx 工作进程以 nginx 用户身份运行,进不去目录,于是 403。改成属主 study、目录 755、文件 644 就好了。记牢:目录 755,文件 644。
改完配置没反应:只改文件不重载,Nginx 仍在用内存里的旧配置。必须 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 报冲突。

第 3 讲 · 给网站装上 HTTPS 安全锁

做了:用 Let's Encrypt 免费证书,80 端口做验证、443 端口出内容

做了什么

关键命令

# 安装 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 与 443 的分工

# 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; }
}

遇到的问题

certbot 报 404 / unauthorized:-w 的目录必须和配置里 acme location 的 root 一致,否则验证文件找不到。另外 --webroot 后面跟的是 -w 目录,我第一次写成 -w /var/www/mysite 漏了 -d,参数写错一样失败。
命令拼写错误:/etc/naginx/conf.d/ 少了个 e、cerbot-renew.timer 少了个 t,都会静默失败或提示找不到,改配置前先确认路径拼对。
续期后要重载 Nginx:证书换了但进程里还是旧证书,所以 renew 之后要有动作。做法是在 /etc/letsencrypt/renewal-hooks/deploy/ 放一个内容为 systemctl reload nginx 的脚本并 chmod +x,certbot 续期成功会自动执行它。

第 4 讲 · 顺手记一笔:一台服务器放两个网站

做了:这个 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 并复测。