Nginx通用部署
Nginx常见参数介绍
Nginx 配置文件中的指令和参数决定了它的行为。下面详细介绍一些常见的 Nginx 参数,以帮助你更好地理解和配置 Nginx。
1. worker_processes
worker_processes auto;
- 作用:设置 Nginx 处理请求的工作进程数量。
auto
会根据 CPU 的核心数自动调整,或者你可以手动设置为特定的值。 - 建议:通常将其设置为服务器 CPU 核心数,以最大化性能。如果服务器是多核的,使用
auto
是推荐做法。
2. worker_connections
worker_connections 1024;
- 作用:每个 Nginx 工作进程能够处理的最大连接数。Nginx 的最大并发连接数是
worker_processes * worker_connections
。 - 建议:如果你有大量的并发请求,适当增加该值。根据硬件和流量需求进行调整。
3. events
events {worker_connections 1024;
}
- 作用:设置与网络事件处理相关的配置,比如连接的并发数和选择的事件模型。
- 参数:
use
: 指定 Nginx 使用的事件处理模型,常见的是epoll
(Linux)或kqueue
(FreeBSD、MacOS)。worker_connections
: 如上所述,定义每个工作进程的最大连接数。
4. http
http {include /etc/nginx/mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;...
}
- 作用:HTTP 块是 Nginx 配置文件中最重要的块,包含了所有与 HTTP 相关的配置。
- 常见配置:
include /etc/nginx/mime.types
: 引入 MIME 类型配置文件,帮助 Nginx 正确地返回文件的 MIME 类型。default_type
: 设置默认的 MIME 类型,如果无法自动识别某种文件的 MIME 类型,默认会用该类型,通常为application/octet-stream
。sendfile on
: 启用 sendfile 选项,加速文件传输,建议保持开启。keepalive_timeout 65
: 设置保持连接超时时间,单位为秒,表示客户端和服务器之间空闲连接的最大持续时间。
5. server
server {listen 80;server_name example.com;...
}
- 作用:
server
块用于定义一个虚拟主机,配置不同域名或 IP 地址对应的服务器行为。 - 常见配置:
listen 80
: 监听指定的端口,80 为 HTTP 的默认端口,443 为 HTTPS 默认端口。server_name
: 定义该服务器块的域名(如example.com
),可以使用通配符,如*.example.com
,也可以使用 IP 地址。
6. location
location / {proxy_pass http://localhost:8080;...
}
- 作用:
location
指令用于匹配 URL 路径,并为该路径定义不同的处理方式。它通常用于反向代理、静态文件服务等。 - 常见配置:
proxy_pass
: 将请求代理到后端服务器。可以是本地应用或远程服务器。root
: 定义处理该路径时所使用的根目录。比如用于静态资源的存放路径。index
: 指定默认的主页文件,当访问某目录时,会默认查找的文件(如index.html
)。
7. proxy_pass
location / {proxy_pass http://localhost:8080;
}
- 作用:
proxy_pass
是 Nginx 中用于反向代理的核心指令,它将匹配到的请求转发给指定的后端服务器。 - 说明:
proxy_pass
可以代理 HTTP、HTTPS 甚至 FastCGI、uwsgi 等多种协议。
8. upstream
upstream backend {server backend1.example.com weight=5;server backend2.example.com;server 127.0.0.1:8080;
}
- 作用:
upstream
定义后端服务器集群,用于负载均衡。在proxy_pass
中可以将请求转发到upstream
定义的服务器组。 - 常见配置:
server
: 定义一个后端服务器,可以使用 IP 地址或域名。weight
: 为某个后端服务器分配更大的权重,默认值是 1。max_fails
和fail_timeout
: 控制某台后端服务器在多少次失败后被认为不可用,以及多久后再重新尝试。
9. gzip
gzip on;
gzip_types text/plain application/json;
- 作用:启用或关闭响应的压缩功能,以减少传输的数据大小,提升性能。
- 常见配置:
gzip
: 启用或禁用压缩功能,设置为on
或off
。gzip_types
: 定义哪些 MIME 类型的文件会被压缩,常见的有text/html
、application/json
等。
10. log_format
和 access_log
log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
- 作用:
log_format
用于定义访问日志的记录格式,而access_log
用于指定日志的存储位置和使用的日志格式。 - 常见配置:
$remote_addr
: 记录客户端 IP 地址。$status
: 记录请求的 HTTP 状态码。$body_bytes_sent
: 记录响应内容的大小(字节数)。
11. error_log
error_log /var/log/nginx/error.log warn;
- 作用:配置错误日志文件的位置和记录级别。
- 日志级别:
debug
: 记录所有级别的日志,包括调试信息。info
: 记录一般的运行信息。notice
: 记录需要注意的事件。warn
: 记录警告信息。error
: 记录错误信息。crit
: 记录严重错误。
12. client_max_body_size
client_max_body_size 50m;
- 作用:限制客户端请求主体的最大大小。如果请求体超过这个限制,Nginx 会返回 413(Request Entity Too Large)错误。
- 建议:在上传大文件时,可以适当增加这个值。
13. keepalive_timeout
keepalive_timeout 65;
- 作用:设置客户端和服务器之间保持活动的连接的超时时间。超时后连接会被关闭。
- 建议:根据需求调整,默认 65 秒适合大多数场景。
14. listen
listen 80;
listen [::]:80;
- 作用:配置服务器监听的端口,通常是 HTTP 的 80 端口或 HTTPS 的 443 端口。
- 参数:
[::]:80
: 表示监听所有 IPv6 地址。ssl
: 用于启用 SSL/TLS 加密。
15. ssl_certificate
和 ssl_certificate_key
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
- 作用:在配置 HTTPS 时,
ssl_certificate
指定 SSL 证书的位置,ssl_certificate_key
指定私钥的位置。
16. return
return 301 https://$server_name$request_uri;
- 作用:用于执行重定向或返回特定的 HTTP 状态码。
- 参数:
301
: 返回 301 永久重定向。302
: 返回 302 临时重定向。
以上是 Nginx 配置文件中一些重要参数的详细介绍。根据你的应用场景,这些参数可以灵活组合使用,帮助你优化 Nginx 的性能和功能。
Nginx部署Java服务
Nginx 是一个轻量级、高性能的 Web 服务器,常用于反向代理、负载均衡和静态资源服务。下面详细讲解如何配置 Nginx 以部署 Java 服务。
1. 安装 Nginx
在大多数 Linux 发行版上,使用包管理器安装 Nginx:
# Ubuntu/Debian
sudo apt update
sudo apt install nginx# CentOS/RHEL
sudo yum install nginx
启动和检查 Nginx 是否正常运行:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
2. Nginx 基础配置文件
Nginx 的主配置文件通常位于 /etc/nginx/nginx.conf
。典型的目录结构如下:
/etc/nginx/nginx.conf
: 主配置文件/etc/nginx/conf.d/
: 存放其他虚拟主机配置/var/www/
: 默认的网站根目录
Nginx 的基本配置结构如下:
worker_processes auto;
events {worker_connections 1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;include /etc/nginx/conf.d/*.conf;
}
3. 配置反向代理(用于 Java 服务)
假设你有一个基于 Spring Boot 的 Java 应用程序运行在 http://localhost:8080
。你可以通过 Nginx 将外部请求转发给该 Java 服务。
在 /etc/nginx/conf.d/
下创建一个配置文件,如 java_app.conf
:
server {listen 80;server_name example.com; # 将其替换为你的域名或服务器IPlocation / {proxy_pass http://localhost:8080; # 代理到 Java 服务的地址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;}
}
说明:
listen 80
: 监听 HTTP 80 端口。server_name
: 配置你的域名或 IP 地址。proxy_pass
: 将请求代理到运行 Java 应用程序的本地地址(例如,localhost:8080)。proxy_set_header
: 传递客户端请求的一些信息到后端 Java 应用,比如 IP 地址和协议。
4. 配置 SSL(HTTPS)
为了保证安全,建议使用 HTTPS。可以通过 Let’s Encrypt 获取免费 SSL 证书。
安装 certbot 工具:
# Ubuntu
sudo apt install certbot python3-certbot-nginx
然后运行以下命令为你的域名获取证书:
sudo certbot --nginx -d example.com
Nginx 会自动配置 HTTPS。生成的配置大致如下:
server {listen 443 ssl;server_name example.com;ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;location / {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;}
}server {listen 80;server_name example.com;return 301 https://$host$request_uri;
}
说明:
- 443 端口用于 SSL。
- 配置 SSL 证书路径,
/etc/letsencrypt/live/
存放的是通过 Let’s Encrypt 获取的证书。 - 第二个
server
块会将所有 HTTP 请求重定向到 HTTPS。
5. Nginx 配置负载均衡
如果你的 Java 服务部署在多台服务器上,可以使用 Nginx 做负载均衡。配置示例:
upstream java_backend {server 192.168.1.10:8080;server 192.168.1.11:8080;server 192.168.1.12:8080;
}server {listen 80;server_name example.com;location / {proxy_pass http://java_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;proxy_set_header X-Forwarded-Proto $scheme;}
}
说明:
upstream
块定义了一个名为java_backend
的后端服务器组,可以配置多个 IP 地址进行负载均衡。proxy_pass
将请求转发给该服务器组。
6. 常见 Nginx 命令
# 检查配置是否正确
sudo nginx -t# 重新加载 Nginx 配置
sudo systemctl reload nginx# 查看 Nginx 状态
sudo systemctl status nginx
7. 日志管理
Nginx 的访问日志和错误日志通常位于 /var/log/nginx/access.log
和 /var/log/nginx/error.log
。
可以在 server
块中自定义日志路径:
server {listen 80;server_name example.com;access_log /var/log/nginx/java_app_access.log;error_log /var/log/nginx/java_app_error.log;location / {proxy_pass http://localhost:8080;}
}
Nginx配置举例
Nginx配置websocket
在基于 STOMP 协议的 WebSocket 应用中,如果你通过 Nginx 作为反向代理来处理 HTTPS(SSL/TLS)连接,并且需要支持 WebSocket,则需要确保 Nginx 正确处理 WebSocket 升级请求,同时配置 SSL 证书来启用 HTTPS。
以下是如何在 Nginx 中配置 HTTPS,并支持基于 STOMP 协议的 WebSocket。
步骤一:准备 SSL 证书
要启用 HTTPS,首先你需要 SSL 证书。如果你没有 SSL 证书,可以使用以下方式获取:
- 自签名证书(测试使用):可以使用
openssl
工具生成自签名证书。 - Let’s Encrypt:可以通过 Let’s Encrypt 免费获取 SSL 证书(适合生产环境)。
生成自签名证书(测试使用):
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/server.key -out /etc/nginx/ssl/server.crt
- 生成一个有效期为 365 天的自签名 SSL 证书和密钥文件,并将其存储在
/etc/nginx/ssl/
路径下。
步骤二:配置 Nginx 支持 HTTPS 和 WebSocket
配置 Nginx 来支持 HTTPS 和 WebSocket 升级请求。在 Nginx 的 server
配置块中,需要同时启用 SSL 并配置 WebSocket 的 Upgrade
和 Connection
头部。
完整的 Nginx 配置示例:
server {listen 443 ssl;server_name your-domain.com; # 替换为你的域名或服务器 IP 地址# 配置 SSL 证书ssl_certificate /etc/nginx/ssl/server.crt; # 替换为你的 SSL 证书路径ssl_certificate_key /etc/nginx/ssl/server.key; # 替换为你的 SSL 私钥路径# SSL 配置ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;# WebSocket 相关配置location /ws {proxy_pass http://localhost:31004; # 代理到后端 WebSocket 服务proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";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;proxy_read_timeout 3600;proxy_send_timeout 3600;proxy_set_header X-NginX-Proxy true;}# 通常的 HTTP/HTTPS 请求location / {proxy_pass http://localhost:8080; # 代理到你的应用服务,例如Spring Boot应用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 到 HTTPS
server {listen 80;server_name your-domain.com;location / {return 301 https://$host$request_uri; # 强制将 HTTP 重定向到 HTTPS}
}
关键配置解释:
-
SSL 证书配置:
ssl_certificate
和ssl_certificate_key
:指定 SSL 证书和私钥的路径,用于 HTTPS 加密。ssl_protocols
和ssl_ciphers
:定义支持的 SSL/TLS 协议和加密套件。
-
WebSocket 升级:
proxy_set_header Upgrade $http_upgrade;
:告诉 Nginx 将普通的 HTTP 请求升级为 WebSocket 连接。proxy_set_header Connection "Upgrade";
:确保Connection
头部被正确设置为Upgrade
。proxy_read_timeout
和proxy_send_timeout
:配置 WebSocket 连接的超时,防止连接因空闲时间过长而被关闭。
-
代理到 WebSocket 服务:
proxy_pass http://localhost:31004;
:将 WebSocket 请求代理到后端实际运行的 WebSocket 服务器(例如运行 STOMP WebSocket 的 Spring Boot 服务)。
-
HTTP 重定向到 HTTPS:
- 配置第二个
server
块,监听端口80
,将所有 HTTP 请求重定向到 HTTPS。
- 配置第二个
步骤三:配置 Spring Boot WebSocket 支持
后端 Spring Boot 项目需要正确配置 WebSocket 支持,确保 WebSocket 端点和 STOMP 协议配置一致。
Spring Boot WebSocket 配置示例:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {// 这里的 /ws 是 WebSocket 连接端点,前端需要通过这个路径连接registry.addEndpoint("/ws").setAllowedOrigins("*") // 允许跨域,或者指定域名.withSockJS(); // 如果需要兼容旧版浏览器,可以启用 SockJS}@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {// 配置消息代理config.enableSimpleBroker("/topic", "/queue");config.setApplicationDestinationPrefixes("/app");}
}
步骤四:前端 WebSocket 连接
在前端代码中,确保 WebSocket 连接使用 wss://
协议,因为你正在通过 HTTPS 加密连接。
前端示例代码:
// 使用 wss:// 进行 WebSocket 连接
const wsUrl = 'wss://your-domain.com/ws';
const socket = new WebSocket(wsUrl);// 使用 STOMP 协议
const stompClient = Stomp.over(socket);stompClient.connect({}, function (frame) {console.log('Connected: ' + frame);// 订阅消息stompClient.subscribe('/topic/messages', function (message) {console.log('Received: ' + message.body);});// 发送消息stompClient.send('/app/hello', {}, JSON.stringify({ name: 'Hello World' }));
}, function (error) {console.error('Connection error: ', error);
});
常见问题及排查:
-
SSL 证书问题:
- 如果浏览器提示 SSL 证书无效,可能是因为使用了自签名证书。为了在生产环境中避免这种情况,建议使用 Let’s Encrypt 或其他可信的 CA 机构签发的证书。
-
WebSocket 升级失败:
- 如果 Nginx 没有正确处理 WebSocket 升级,可能会导致连接失败。检查 Nginx 日志以及浏览器开发者工具中的网络请求,确保请求的
Upgrade
和Connection
头部被正确处理。
- 如果 Nginx 没有正确处理 WebSocket 升级,可能会导致连接失败。检查 Nginx 日志以及浏览器开发者工具中的网络请求,确保请求的
-
跨域问题:
- 如果前端和后端的域名或端口不一致,可能会导致跨域问题。确保 Nginx 和后端应用正确配置了
CORS
。
- 如果前端和后端的域名或端口不一致,可能会导致跨域问题。确保 Nginx 和后端应用正确配置了
-
客户端使用 HTTPS:
- 如果前端页面是通过 HTTPS 访问的,WebSocket 连接必须使用
wss://
协议,否则浏览器会阻止不安全的连接。
- 如果前端页面是通过 HTTPS 访问的,WebSocket 连接必须使用
总结
通过上述步骤,你可以在 Nginx 中配置 HTTPS,并支持基于 STOMP 协议的 WebSocket。关键在于:
- 正确处理 WebSocket 的升级请求,确保 Nginx 代理能够支持 WebSocket 连接。
- 配置 SSL 证书,以启用 HTTPS 和 WSS 加密连接。
- Spring Boot 的 WebSocket 端点配置,确保前端能够连接到正确的 WebSocket 服务。