Nginx配置项目
推荐一个网站:tooltt.com/nginx-forma... ,方便用于配置文件nginx.conf的格式化。
本文为Nginx配置项目指南,涵盖Java服务集群负载均衡、Web项目配置及缓存策略。
- 通过定义
upstream
实现Java服务的负载均衡
,将/blogApi/请求转发至后端服务群。 - Web项目配置包括
根
项目与带有资源名
项目的静态资源路径设置,通过try_files
解决前端路由刷新404
问题。 缓存
策略的精细化控制
:为不同项目独立配置缓存
,保持项目缓存隔离
,以及排除特定项目不缓存
。- 如何使用
brotli
和gzip
进行压缩优化
。 - 此外,提供日志管理、HTTPS配置及针对不同客户端的压缩配置方法,确保项目高效运行与资源优化。
1. nginx配置java服务集群
通过 Nginx 配置一个负载均衡的 Java 集群,将访问 /blogApi/
的请求转发到后端的 9001/blogApi
或 9002/blogApi
。
假设自己的服务ip为:117.72.63.33。
- 确保java服务已经启动且没有报错,可以看见API接口文档。
tex
http://117.72.63.33:9001/blogApi/doc.html
http://117.72.63.33:9002/blogApi/doc.html
- 编辑nginx配置文件
nginx
# 定义后端服务器群组
upstream java-blog-cluster {
ip_hash; # 配置会话保持(可选),同一个客户端的请求将始终被转发到同一个后端服务器
server 127.0.0.1:9001 weight=1;
server 127.0.0.1:9002 weight=1;
# 可以根据需要添加更多服务器
}
# 定义服务器
server {
listen 80; # 监听端口
server_name localhost;
# 配置负载均衡
location /blogApi/ {
# 将请求转发到后端服务器群组 (Tomcat没加context-path)
# 这里使用nginx代理了/blogApi/. 使用在线API测试 请求路径会缺少/blogApi,无法正常接口访问;使用axios接口调用方式则不会,建议nginx与context-path配置保持一致
# proxy_pass http://java-blog-cluster;
# 将请求转发到后端服务器群组 Tomcat(有加 context-path: /blogApi)
proxy_pass http://java-blog-cluster/blogApi/;
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;
}
}
- 检测及访问测试
bash
# 检验配置文件是否有误
nginx -t
# 重新加载配置
sudo systemctl reload nginx
# 访问测试 浏览器输入 http://117.72.63.33/blogApi/doc.html
2. 配置web项目
2.1 配置根项目
nginx
location / {
# 网站根目录设置
root /usr/local/project/web/blog/blog_dist;
# 默认索引文件(按顺序尝试)
index index.html index.htm;
# 路由重定向规则(解决前端路由刷新404问题)
try_files $uri $uri/ /index.html;
# 安全设置:禁用目录文件列表
autoindex off;
}
2.2 配置带资源名的项目
nginx
# 后台管理系统配置 (admin)
location /admin {
# 静态资源路径(使用alias时结尾必须加/)
alias /usr/local/project/web/blog/blog_admin_dist/;
# 默认索引文件
index index.html index.htm;
# 路由处理规则(解决Vue/React路由刷新404问题)
try_files $uri $uri/ /admin/index.html;
# 安全设置:禁止目录列表
autoindex off;
}
3. 个人配置参考
3.1 手动创建日志文件并授权
3.1.1 创建日志目录和文件
bash
# 创建日志目录(如果不存在)
sudo mkdir -p /var/log/nginx/
# 创建 HTTPS 访问日志和错误日志文件
sudo touch /var/log/nginx/https-access.log
sudo touch /var/log/nginx/https-error.log
3.1.2 为 smallhui 用户授权
bash
# 将日志文件所有权改为 smallhui 用户(推荐方案)
sudo chown smallhui:nginx /var/log/nginx/https-*.log
# 设置正确的文件权限(确保 Nginx 可以写入)
sudo chmod 640 /var/log/nginx/https-*.log
3.2 配置文件参考如下
/etc/nginx/nginx.conf
bash
# 定义运行Nginx工作进程的用户和组
# nobody是一个低权限系统用户,提高安全性
user nobody;
# 定义工作进程数量,通常设置为CPU核心数或自动(auto)
worker_processes auto;
# 事件处理模块配置
events {
# 每个工作进程的最大连接数(直接影响服务器并发能力)
worker_connections 1024;
}
# HTTP服务器主配置块
http {
# 包含MIME类型定义文件(/etc/nginx/mime.types)
# 该文件定义了不同文件扩展名对应的Content-Type
include mime.types;
# 默认MIME类型(当无法识别文件类型时使用)
# application/octet-stream表示二进制流下载
default_type application/octet-stream;
# 启用高效文件传输模式(零拷贝技术)
# 提升静态文件传输性能
sendfile on;
# 客户端保持连接的超时时间(单位:秒)
# 超过这个时间没有活动,连接将被关闭
keepalive_timeout 65;
# Brotli 全局压缩配置(现代浏览器优先)
brotli on; # 启用 Brotli 压缩
brotli_static on; # 优先使用预压缩的 .br 文件
brotli_comp_level 6; # 压缩级别 1-11(6 是性能与压缩率的平衡点)
brotli_min_length 256; # 只压缩大于 256 字节的文件
brotli_types text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
application/x-javascript
application/xhtml+xml
image/svg+xml;
# Gzip 全局压缩配置(兼容旧版浏览器)
gzip on; # 启用 Gzip 压缩
gzip_static on; # 优先使用预压缩的 .gz 文件
gzip_comp_level 6; # 压缩级别 1-9(6 是性能与压缩率的平衡点)
gzip_min_length 256; # 只压缩大于 256 字节的文件
gzip_types text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
application/x-javascript
application/xhtml+xml
image/svg+xml;
# 定义日志格式
log_format custom
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$request_time';
# 定义 blog-admin 管理系统 API 服务器群组
upstream java-blog-admin-cluster {
ip_hash; # 配置会话保持(可选),同一个客户端的请求将始终被转发到同一个后端服务器
server 127.0.0.1:9001 weight=1;
# 可以根据需要添加更多服务器
}
# 定义 blog 网页 API 服务器群组
upstream java-blog-cluster {
ip_hash; # 配置会话保持(可选),同一个客户端的请求将始终被转发到同一个后端服务器
server 127.0.0.1:9101 weight=1;
# 可以根据需要添加更多服务器
}
# HTTP server
server {
listen 80;
server_name pzhdv.cn www.pzhdv.cn; # 替换为你的域名或 IP 地址
# 将所有 HTTP 请求重定向到 HTTPS
return 301 https://$host$request_uri;
}
# HTTPS server
server {
listen 443 ssl;
server_name pzhdv.cn www.pzhdv.cn; # 替换为你的域名或 IP 地址
# SSL 配置
ssl_certificate /usr/local/resource/ssl/pzhdv.cn.pem; # 证书路径
ssl_certificate_key /usr/local/resource/ssl/pzhdv.cn.key; # 证书路径
# 增强 SSL 安全
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# 启用 HSTS(HTTP Strict Transport Security)
# 强制客户端在后续请求中始终使用 HTTPS
# max-age=31536000 表示 HSTS 策略的有效期为 1 年
# includeSubDomains 表示 HSTS 策略适用于所有子域名
# always 表示即使响应状态码不是 200,也添加该头
add_header Strict-Transport-Security
"max-age=31536000; includeSubDomains"
always;
# 日志文件
access_log /var/log/nginx/https-access.log custom;
error_log /var/log/nginx/https-error.log;
# 匹配以 /admin/ 开头的路径(包括多级子文件)
# 为以 .js, .css, .json, .xml, .svg, .jpg, .jpeg, .png, .gif, .ico, .woff, .woff2, .ttf, .eot 结尾的文件添加缓存
location ~* ^/admin/(.*\.(js|css|json|xml|svg|jpg|jpeg|png|gif|ico|woff|woff2|ttf|eot))$ {
# 使用 $1 捕获 /admin/ 后的路径
alias /usr/local/project/web/blog/blog_admin_dist/$1;
# 设置缓存有效期为 3 天
add_header Cache-Control "public, max-age=259200";
expires 3d;
# 优先使用预压缩文件
brotli_static on;
gzip_static on;
}
# 配置 admin 项目
location /admin {
alias /usr/local/project/web/blog/blog_admin_dist/; # 替换为你的实际项目路径
index index.html index.htm;
try_files $uri $uri/ /admin/index.html; # 解决刷新 404
autoindex off; # 关闭自动目录列表
}
# 匹配 Vue 或 React 项目的静态资源文件(根项目 /)
# 排除了以 /admin/、/blogApi/ 和 /blogAdminApi/ 开头的路径(包含子文件)
# 为以 .js, .css, .json, .xml, .svg, .jpg, .jpeg, .png, .gif, .ico, .woff, .woff2, .ttf, .eot 结尾的文件(包含多级路径)添加缓存
location ~* ^(?!\/admin\/)(?!\/blogApi\/)(?!\/blogAdminApi\/).*\.(js|css|json|xml|svg|jpg|jpeg|png|gif|ico|woff|woff2|ttf|eot)$ {
# 静态资源路径
root /usr/local/project/web/blog/blog_dist;
# 设置缓存有效期为 1 年
add_header Cache-Control "public, max-age=31536000";
expires 1y;
# 优先使用预压缩的 .br 文件
brotli_static on;
# 优先使用预压缩的 .gz 文件
gzip_static on;
}
# 匹配 HTML 文件(如 Vue 或 React 的单页应用) (根项目 /)
# 排除了以 /admin/、/blogApi/ 和 /blogAdminApi/ 开头的路径(包含子文件)
# 为以 .html 或 .htm 结尾的文件(包含多级路径)添加缓存
location ~* ^(?!\/admin\/)(?!\/blogApi\/)(?!\/blogAdminApi\/).*\.(html|htm)$ {
# 静态资源路径
root /usr/local/project/web/blog/blog_dist;
# 设置缓存有效期为 1 周
add_header Cache-Control "public, max-age=604800";
expires 1w;
# 优先使用预压缩的 .br 文件
brotli_static on;
# 优先使用预压缩的 .gz 文件
gzip_static on;
}
# 配置 web 项目
location / {
root /usr/local/project/web/blog/blog_dist;
index index.html index.htm;
try_files $uri $uri/ /index.html; # 解决刷新 404
autoindex off; # 关闭自动目录列表
}
# 配置负载均衡
location /blogApi/ {
# 将请求转发到后端服务器群组的 (Tomcat没有加context-path)
# 这里使用nginx代理了/blogApi/. 使用在线API测试 会缺少/blogApi,使用axios接口调用方式则不会,建议nginx与context-path配置保持一致
#proxy_pass http://java-blog-cluster/;
# 将请求转发到后端服务器群组的 Tomcat(有加 context-path: /blogApi)
proxy_pass http://java-blog-cluster/blogApi/;
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 /blogAdminApi/ {
# 将请求转发到后端服务器群组的 (Tomcat没有加context-path)
# 这里使用nginx代理了/blogAdminApi/. 使用在线API测试 会缺少/blogAdminApi,使用axios接口调用方式则不会,建议nginx与context-path配置保持一致
#proxy_pass http://java-blog-cluster/;
# 将请求转发到后端服务器群组的 Tomcat(有加 context-path: /blogAdminApi)
proxy_pass http://java-blog-admin-cluster/blogAdminApi/;
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;
}
}
}
通过上面配置、即可为你的项目配置缓存、且能保持项目缓存的独立,以及如何将某些项目排除与缓存之外。
3.3 拓展:针对不同客户端配置 Brotli 和 Gzip 压缩
如果客户端 A 需要使用 Brotli 压缩,而客户端 B 需要使用 Gzip 压缩,可以通过以下步骤实现:
-
关闭全局 Brotli 和 Brotli Static : 在全局
http
块中将brotli
和brotli_static
设置为off
。 -
为客户端 A 保留 Brotli 配置 : 在客户端 A 的
server
或location
块中保持 Brotli 配置不变(即不关闭brotli
和brotli_static
)。 -
为客户端 B 关闭 Brotli Static : 在客户端 B 的
server
或location
块中,将brotli_static
设置为off
,并确保启用 Gzip 压缩。 -
强制刷新配置: 修改配置后,执行以下命令强制刷新 Nginx 配置:
bashsudo systemctl reload nginx
-
验证效果:
- 客户端 A 应该能够接收到 Brotli 压缩的内容。
bashhttps://www.xxxx/A
如果服务器返回的内容使用了 Brotli 压缩,响应头中会包含
Content-Encoding: br
。- 客户端 B 应该能够接收到 Gzip 压缩的内容。
bashhttps://www.xxxx/B
如果服务器返回的内容使用了 Gzip 压缩,响应头中会包含
Content-Encoding: gzip
。