在甲骨文云上配置 Nginx 反向代理,最关键的不是 Nginx 本身,而是云控制台的安全列表(Security List)放行规则,否则配置再好也无法从外网访问。
先说结论:这是一套标准的 Web 服务暴露方案,适合将内部端口服务通过 80/443 对外提供,但必须同步检查云平台防火墙。
- 适合:需要隐藏后端真实端口、统一 HTTPS 证书管理或负载均衡的场景。
- 先准备:确认实例公网 IP 可用,并在甲骨文云控制台放行 TCP 80 和 443 端口。
- 验收:使用 curl 或浏览器访问域名,确认状态码为 200 且后端服务响应正常。
核心逻辑与流量路径
反向代理的核心作用是作为中间层接收客户端请求,再转发给后端服务。在云环境中,流量路径是:用户 -> 云防火墙 -> 系统防火墙 -> Nginx -> 后端应用。甲骨文云的安全列表位于最外层,如果这里没有放行,数据包在到达 VPS 之前就会被丢弃。
分步处理
1. 安装 Nginx
使用系统包管理器安装稳定版本。本文以 Ubuntu/Debian 为例,CentOS/RHEL 用户请将 apt 替换为 yum 或 dnf。
sudo apt update
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx
2. 配置甲骨文云安全列表
登录甲骨文云控制台,进入实例详情,点击子网链接,找到安全列表(Security List)。添加入站规则(Ingress Rules):
- 源 CIDR:0.0.0.0/0(生产环境建议限制特定 IP 段)
- 目标端口:80, 443
- 协议:TCP
3. 配置系统防火墙(UFW)
Ubuntu 默认可能开启 UFW,需确保放行 Nginx 所需端口:
sudo ufw allow 'Nginx Full'
sudo ufw reload
若使用 CentOS 且开启 firewalld:
sudo firewall-cmd `--permanent` `--add-service`=http
sudo firewall-cmd `--permanent` `--add-service`=https
sudo firewall-cmd `--reload`
4. 编写反向代理配置
在 /etc/nginx/sites-available/default 或新建配置文件中添加。以下配置包含 HTTP 自动跳转 HTTPS 及反向代理逻辑:
server {
listen 80;
server_name your_domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1: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;
}
}
将 your_domain.com 替换为实际域名,http://127.0.0.1:8080 替换为实际后端服务地址。
5. 申请并配置 HTTPS 证书
使用 Certbot 自动申请并配置证书(需确保域名已解析到 VPS IP):
sudo apt install certbot python3-certbot-nginx -y
sudo certbot `--nginx` -d your_domain.com
按提示输入邮箱并完成验证,Certbot 会自动修改 Nginx 配置启用 HTTPS。
6. 测试并重载
sudo nginx -t
sudo systemctl reload nginx
怎么验证是否生效
使用 curl 命令检查响应头、HTTPS 跳转和本地 IP 泄露情况:
curl -I http://your_domain.com
curl -I https://your_domain.com
观察 HTTP 请求是否返回 301 跳转至 HTTPS,HTTPS 请求状态码是否为 200。如果后端服务有日志,检查日志中记录的客户端 IP 是否为真实用户 IP(取决于 X-Real-IP 配置)。
常见坑与排查
- 云防火墙遗忘:最常见的问题是 Nginx 配置正确,但甲骨文云控制台安全列表未放行端口。
- 系统防火墙冲突:Ubuntu 需确保
ufw放行,CentOS 需检查firewalld或iptables。 - SELinux 限制:CentOS/RHEL 系统若开启 SELinux,可能阻止 Nginx 连接后端端口。建议优先配置策略(如
setsebool -P http_can_network_connect 1),而非直接关闭 SELinux。 - 后端监听地址:后端服务若只监听 127.0.0.1,Nginx 可以代理;若监听公网 IP,需注意暴露风险。
- 证书路径错误:手动配置 HTTPS 时,确保证书路径存在且 Nginx 进程有读取权限。
参考来源
- Nginx 官方文档 - 入门指南 (https://nginx.org/en/)
- Oracle Cloud Infrastructure 文档 - 安全列表规则 (https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/securitylists.htm)
- Certbot 官方文档 (https://certbot.eff.org/)