Centos项目部署之Nginx部署项目

Nginx配置项目

推荐一个网站:tooltt.com/nginx-forma... ,方便用于配置文件nginx.conf的格式化。

本文为Nginx配置项目指南,涵盖Java服务集群负载均衡、Web项目配置及缓存策略。

  • 通过定义upstream实现Java服务的负载均衡,将/blogApi/请求转发至后端服务群。
  • Web项目配置包括项目与带有资源名项目的静态资源路径设置,通过try_files解决前端路由刷新404问题。
  • 缓存策略的精细化控制为不同项目独立配置缓存保持项目缓存隔离以及排除特定项目不缓存
  • 如何使用brotligzip进行压缩优化
  • 此外,提供日志管理、HTTPS配置及针对不同客户端的压缩配置方法,确保项目高效运行与资源优化。

1. nginx配置java服务集群

通过 Nginx 配置一个负载均衡的 Java 集群,将访问 /blogApi/ 的请求转发到后端的 9001/blogApi9002/blogApi

假设自己的服务ip为:117.72.63.33。

  1. 确保java服务已经启动且没有报错,可以看见API接口文档。
tex 复制代码
http://117.72.63.33:9001/blogApi/doc.html 
http://117.72.63.33:9002/blogApi/doc.html
  1. 编辑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;
    }
}
  1. 检测及访问测试
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 压缩,可以通过以下步骤实现:

  1. 关闭全局 Brotli 和 Brotli Static : 在全局 http 块中将 brotlibrotli_static 设置为 off

  2. 为客户端 A 保留 Brotli 配置 : 在客户端 A 的 serverlocation 块中保持 Brotli 配置不变(即不关闭 brotlibrotli_static)。

  3. 为客户端 B 关闭 Brotli Static : 在客户端 B 的 serverlocation 块中,将 brotli_static 设置为 off,并确保启用 Gzip 压缩。

  4. 强制刷新配置: 修改配置后,执行以下命令强制刷新 Nginx 配置:

    bash 复制代码
    sudo systemctl reload nginx
  5. 验证效果

    • 客户端 A 应该能够接收到 Brotli 压缩的内容。
    bash 复制代码
    https://www.xxxx/A

    如果服务器返回的内容使用了 Brotli 压缩,响应头中会包含 Content-Encoding: br

    • 客户端 B 应该能够接收到 Gzip 压缩的内容。
    bash 复制代码
    https://www.xxxx/B

    如果服务器返回的内容使用了 Gzip 压缩,响应头中会包含 Content-Encoding: gzip

相关推荐
tan77º2 小时前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp
czhc11400756632 小时前
Linux 76 rsync
linux·运维·python
蓝易云3 小时前
Qt框架中connect()方法的ConnectionType参数使用说明 点击改变文章字体大小
linux·前端·后端
dyj0953 小时前
【Rancher Server + Kubernets】- Nginx-ingress日志持久化至宿主机
运维·nginx·rancher
花落已飘3 小时前
多线程 vs 异步
linux·网络·系统架构
码出钞能力4 小时前
linux内核模块的查看
linux·运维·服务器
星辰云-5 小时前
# Linux Centos系统硬盘分区扩容
linux·运维·centos·磁盘扩容
Hellc0075 小时前
Nginx 高级 CC 与 DDoS 防御策略指南
运维·nginx·ddos
聽雨2375 小时前
02每日简报20250704
linux·科技·金融·生活·社交电子·娱乐·媒体