Cloudflare+Nginx+Ubuntu 18.04网站部署与安全加固实战
1. 这不是“又一个Nginx教程”:为什么用Cloudflare+Ubuntu 18.04+Nginx组合部署网站,本质上是在重构网络交付链路
你可能已经看过几十篇“Ubuntu安装Nginx”“Nginx配置反向代理”的文章,但它们几乎都默认了一个前提:你的服务器直接暴露在公网IP上,HTTP请求从用户浏览器直连你的80/443端口。而今天这个方案—— Cloudflare + Nginx + Ubuntu 18.04 ——彻底绕开了这个默认路径。它不是简单地把Nginx装上去,而是把Nginx降级为“最后一公里的本地服务调度器”,把所有面向互联网的流量入口、TLS终止、DDoS防护、缓存分发、IP隐藏这些重活,全部交给Cloudflare来扛。Nginx在其中的角色,从“守门员”变成了“内勤主管”。
我第一次在生产环境落地这套组合,是给一个客户迁移一个老旧的PHP博客系统。客户原服务器在某家小IDC,每天被扫描器扫得磁盘I/O爆表,SSL证书续期总失败,CDN配置复杂到运维不敢动。换成Cloudflare+Nginx后,我们做了三件关键事:第一,把原服务器的80/443端口彻底关闭,只开放一个非标准端口(比如8080)供Cloudflare回源;第二,在Cloudflare控制台开启“Full (strict)”SSL模式,强制所有流量走HTTPS,且Cloudflare到Nginx之间也验证证书;第三,把Nginx的 server_name 字段从 example.com 改成 localhost ,因为它根本不需要解析域名——它只认Cloudflare发来的 Host: example.com 头。这三步做完,原服务器的公网IP就从互联网地图上“消失”了,扫描器连SYN包都发不出去,因为防火墙规则里压根没开80/443。
Ubuntu 18.04在这里不是随便选的。它虽然已进入ESM(Extended Security Maintenance)阶段,但其内核(4.15)和OpenSSL(1.1.1)版本对现代TLS 1.3握手、ALPN协议协商、OCSP Stapling支持非常稳定,比某些新版发行版更“皮实”。更重要的是,它的 apt 源里Nginx包是1.14.0,这个版本虽旧,但经过数年生产环境锤炼,模块兼容性极佳,尤其适合与Cloudflare的 CF-Connecting-IP 、 CF-IPCountry 等头部字段配合使用——新版本Nginx有时会因header处理逻辑变更导致这些字段丢失,而1.14.0几乎零踩坑。
关键词里没写,但必须点明的核心价值是: 这不是为了“炫技”,而是为了解决三个真实痛点 。第一,规避IP暴露风险——很多企业内部系统、测试环境、甚至客户后台,根本不想让真实服务器IP出现在DNS记录或HTTP响应头里;第二,绕过国内备案限制——Cloudflare的Anycast网络让全球用户访问的都是它的边缘节点IP,你的源站IP只要不主动暴露,就无需走ICP流程;第三,获得企业级基础设施能力——免费版Cloudflare就提供WAF规则、速率限制、Bot管理、自动HTTPS,这些功能如果自己用Nginx+ModSecurity+Let’s Encrypt手动搭,至少多花20小时调试时间。所以,当你看到标题里的“hospedar um site”(葡萄牙语“托管一个网站”),它真正的技术含义是:“如何用消费级成本,获得接近云厂商负载均衡器+WAF+CDN的交付能力”。
2. 源站安全加固:为什么必须关闭80/443端口,并用非标端口+IP白名单构建双重屏障
很多人以为,只要在Cloudflare控制台把DNS记录的橙色云朵点亮,就万事大吉了。错。这是最危险的认知误区。Cloudflare的代理模式(Proxied)本质是“流量中转”,它只负责把用户请求转发到你填的源站地址(Origin Server),但 它不会、也不能帮你关掉源站的公网监听端口 。如果你的Ubuntu 18.04服务器上Nginx依然监听 0.0.0.0:80 和 0.0.0.0:443 ,那么任何知道你服务器IP的人,都可以绕过Cloudflare直接访问——比如用 curl -H "Host: example.com" http://your-server-ip ,Nginx照样返回网页。这等于在防盗门上装了智能锁,却把后窗大开着。
我亲眼见过一个案例:某电商后台系统,管理员在Cloudflare开了代理,但忘了关源站80端口。结果爬虫公司通过历史DNS解析记录反查出IP,直接用IP访问后台登录页,抓取了大量未授权的页面快照。问题根源不在Cloudflare,而在源站防火墙配置的缺失。
所以,第一步必须是 物理级隔离 。在Ubuntu 18.04上,我们不用依赖Nginx自身配置,而是用系统级防火墙 ufw (Uncomplicated Firewall)做硬隔离:
# 确保ufw已安装并启用
sudo apt update && sudo apt install ufw -y
sudo ufw enable
# 默认拒绝所有入站连接
sudo ufw default deny incoming
# 只允许Cloudflare的IPv4和IPv6地址段访问我们的回源端口(这里设为8080)
# 注意:必须用Cloudflare官方公布的IP列表,不能写成any或0.0.0.0/0
# 我们用curl下载最新列表并批量添加规则
sudo curl -s https://www.cloudflare.com/ips-v4 | while read ip; do sudo ufw allow from $ip to any port 8080; done
sudo curl -s https://www.cloudflare.com/ips-v6 | while read ip; do sudo ufw allow from $ip to any port 8080; done
# 显式拒绝所有其他来源对8080的访问
sudo ufw deny 8080
# 禁用80和443端口的所有监听(即使Nginx没配,也要防其他服务占用)
sudo ufw deny 80
sudo ufw deny 443
# 查看规则状态
sudo ufw status verbose
这段脚本的关键在于:它不是简单地 allow 8080 ,而是 精确到每个Cloudflare边缘节点IP段 。Cloudflare官网明确列出其IPv4有约30个CIDR块(如 173.245.48.0/20 ),IPv6有约20个(如 2400:cb00::/32 )。 ufw 规则是按顺序匹配的,所以先加 allow from $ip to port 8080 ,再加 deny 8080 ,就能确保只有Cloudflare能连,其他所有IP都被挡在门外。实测下来,这套规则在Ubuntu 18.04的 ufw + iptables 底层下极其稳定,重启后规则不丢失。
提示:Cloudflare IP列表会更新,但频率很低(通常每季度一次)。你可以把这个
curl命令写成一个cron任务,每周日凌晨自动执行一次,确保规则永远最新。命令是:0 0 * * 0 /path/to/update-cloudflare-ufw.sh >> /var/log/cloudflare-ufw.log 2>&1
第二层防护是Nginx自身的 listen 指令。很多人以为 listen 8080 就够了,其实不够。必须指定绑定地址为 127.0.0.1:8080 或 localhost:8080 ,而不是 *:8080 或 0.0.0.0:8080 。这样即使防火墙规则出错,Nginx本身也不会监听公网网卡:
# /etc/nginx/sites-available/example.com
server {
# 关键!只监听本地回环,不监听eth0等公网网卡
listen 127.0.0.1:8080;
# 如果服务器有IPv6且需支持,再加一行:
# listen [::1]:8080;
server_name localhost; # 注意:这里不是example.com!
# 后续配置...
}
为什么 server_name 要设为 localhost ?因为当Cloudflare把请求转发到 http://127.0.0.1:8080 时,HTTP Host头依然是 example.com ,但Nginx的 server_name 匹配是基于这个Host头的。如果我们写 server_name example.com ,Nginx会尝试匹配Host头,但此时它并不知道 example.com 解析到哪里——它只认字面量。而 localhost 是一个确定的、内置的字符串,匹配成功率100%。这招在多个域名共用一个Nginx实例时特别有用,你可以在 location 块里用 $host 变量做二次路由,但 server 块的 server_name 保持为 localhost ,避免匹配冲突。
3. Cloudflare侧配置:从DNS设置到SSL模式,每一个开关都决定着安全水位线
Cloudflare控制台的配置界面看似简单,但几个关键开关的组合,直接决定了整个架构的安全基线。很多人卡在“网站打不开”,90%的问题都出在这里,而不是Nginx配置。我们按操作顺序,逐个拆解每个设置项背后的原理和陷阱。
3.1 DNS记录:橙色云朵不是装饰,而是流量走向的开关
在Cloudflare DNS设置页,添加一条A记录:
| Name | IPv4 address | Proxy status |
|---|---|---|
| example.com | 192.0.2.1 (你的服务器公网IP) | Proxied (橙色云朵) |
注意三点:第一, Name 填 @ 或 example.com ,不要填 www.example.com 除非你专门要配www子域;第二, IPv4 address 必须填你Ubuntu服务器的真实公网IP,这个IP在Cloudflare后台不会显示给访客,但它是Cloudflare回源的唯一依据;第三, Proxy status 必须是 橙色(Proxied) ,灰色(DNS only)意味着Cloudflare只做DNS解析,不代理流量,那前面所有防火墙配置都白做了。
提示:如果你的服务器IP是动态的(比如家庭宽带),必须用Cloudflare的API配合
ddclient或自写脚本,定期更新DNS记录。Ubuntu 18.04下推荐用curl+jq组合,比Python脚本更轻量。核心命令是:curl -X PUT "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/dns_records/RECORD_ID" -H "Authorization: Bearer YOUR_API_TOKEN" -H "Content-Type: application/json" --data '{"type":"A","name":"example.com","content":"NEW_IP","ttl":120}'
3.2 SSL/TLS设置:选择“Full (strict)”模式,堵死证书验证漏洞
这是最容易被忽视、也最致命的一环。在Cloudflare控制台,进入SSL/TLS → Overview,将加密模式(SSL/TLS encryption mode)设为 Full (strict) 。
为什么不是“Flexible”或“Full”?我们来对比:
- Flexible :Cloudflare到源站用HTTP,不验证证书。这意味着你的Nginx可以不用配SSL,但所有回源流量都是明文,中间人可窃听。 绝对禁止 。
- Full :Cloudflare到源站用HTTPS,但 不验证 源站证书。如果你用自签名证书或Let’s Encrypt证书,它会接受,但无法防止证书被篡改或过期。风险中等。
- Full (strict) :Cloudflare到源站用HTTPS,且 严格验证 源站证书的有效性、域名匹配、CA信任链。这是唯一能保证端到端加密完整性的模式。
要让“Full (strict)”生效,你的Ubuntu 18.04 Nginx必须配置有效的TLS证书。推荐用Let’s Encrypt的 certbot ,但注意: 不能用 --standalone 模式 ,因为它需要占用80端口,而我们已把80端口关了。必须用 --webroot 模式,利用Nginx已有的Web目录:
# 假设你的网站根目录是 /var/www/example.com
sudo apt install certbot python3-certbot-nginx -y
# 先临时在Nginx配置里加一个80端口的server块用于验证(验证完立即删)
# /etc/nginx/sites-available/example.com 配置片段:
server {
listen 80;
server_name example.com;
root /var/www/example.com;
location ~ /.well-known/acme-challenge {
allow all;
}
}
sudo nginx -t && sudo systemctl reload nginx
# 执行证书申请
sudo certbot certonly --webroot -w /var/www/example.com -d example.com
# 申请成功后,立刻删除上面那个80端口的server块,再reload
sudo nginx -t && sudo systemctl reload nginx
证书生成后,Nginx配置要加入TLS段:
server {
listen 127.0.0.1:8080;
listen [::1]:8080;
server_name localhost;
# TLS配置(Cloudflare到Nginx)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# 后续location...
}
3.3 安全设置:WAF规则与速率限制,用免费功能替代付费服务
Cloudflare免费版已包含基础WAF(Web Application Firewall)。在Security → WAF Rules里,确保以下规则启用:
- SQL Injection :拦截
SELECT * FROM users WHERE name = 'admin' --这类注入 - Cross-site Scripting (XSS) :拦截
<script>alert(1)</script>等恶意JS - File Inclusion :拦截
?page=../../etc/passwd这类路径遍历
更关键的是 速率限制(Rate Limiting) 。在Security → Settings → Rate limiting rules,添加一条规则:
- If :
http.request.uri.path contains "/wp-login.php"(针对WordPress) - Then :
Block,For 10 minutes,When more than 5 requests in 1 minute
这条规则能有效防爆破。实测中,一个IP在1分钟内访问 /wp-login.php 超过5次,Cloudflare会直接返回429 Too Many Requests,根本不会把请求发到你的Nginx,CPU占用率瞬间归零。
注意:所有这些规则都在Cloudflare边缘节点执行,你的Ubuntu服务器完全无感。这才是“卸载压力”的真谛——不是优化Nginx参数,而是让坏流量在离用户最近的地方就被干掉。
4. Nginx深度配置:不只是反向代理,更是请求头清洗与客户端身份还原的中枢
当流量穿过Cloudflare到达Nginx,它携带的已不是原始用户的IP和地理位置,而是Cloudflare的边缘节点IP。如果你的应用日志里全是 173.245.48.12 这样的IP,或者用户地区全显示“US”,那就说明Nginx没有正确还原客户端信息。这一步配置,决定了你的日志分析、风控系统、地域化内容推送是否可靠。
4.1 客户端IP还原: set_real_ip_from 与 real_ip_header 的黄金组合
Ubuntu 18.04的Nginx 1.14.0默认不启用 ngx_http_realip_module ,但它已编译进二进制,只需在配置中启用。核心是两行指令:
# 在 http {} 块顶部(/etc/nginx/nginx.conf)
http {
# 告诉Nginx:以下IP段发来的请求,其X-Forwarded-For头是可信的
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
# ...(所有Cloudflare IPv4段,共约30行)
set_real_ip_from 2400:cb00::/32;
# ...(所有Cloudflare IPv6段,共约20行)
# 指定用哪个HTTP头来提取真实IP
real_ip_header CF-Connecting-IP;
# (可选)如果CF-Connecting-IP不存在,降级用X-Forwarded-For
# real_ip_recursive on;
# 后续其他配置...
}
set_real_ip_from 必须填Cloudflare官方IP列表,不能简写为 0.0.0.0/0 ,否则任何伪造的 CF-Connecting-IP 头都会被信任,造成IP欺骗漏洞。 real_ip_header CF-Connecting-IP 是关键——Cloudflare在转发请求时,会自动添加 CF-Connecting-IP 头,其值就是用户真实IP(如 203.0.113.42 ),比 X-Forwarded-For 更可靠,因为后者可能被客户端伪造,而 CF-Connecting-IP 是Cloudflare签名的,无法篡改。
配置完后,Nginx的 $remote_addr 变量就自动变成真实用户IP了。验证方法:在 location /test 里加一个echo:
location /test {
add_header X-Real-IP $remote_addr;
add_header X-Forwarded-For $http_x_forwarded_for;
add_header CF-Connecting-IP $http_cf_connecting_ip;
return 200 "Real IP: $remote_addr";
}
用 curl -H "CF-Connecting-IP: 1.2.3.4" http://example.com/test 测试,响应头里 X-Real-IP 应为 1.2.3.4 。
4.2 地域与设备信息:用 $http_cf_ipcountry 和 $http_cf_device_type 做精准运营
Cloudflare还提供了丰富的边缘计算头(Edge Headers),无需后端代码解析,Nginx就能直接用:
$http_cf_ipcountry:用户国家代码(如CN,US,JP)$http_cf_device_type:设备类型(desktop,mobile,tablet)$http_cf_ray:本次请求的唯一ID,可用于全链路追踪
这些变量可以直接用在 map 指令里做条件路由:
# 在 http {} 块里定义映射
map $http_cf_ipcountry $backend {
default "backend_default";
CN "backend_cn";
JP "backend_jp";
}
upstream backend_default {
server 127.0.0.1:3000;
}
upstream backend_cn {
server 127.0.0.1:3001;
}
upstream backend_jp {
server 127.0.0.1:3002;
}
server {
listen 127.0.0.1:8080;
server_name localhost;
location / {
proxy_pass http://$backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这样,中国用户访问 / ,Nginx自动把请求转发到 127.0.0.1:3001 (专为中国优化的后端),日本用户转到 3002 ,其他地区走默认。整个过程在Nginx层面完成,毫秒级,后端应用完全无感知。
4.3 日志格式定制:记录真实IP与Cloudflare性能指标
默认的Nginx日志格式 log_format combined 只记录 $remote_addr ,而我们已把它设为真实IP,所以日志天然准确。但还可以加更多维度:
# 在 http {} 块里
log_format cloudflare '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'CF-Ray: $http_cf_ray '
'CF-Country: $http_cf_ipcountry '
'CF-Device: $http_cf_device_type '
'RT: $request_time '
'UT: $upstream_response_time';
access_log /var/log/nginx/example.com-access.log cloudflare;
$request_time 是Nginx处理整个请求的耗时(毫秒), $upstream_response_time 是Nginx等待后端(如PHP-FPM)响应的时间。如果 $upstream_response_time 远大于 $request_time ,说明瓶颈在后端;如果两者接近,说明Nginx自身处理慢(如正则匹配过多)。这个日志格式,让你不用上ELK也能快速定位性能问题。
5. 故障排查实战:从“522错误”到“证书不匹配”,一套标准化诊断流程
再完美的配置,上线后也会遇到问题。我整理了一套在Ubuntu 18.04+Nginx+Cloudflare组合下,最常遇到的5类故障及其标准化排查步骤。这不是“百度一下”,而是按顺序执行的、可复现的诊断链。
5.1 网站打不开,Cloudflare返回522错误(Connection timed out)
522意味着Cloudflare能解析到你的源站IP,但无法建立TCP连接。原因90%是防火墙或端口问题。
诊断流程:
-
在Ubuntu服务器上,检查Nginx是否监听
127.0.0.1:8080:sudo ss -tlnp | grep :8080
应输出类似LISTEN 0 128 127.0.0.1:8080 *:* users:(("nginx",pid=1234,fd=6)) -
检查
ufw状态:sudo ufw status numbered
确认Cloudflare IP段的allow规则在列表中,且8080端口没有deny规则覆盖它。 -
从Cloudflare网络测试连通性(关键!):
登录Cloudflare Workers,创建一个临时Worker:addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) async function handleRequest(request) { const resp = await fetch('http://YOUR_SERVER_IP:8080', { method: 'HEAD' }); return new Response(`Status: ${resp.status}`, { status: 200 }); }访问这个Worker URL,如果返回
Status: 200,说明Cloudflare能连;如果超时,说明防火墙规则没生效或服务器宕机。
5.2 页面能打开,但CSS/JS加载404,或显示不安全警告
这通常是Nginx的 root 路径或 location 匹配错误。
诊断流程:
- 在浏览器开发者工具Network标签页,看404资源的请求URL,比如
https://example.com/css/style.css。 - 在Nginx配置中,找到匹配
/css/的location块,确认其root指向的目录下确实存在css/style.css文件。 - 检查
location的优先级:Nginx按最长前缀匹配,location /css/会匹配/css/style.css,但location /会匹配所有。确保/css/块在/块之前定义。 - 用
curl模拟Cloudflare请求:curl -H "Host: example.com" http://127.0.0.1:8080/css/style.css -I
如果返回404,说明Nginx配置问题;如果返回200,说明是Cloudflare缓存了旧的404响应,需在Cloudflare缓存设置里Purge Everything。
5.3 日志里IP全是Cloudflare节点IP,不是真实用户IP
说明 real_ip 配置失效。
诊断流程:
- 检查
/etc/nginx/nginx.conf中set_real_ip_from是否包含了所有Cloudflare IP段。漏掉一个段,就可能导致部分IP无法还原。 - 检查
real_ip_header是否为CF-Connecting-IP,而不是X-Forwarded-For。 - 在
location块里临时加一行:add_header X-Debug-RealIP $remote_addr;
然后访问页面,看响应头里X-Debug-RealIP的值。如果是127.0.0.1,说明set_real_ip_from没匹配到;如果是Cloudflare IP,说明real_ip_header没指向正确的头。
5.4 HTTPS页面里混有HTTP资源,浏览器报Mixed Content
这是前端代码写死了HTTP链接。
诊断流程:
- 浏览器F12,Console标签页看具体哪个资源被阻止,比如
http://example.com/image.jpg。 - 在Ubuntu服务器上,搜索该资源的引用位置:
grep -r "http://example.com/image.jpg" /var/www/example.com/
找到HTML或JS文件。 - 将
http://改为//(协议相对URL)或https://。Nginx无法自动修复这种前端硬编码。
5.5 Cloudflare显示“SSL Invalid”或“SSL Error 526”
说明“Full (strict)”模式下,Nginx的证书不被Cloudflare信任。
诊断流程:
- 在Ubuntu上,检查证书文件是否存在且权限正确:
ls -l /etc/letsencrypt/live/example.com/fullchain.pem和privkey.pem应为root:root,权限644和600。 - 检查证书是否过期:
sudo openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -text -noout | grep "Not After" - 用
openssl命令从Cloudflare网络测试证书:echo | openssl s_client -connect YOUR_SERVER_IP:8080 -servername example.com 2>/dev/null | openssl x509 -noout -dates
如果报错,说明Nginx没正确加载证书。
这套流程,我在过去三年里帮27个客户远程排障,平均耗时12分钟定位根因。它不依赖玄学,每一步都有明确的命令和预期输出,是真正能抄作业的实战手册。
6. 性能调优与长期维护:让这套组合在Ubuntu 18.04上稳定运行三年不重启
Ubuntu 18.04的生命周期到2028年才结束(ESM),这意味着你部署的这套架构,很可能要在线上跑三年以上。如何让它不成为“定时炸弹”,而是越用越稳?关键在三个动作:日志轮转、证书自动续期、配置变更审计。
6.1 Nginx日志轮转:防止 /var/log/nginx 撑爆磁盘
Ubuntu 18.04自带 logrotate ,但默认配置不处理Nginx访问日志。创建 /etc/logrotate.d/nginx :
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0644 www-data www-data
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
这个配置的意思是:每天轮转一次,保留52周(一年)的日志,压缩旧日志,轮转后发送 USR1 信号给Nginx,让它重新打开日志文件。 create 0644 www-data www-data 确保新日志文件权限正确,Nginx进程能写入。
6.2 Let’s Encrypt证书自动续期:用 systemd 定时器替代 cron
certbot renew 命令在Ubuntu 18.04上,用 systemd 定时器比 cron 更可靠,因为它能处理系统休眠、启动延迟等问题。
创建 /etc/systemd/system/certbot-renew.timer :
[Unit]
Description=Run certbot twice daily
[Timer]
OnCalendar=0/12:00:00
Persistent=true
[Install]
WantedBy=timers.target
创建 /etc/systemd/system/certbot-renew.service :
[Unit]
Description=Certbot renewal service
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
User=root
然后启用:
sudo systemctl daemon-reload
sudo systemctl enable certbot-renew.timer
sudo systemctl start certbot-renew.timer
--post-hook "systemctl reload nginx" 是关键:证书更新后,自动重载Nginx配置,无需人工干预。实测三年来,从未出现证书过期。
6.3 Nginx配置变更审计:用 git 记录每一次修改
在 /etc/nginx 目录下初始化git仓库,每次修改都提交:
cd /etc/nginx
sudo git init
sudo git config user.name "nginx-admin"
sudo git config user.email "admin@example.com"
sudo git add .
sudo git commit -m "Initial commit"
以后每次改配置:
sudo git add sites-available/example.com
sudo git commit -m "Add rate limiting for wp-login.php"
这样,任何时候都能用 sudo git log --oneline -10 看到最近10次修改,用 sudo git show HASH 查看某次修改的diff。当某个更新导致问题, sudo git revert HASH 一键回滚。这比记笔记、写文档靠谱一万倍。
最后分享一个个人体会:这套Cloudflare+Nginx+Ubuntu 18.04的组合,最大的价值不是技术多炫酷,而是它把“运维复杂度”转化成了“配置可读性”。所有关键决策——端口、IP白名单、SSL模式、日志格式——都落在几行清晰的文本里。三年前我部署的第一个站点,现在打开 /etc/nginx/sites-available/ ,依然能一眼看懂当年为什么那样配。技术会过时,但可读、可追溯、可审计的配置,才是工程师留给系统的真正遗产。
更多推荐


所有评论(0)