Nginx监听80端口和443端口的基础设置
在现代互联网架构中,Nginx 作为高性能的 Web 服务器与反向代理工具,早已成为无数网站、API 服务和微服务架构的基石。无论是静态资源分发、负载均衡、SSL 终止,还是高并发请求处理,Nginx 都以其轻量、稳定、高效的特性赢得了开发者的广泛信赖。而在 Nginx 的所有配置中,监听端口(listen directive) 的设置,是整个服务对外暴露的“门户”,是流量进入系统的第一个关口。

本文将深入探讨 Nginx 在 80(HTTP)和 443(HTTPS)端口上的基础配置方法,涵盖从最简配置到生产级最佳实践的完整路径。我们将结合真实场景,分析配置背后的原理,展示如何通过 Nginx 实现安全、高效、可扩展的 Web 服务,并辅以 Java 应用集成示例,帮助你构建一个完整、闭环的前后端服务架构。
为什么是 80 和 443?端口的“身份”与协议意义
在互联网通信中,端口(Port)是 TCP/IP 协议栈中用于区分不同服务的逻辑通道。每一个网络服务都会绑定到一个特定的端口上,客户端通过“IP:端口”的组合来定位目标服务。
- 80 端口:默认的 HTTP(超文本传输协议) 端口。当你在浏览器中输入
http://example.com时,浏览器实际上会自动连接该域名的 80 端口。 - 443 端口:默认的 HTTPS(HTTP Secure) 端口。当你访问
https://example.com时,浏览器会连接 443 端口,并启动 TLS/SSL 加密通道。
这两个端口之所以被广泛使用,是因为它们是 IANA(互联网号码分配机构) 正式注册的“知名端口”(Well-Known Ports),被 操作系统、浏览器、防火墙、CDN 和网络中间件默认信任和放行。
小知识:如果你在公司内网中部署服务,但使用了 8080 或 9000 这类非标准端口,用户必须手动输入 http://yourdomain:9000 才能访问 —— 这不仅用户体验差,还可能被企业防火墙拦截。而 80 和 443 几乎无一例外地被开放,是构建“开箱即用”服务的黄金标准。
Nginx 配置文件结构概览
Nginx 的主配置文件通常位于:
- Linux(Ubuntu/Debian):
/etc/nginx/nginx.conf - Linux(CentOS/RHEL):
/etc/nginx/nginx.conf - macOS(Homebrew):
/usr/local/etc/nginx/nginx.conf
该文件通常包含一个主块(main block)和多个子块,如 events、http、server 等。我们关注的是 http 块内的 server 块,因为每个 server 块代表一个虚拟主机(Virtual Host),用于监听特定端口和域名。
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 我们的 server 块将在这里定义
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
index index.html;
}
}注意:不要直接修改主配置文件。生产环境中推荐将每个站点的配置拆分为独立文件,放在 /etc/nginx/sites-available/ 下,然后通过符号链接启用到 /etc/nginx/sites-enabled/。这样便于管理、备份和版本控制。
配置 80 端口:HTTP 服务的基石
基础 HTTP 监听配置
最简单的 HTTP 服务配置如下:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
listen 80;:明确告诉 Nginx 在 80 端口监听所有 IP 地址的请求。server_name:指定该 server 块响应哪些域名。支持通配符(如*.example.com)和正则表达式。root:定义网站根目录,所有静态文件将从此路径查找。index:当用户访问目录时,Nginx 优先返回的文件列表。location /:匹配所有请求路径,try_files指令用于按顺序查找文件,若都不存在则返回 404。
最佳实践:建议始终为 server_name 设置明确的域名,避免使用空值或通配符,防止被恶意域名劫持。
重定向:从 HTTP 到 HTTPS
在现代 Web 中,所有网站都应强制使用 HTTPS。因此,我们通常会为 80 端口设置一个“重定向服务器”,将所有 HTTP 请求自动跳转到 HTTPS 版本。
server {
listen 80;
server_name example.com www.example.com;
# 301 永久重定向到 HTTPS
return 301 https://$host$request_uri;
}
这个配置简洁而强大:
$host:获取客户端请求中的 Host 头部(如www.example.com)$request_uri:保留原始请求路径和查询参数(如/api/users?id=123)
优点:
- 无需任何静态页面
- 不占用额外资源
- 搜索引擎友好(301 是 SEO 友好的重定向)
- 适用于所有路径,包括 API、静态资源、动态路由
测试与验证
配置完成后,执行以下命令测试语法:
sudo nginx -t
如果输出为:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
说明配置无误。然后重载服务:
sudo systemctl reload nginx
现在,打开浏览器访问 http://example.com,你应该被自动跳转到 https://example.com。如果尚未配置 HTTPS,会看到连接错误 —— 这正是我们下一步要解决的。
配置 443 端口:HTTPS 的安全之门
HTTPS 不仅仅是一个“锁图标”,它意味着:
- 数据加密(防窃 听)
- 身份认证(防中间人攻击)
- 完整性校验(防篡改)
要启用 HTTPS,你需要:
- 一个有效的 SSL/TLS 证书(由 CA 签发)
- 私钥(private key)
- Nginx 配置中启用 SSL 模块并指定证书路径
获取免费证书:Let’s Encrypt
目前最主流的免费证书颁发机构是 Let’s Encrypt,它通过 ACME 协议自动签发和续期证书。我们推荐使用 certbot 工具自动化管理。
# Ubuntu/Debian 示例 sudo apt update sudo apt install certbot python3-certbot-nginx # 自动配置 Nginx + HTTPS sudo certbot --nginx -d example.com -d www.example.com
运行后,certbot 会:
- 自动检测 Nginx 配置
- 向 Let’s Encrypt 请求证书
- 修改你的 Nginx 配置文件,添加 SSL 相关指令
- 自动设置 301 重定向(从 HTTP → HTTPS)
- 设置自动续期任务(cron job)
官方文档:https://certbot.eff.org/instructions
手动配置 HTTPS Server Block(不使用 certbot)
如果你手动管理证书(如企业内部 CA 或购买商业证书),配置如下:
server {
listen 443 ssl http2; # 启用 HTTP/2 加速
server_name example.com www.example.com;
# SSL 证书路径
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# 安全增强配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# 会话缓存与复用
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS(HTTP Strict Transport Security)—— 强制浏览器只用 HTTPS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 防止点击劫持
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
配置详解
| 指令 | 说明 |
|---|---|
listen 443 ssl http2; | 同时启用 SSL 和 HTTP/2,显著提升页面加载速度 |
ssl_certificate | 指定证书链文件(包含服务器证书 + 中间证书) |
ssl_certificate_key | 指定私钥文件(必须权限为 600,仅 root 可读) |
ssl_protocols | 仅允许 TLS 1.2+,禁用不安全的 SSLv3、TLS 1.0/1.1 |
ssl_ciphers | 使用现代、高强度加密套件,避免弱加密 |
ssl_prefer_server_ciphers | 服务器优先选择加密算法,而非客户端 |
ssl_session_cache | 缓存 SSL 会话,减少握手开销 |
add_header Strict-Transport-Security | 强制浏览器在未来 2 年内只用 HTTPS 访问,即使用户输入 http:// 也会自动跳转 |
安全提醒:私钥文件(.key)是敏感信息,绝对不能上传到公共仓库或共享给他人。建议使用 chmod 600 和 chown root:root 锁定权限。
SSL 安全评分测试
配置完成后,推荐使用以下工具检测你的 HTTPS 配置安全性:
- SSL Labs SSL Test —— 全球最权威的 SSL 评分工具
- Mozilla SSL Config Generator —— 生成符合最佳实践的配置模板
一个配置良好的 Nginx HTTPS 服务,通常可获得 A+ 评分。
80 与 443 的协同工作:完整的流量路由策略
一个完整的 Web 服务,通常需要 两个 server 块 协同工作:
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
# HTTPS 主服务
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# API 反向代理示例
location /api/ {
proxy_pass http://localhost: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;
}
}
这是生产环境的标准模板。它实现了:
- 所有 HTTP 请求 → 301 重定向到 HTTPS
- HTTPS 服务启用现代加密和安全头
/api/路径转发到后端 Java 服务(如 Spring Boot)
Java 应用集成:Nginx + Spring Boot 实战
在微服务架构中,前端(Nginx)与后端(Java)通常分离部署。Nginx 作为反向代理,负责:
- 处理静态资源
- 终止 SSL
- 负载均衡(多实例)
- 防止直接暴露 Java 服务
Java 后端:Spring Boot 示例
我们创建一个简单的 Spring Boot 应用,监听 localhost:8080,提供一个 REST 接口。
Maven 依赖(pom.xml)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>主类(Application.java)
package com.example.nginxjava;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}REST 控制器(HelloController.java)
package com.example.nginxjava.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/api/hello")
public String hello() {
return "{\"message\":\"Hello from Java backend! 🚀\",\"status\":\"success\"}";
}
@GetMapping("/api/health")
public String health() {
return "{\"status\":\"UP\",\"version\":\"1.0.0\",\"server\":\"Spring Boot\"}";
}
}配置文件(application.properties)
server.port=8080 server.address=127.0.0.1 server.servlet.context-path=/ # 避免日志污染 logging.level.org.springframework=INFO
注意:我们绑定 127.0.0.1 而非 0.0.0.0,是为了仅允许本地访问,外部请求只能通过 Nginx 代理访问,增强安全性。
启动应用:
mvn spring-boot:run
现在访问 http://localhost:8080/api/hello,应返回:
{"message":"Hello from Java backend! 🚀","status":"success"}
Nginx 反向代理配置
在 Nginx 中添加 /api/ 的代理规则:
location /api/ {
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;
}
关键头设置解释:
Host $host:保持原始 Host 头,避免后端误判域名X-Real-IP:传递客户端真实 IP(否则后端看到的是 127.0.0.1)X-Forwarded-For:记录代理链中的 IPX-Forwarded-Proto:告诉后端原始请求是 HTTP 还是 HTTPS —— 非常重要!
测试完整流程
- 启动 Java 应用(监听 8080)
- 重启 Nginx
- 访问
https://example.com/api/hello
应返回:
{
"message": "Hello from Java backend! 🚀",
"status": "success"
}
成功!
浏览器 → HTTPS(443)→ Nginx → 代理 → Java(8080)→ 响应 → 返回浏览器
Java 中如何获取真实客户端 IP
由于 Nginx 是代理,Java 应用默认看到的是 127.0.0.1。要获取真实 IP,需配置 Spring Boot 识别代理头:
在application.properties中添加:
server.forward-headers-strategy=native
或在 Java 配置类中:
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebConfig {
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return factory -> factory.setRemoteIpValveEnabled(true);
}
}
现在,在 Controller 中:
@GetMapping("/api/ip")
public String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return "Client IP: " + ip;
}
现在你看到的是真实公网 IP,而非 127.0.0.1!
性能优化:Nginx 与 Java 的协同调优
Nginx 调优建议
# 提升并发处理能力
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
# 开启 gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 缓存静态文件
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# 超时设置
client_max_body_size 10M;
client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 10s;
keepalive_timeout 65;
reset_timedout_connection on;
}
Java 应用调优建议
# Tomcat 调优 server.tomcat.max-threads=200 server.tomcat.min-spare-threads=10 server.tomcat.accept-count=100 server.tomcat.connection-timeout=20000 # 响应压缩 server.compression.enabled=true server.compression.mime-types=text/html,text/xml,text/plain,text/css,application/json,application/javascript server.compression.min-response-size=1024 # 避免长时间连接 server.connection-timeout=20000
建议:使用 JMeter 或 wrk 对 /api/hello 接口进行压力测试,观察 Nginx 与 Java 的吞吐量、延迟、错误率。
高级技巧:多域名、多证书、SNI 支持
Nginx 支持 SNI(Server Name Indication),允许一个 IP 地址上托管多个 HTTPS 站点,每个站点使用不同的证书。
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
root /var/www/example;
# ...
}
server {
listen 443 ssl http2;
server_name blog.example.com;
ssl_certificate /etc/ssl/certs/blog.example.com.crt;
ssl_certificate_key /etc/ssl/private/blog.example.com.key;
root /var/www/blog;
# ...
}
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/ssl/certs/api.example.com.crt;
ssl_certificate_key /etc/ssl/private/api.example.com.key;
proxy_pass http://localhost:8081;
# ...
}
SNI 是现代浏览器和操作系统(2010 年后)的标准功能,无需担心兼容性。
安全加固清单(生产环境必做)
| 项目 | 配置建议 |
|---|---|
| SSL 协议 | 仅启用 TLS 1.2 和 TLS 1.3 |
| 密码套件 | 使用 Mozilla 推荐的现代套件 |
| HSTS | max-age=63072000; includeSubDomains; preload |
| X-Frame-Options | DENY 或 SAMEORIGIN |
| X-Content-Type-Options | nosniff |
| Content-Security-Policy | 限制脚本、样式来源(可选) |
| Server 标识 | server_tokens off; 隐藏 Nginx 版本 |
| 文件权限 | 私钥 chmod 600,仅 root 可读 |
| 日志轮转 | 配置 logrotate 防止磁盘爆满 |
| WAF | 可选集成 ModSecurity 或 Cloudflare WAF |
# 隐藏 Nginx 版本 server_tokens off;
负载均衡:Nginx + 多 Java 实例
如果你的 Java 应用部署了多个实例(如 Docker 容器或云服务器),Nginx 可以作为负载均衡器。
upstream java_backend {
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=1;
server 127.0.0.1:8082 weight=1;
keepalive 32;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
location /api/ {
proxy_pass http://java_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
}
}
weight 表示负载权重,3:1:1 表示第一个实例接收 60% 的流量。
此架构可轻松扩展为 10+ 实例,配合 Kubernetes 或 Docker Compose 实现弹性伸缩。
常见问题与排错指南
问题1:访问 443 端口显示“连接被拒绝”
- 检查防火墙:
sudo ufw status - 确保 443 已开放:
sudo ufw allow 'Nginx Full' - 查看端口监听:
sudo ss -tlnp | grep :443 - 检查证书路径是否正确,权限是否为 600
问题2:Java 后端收到的 IP 是 127.0.0.1
- 确保 Nginx 中设置了
proxy_set_header X-Real-IP $remote_addr; - Spring Boot 启用了
server.forward-headers-strategy=native
问题3:HTTPS 报错“证书不被信任”
- 检查证书链是否完整(必须包含中间证书)
- 使用 SSL Labs 分析
- 不要使用自签名证书用于生产环境
问题4:静态资源 404
- 检查
root路径是否正确 - 检查文件权限:
chmod -R 755 /var/www/html - 检查 Nginx 是否有读取权限:
sudo -u nginx ls /var/www/html
总结:80 与 443 的黄金法则
| 原则 | 说明 |
|---|---|
| 80 端口永远只做重定向 | 不提供任何内容,只跳转到 HTTPS |
| 443 端口承载全部服务 | 包含静态资源、API、反向代理 |
| SSL 必须启用现代协议和加密套件 | 禁用 SSLv3、TLS 1.0/1.1 |
| 必须设置安全响应头 | HSTS、X-Frame-Options、X-Content-Type-Options |
| Java 后端应监听本地端口 | 仅通过 Nginx 暴露,提升安全性 |
| 使用负载均衡与缓存提升性能 | 避免单点瓶颈 |
| 配置日志轮转与监控 | 防止磁盘满、快速定位故障 |
结语:构建现代 Web 服务的基石
Nginx 的 80 和 443 端口配置,看似简单,实则是现代 Web 架构的“地基”。它不仅是端口监听,更是安全策略的执行者、性能优化的引擎、系统架构的枢纽。
当你在 Nginx 中写下 listen 443 ssl http2; 的那一刻,你不仅在配置一个服务,更是在为全球数百万用户构建一个安全、快速、可靠的数字通道。
从一个简单的静态页面,到一个承载千万并发的微服务集群,Nginx 始终是那道无声却坚不可摧的防线。
记住:
80 是入口,443 是家园。
安全,从端口开始。
附录:完整生产级 Nginx 配置模板
# /etc/nginx/sites-available/default
upstream java_backend {
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=1;
keepalive 32;
}
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL 配置
ssl_certificate /etc/ssl/certs/example.com.fullchain.pem;
ssl_certificate_key /etc/ssl/private/example.com.privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 安全头
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' https://fonts.googleapis.com;" always;
# 隐藏版本
server_tokens off;
# 静态资源
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# API 反向代理
location /api/ {
proxy_pass http://java_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
# 健康检查
location /health {
access_log off;
return 200 "OK";
}
}
# 启用 gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
将此模板保存为 /etc/nginx/sites-available/your-site,然后软链接到 sites-enabled,重载 Nginx 即可上线。
到此这篇关于Nginx监听80端口和443端口的基础设置的文章就介绍到这了,更多相关Nginx监听端口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Mac使用Nginx设置代理并禁用自带Apache的问题记录
本文介绍如何在Mac上禁用自带的Apache服务并安装Nginx,首先需要关闭Apache并禁止其自启动,接着,通过Homebrew安装Nginx,并配置其文件和目录,最后,介绍了如何生成SSL/自签名证书,详细步骤包括修改Apache配置、安装Nginx、编辑Nginx配置文件以及验证和重启Nginx服务2024-09-09


最新评论