深度解析 Nginx 配置:从性能优化到 HTTPS 安全实践

引言

Nginx 作为高性能的 Web 服务器和反向代理,其配置灵活性和强大功能备受开发者青睐。本文基于一份生产环境的 Nginx 配置文件,详细拆解其核心配置逻辑,涵盖性能优化、HTTPS 安全配置、反向代理及静态资源处理等关键环节,帮助读者理解如何构建高效可靠的 Nginx 服务。

一、全局配置:进程管理与日志系统

1. 进程管理

user  nginx;
worker_processes  auto;
pid        /var/run/nginx.pid;
  • user nginx:指定 Nginx 工作进程运行的用户,通常使用非 root 用户以增强安全性。

  • worker_processes auto:自动根据服务器 CPU 核心数设置工作进程数,充分利用多核性能。生产环境建议设为 CPU 核心数或其 2 倍。

2. 日志系统

error_log  /var/log/nginx/error.log notice;
access_log  /var/log/nginx/access.log buffer=16k flush=1m main;
error_log  /var/log/nginx/error.log error;
  • 错误日志

    • error_log /var/log/nginx/error.log notice;:全局错误日志级别为 notice,记录普通警告信息。

    • error_log /var/log/nginx/error.log error;:在 http 块中覆盖为 error 级别,仅记录严重错误,减少日志冗余。

  • 访问日志

    • buffer=16k flush=1m:启用 16KB 缓冲区,每 1 分钟强制写入磁盘,减少 I/O 操作,提升高并发下的性能。

    • log_format main:自定义日志格式,包含客户端 IP、请求时间、状态码、用户代理等关键信息,便于后续分析。

二、Events 模块:连接处理优化

events {worker_connections  1024;
}
  • worker_connections 1024:每个工作进程的最大连接数。计算公式:worker_processes * worker_connections 为 Nginx 最大并发连接数。生产环境可根据内存调整(如 4096),但需注意系统文件句柄限制(可通过 ulimit -n 查看)。

三、HTTP 核心配置:性能与压缩

1. 基础性能优化

http {sendfile        on;tcp_nopush     on;keepalive_timeout  65;
}
  • sendfile on:启用零拷贝传输,减少 CPU 消耗,提升静态文件传输效率。

  • tcp_nopush on:配合 sendfile,将多个小数据包合并为一个大数据包发送,减少网络延迟。

  • keepalive_timeout 65:长连接超时时间,避免无效连接占用资源。

2. Gzip 压缩配置

gzip on;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types text/plain text/css application/javascript application/json;
gzip_disable "msie6|trident";
  • gzip on:启用压缩,通常可将文本类资源压缩至原大小的 1/4。

  • comp_level 6:压缩级别(1-9),6 为平衡压缩率与 CPU 消耗的推荐值。

  • min_length 256:仅压缩大于 256 字节的资源,避免小文件压缩后体积反而增大。

  • gzip_types:指定压缩的 MIME 类型,优先压缩 HTML、CSS、JS、JSON 等文本内容。

  • gzip_disable:禁用对旧浏览器(如 IE6)的压缩,避免兼容性问题。

四、HTTPS 配置:安全通信与性能平衡

1. 强制 HTTPS 重定向

server {listen 80;server_name 域名或IP地址;return 301 https://$host$request_uri;
}
  • 通过 80 端口的 server 块,将所有 HTTP 请求永久重定向(301)至 HTTPS,确保通信安全。

2. HTTPS 核心配置

server {listen 443 ssl http2;server_name 域名或IP地址;ssl_certificate     ssl证书配置的pem;ssl_certificate_key ssl证书配置的key;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:...;ssl_prefer_server_ciphers on;
}
  • 协议与加密算法

    • ssl_protocols:仅启用 TLSv1.2 和 TLSv1.3,禁用不安全的旧协议(如 SSLv3、TLSv1.0)。

    • ssl_ciphers:使用现代加密算法,优先选择 ECDHE 算法,提供前向保密(FS)。

    • ssl_prefer_server_ciphers on:服务端优先选择加密算法,增强安全性。

  • 性能优化

    • ssl_session_cache shared:SSL:10m:共享 SSL 会话缓存,减少重复握手开销。

    • ssl_session_timeout 10m:会话缓存超时时间,合理设置可提升连接复用率。

3. 安全响应头

add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";
  • X-Content-Type-Options nosniff:防止浏览器误判资源 MIME 类型,避免 XSS 攻击。

  • X-Frame-Options DENY:禁止页面被嵌入到 iframe 中,防范点击劫持。

  • Strict-Transport-Security:强制浏览器使用 HTTPS 连接,有效期 1 年(max-age=31536000),包含子域名。

五、反向代理与动态服务

1. 反向代理至 FastAPI 服务

location / {proxy_pass http://fastapi:8000;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_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
}
  • 请求头透传

    • X-Real-IP 和 X-Forwarded-For:传递客户端真实 IP,便于后端服务记录和验证。

    • Upgrade 和 Connection:支持 WebSocket 协议升级,确保动态服务兼容性。

  • 超时设置

    • proxy_connect_timeout 30s:连接上游服务器的超时时间。

    • proxy_read_timeout 86400s:读取上游响应的超时时间(长连接场景可设为大值)。

六、静态资源处理

location /static/ {expires 3h;add_header Cache-Control "max-age=10800, public";alias /path/to/static/files/;  # 需替换为实际路径try_files $uri =404;
}
  • 缓存控制

    • expires 3h 和 Cache-Control: max-age=10800:强制浏览器缓存静态资源 3 小时,减少重复请求。

  • 路径映射

    • alias:将 /static/ 前缀替换为实际文件路径(如 /var/www/static/),避免 root 导致的路径重复问题。

  • 错误处理try_files $uri =404 确保不存在的文件直接返回 404,提升响应速度。

七、配置验证与最佳实践

1. 语法检查

nginx -t  # 验证配置文件语法正确性

2. 性能调优建议

  • 连接数优化:根据服务器内存调整 worker_connections(公式:worker_processes * worker_connections <= 系统最大文件句柄数)。

  • SSL 证书管理:使用 Let’s Encrypt 自动续签证书,避免证书过期导致服务中断。

  • 日志分析:结合 ELK Stack 或 Prometheus 分析访问日志,监控异常请求和慢响应。

八、示例nginx.conf文件

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log buffer=16k flush=1m main;error_log  /var/log/nginx/error.log error;sendfile        on;tcp_nopush     on;keepalive_timeout  65;# 压缩文件配置gzip on;gzip_comp_level 6;gzip_min_length 256;gzip_buffers 16 8k;gzip_http_version 1.1;gzip_vary on;# 压缩文件类型gzip_typestext/plaintext/csstext/javascriptapplication/javascriptapplication/jsonapplication/xmlapplication/xml+rssapplication/xhtml+xml;# 禁用对旧浏览器的压缩gzip_disable "msie6|trident";include /etc/nginx/conf.d/*.conf;# 关键配置server {listen 80;server_name 域名或IP地址;return 301 https://$host$request_uri;}server {listen 443 ssl http2;server_name 域名或IP地址;# SSL 证书配置ssl_certificate    ssl证书配置的pem;ssl_certificate_key    ssl证书配置的key;# SSL 安全配置(优化后)ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;ssl_prefer_server_ciphers on;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_session_tickets off;error_page 497 https://$host$request_uri;# 安全头add_header X-Content-Type-Options nosniff;add_header X-Frame-Options DENY;add_header X-XSS-Protection "1; mode=block";add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";# 反向代理location / {# 使用服务名或网络别名代替本地地址,不支持httpsproxy_pass http://fastapi:8000;# 基础请求头设置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;# WebSocket 支持proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";# 超时设置 (根据实际需求调整)proxy_connect_timeout 30s;proxy_read_timeout 86400s;proxy_send_timeout 30s;# 可选: 缓冲区设置proxy_buffering on;proxy_buffer_size 4k;proxy_buffers 4 32k;}# 静态资源location /static/ {expires 3hadd_header Cache-Control "max-age=10800, public";alias 文件路径try_files $uri =404;}}
}

九、总结

本文拆解的 Nginx 配置涵盖了性能优化、HTTPS 安全、反向代理及静态资源管理的核心逻辑。关键亮点包括:

  • 通过 sendfile、Gzip 压缩和长连接配置提升性能;

  • 严格的 HTTPS 配置与安全响应头增强数据传输安全;

  • 灵活的反向代理与 WebSocket 支持适配现代应用架构。

实际部署时,需根据业务场景调整参数(如超时时间、缓存策略),并定期进行安全审计和性能压测,确保 Nginx 服务稳定高效运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传送文件利器wormhole的使用方法

传送文件利器wormhole的使用方法 wormhole文件传送工具是基于python的一个快捷的传送工具&#xff0c;在安装此工具之前首先要部署好python环境。 安装的过程如下&#xff1a; 1.部署好python 环境 LINUX系统自带PYTHON环境&#xff0c;直接安装即可。 WINDOWS系统需要安装py…

LangChain输出格式化实践:提升测试工程师LLM开发效率的完整指南

引言 在基于LangChain的LLM测试开发中&#xff0c;输出格式化是连接大模型推理能力与自动化测试系统的关键环节。通过结构化输出&#xff08;如JSON&#xff09;&#xff0c;测试工程师可快速将LLM生成的测试用例、缺陷报告等结果对接至CI/CD流水线。本文系统解析LangChain内置…

Go 语言 + Word 文档模板:WordZero 引擎如何让企业文档处理效率提升 300%?

前言 在企业级应用开发中&#xff0c;自动化生成Word文档一直是个令人头疼的需求。传统的方案要么依赖于复杂的Office COM组件&#xff0c;要么使用功能有限的第三方库。今天为大家介绍一个纯Go语言实现的Word操作库——WordZero&#xff0c;特别是其强大的模板引擎功能&#…

Eclipse 修改字符集

Eclipse 修改字符集 在软件开发过程中,字符集的设置对于代码的正确显示和运行至关重要。Eclipse 作为一款流行的集成开发环境(IDE),提供了方便的字符集修改功能。本文将详细讲解如何在 Eclipse 中修改字符集,以确保项目文件的正确处理。 1. 引言 在 Java 开发中,常见的…

C++ 游戏开发详细流程

&#x1f9e0; 第一阶段&#xff1a;项目规划与架构设计 关键词&#xff1a;系统性、模块化、可扩展性 1.1 目标明确 游戏类型&#xff1a;2D / 2.5D / 3D / VR平台选择&#xff1a;PC、主机、移动设备多人/单人&#xff1a;是否含网络模块&#xff08;决定是否使用 socket、U…

使用Docker-NVIDIA-GPU开发配置:解决 Docker NVIDIA 运行时错误方法

问题描述 运行 Docker 命令时,系统提示 docker: Error response from daemon: unknown or invalid runtime name: nvidia,表明 Docker 无法识别 NVIDIA 运行时。这一错误通常出现在使用 --runtime=nvidia 和 --gpus 参数时,意味着 NVIDIA 容器运行时未正确安装或配置。NVID…

3516cv610在sample_aiisp上多创一路编码流,方法

3516cv610在sample_aiisp上多创一路编码流&#xff0c;方法 首先确保 vpss grp0有视频流 最好保证 已经有一路视频流能推出来 多创一路编码流思路为 将 vpss grp0又绑定给 vpss_chn1 vpss_chn1有绑定给 venc_chn1 这样我们就多创了一路视频流。 这里思路完全正确 可以实现…

【烧脑算法】不定长滑动窗口:从动态调整到精准匹配以灵活特性实现高效破题

目录 求最长/最大 2730. 找到最长的半重复子字符串 2779. 数组的最大美丽值 1838. 最高频元素的频数 2516. 每种字符至少取 K 个 2831. 找出最长等值子数组 求最短/最小 1234. 替换子串得到平衡字符串 2875. 无限数组的最短子数组 76. 最小覆盖子串 632. 最小区间 …

第七十篇 从餐厅后厨到电影院选座:生活场景拆解Java并发编程核心

目录 一、并发基础&#xff1a;餐厅后厨的协作艺术1.1 厨师与线程&#xff08;Thread&#xff09;1.2 共享资源竞争&#xff1a;唯一的炒锅1.3 线程状态转换&#xff1a;厨师工作流 二、线程同步&#xff1a;电影院选座中的锁机制2.1 同步锁&#xff08;synchronized&#xff0…

嵌入式学习--江协stm32day1

失踪人口回归了&#xff0c;stm32的学习比起51要慢一些&#xff0c;因为涉及插线&#xff0c;可能存在漏插&#xff0c;不牢固等问题。 相对于51直接对寄存器的设置&#xff0c;stm32因为是32位修改起来比较麻烦&#xff0c;江协课程是基于标准库的&#xff0c;是对封装函数进…

vue+elementUi+axios实现分页(MyBatis、Servlet)

vueelementUiaxios实现分页 文章目录 vueelementUiaxios实现分页1.代码实现【HTML】**【Servlet层】****【Service层】****【Dao层】** 2.总结步骤3.实现要点4.注意事项4.注意事项 注&#xff1a;此项目 前端为 html、 后端采用 mybatis、servlet实现 1.代码实现 【HTML】…

vue-10( 动态路由匹配和路由参数)

动态路由匹配和路由参数 动态路由匹配是 Vue Router 的一个强大功能&#xff0c;它允许你创建灵活且可重用的路由。您可以使用参数来捕获 URL 的动态段&#xff0c;而不是为每个可能的值定义特定路由。这在处理具有唯一标识符的资源&#xff08;如用户配置文件、产品详细信息或…

劫持进程注入

劫持进程注入和远程线程注入的区别就是 远程线程注入是向一个正在运行中的进程注入 而劫持进程注入则是自己打开一个进程(以挂起的方式) 然后再进行注入的操作 这样做的原因是当进程在挂起的状态时他的所有线程都是处于未启用的阶段 这样就可以避免目标进程的反注入线程的…

uni-app学习笔记二十--pages.json页面路由pages设置

uni-app 通过 pages 节点配置应用由哪些页面组成&#xff0c;pages 节点接收一个数组&#xff0c;数组每个项都是一个对象&#xff0c;其属性值如下&#xff1a; 属性类型默认值描述pathString配置页面路径styleObject配置页面窗口表现&#xff0c;配置项参考下方 pageStylene…

VScode编译调试debug,gpu的cuda程序,Nsight

进行下面操作的前提是&#xff0c;我们的环境已经能跑简单的CUDA程序了。 一、安装Nsight 二、创建launch.json文件 {"version": "0.2.0","configurations": [{"name": "CUDA C: Launch","type": "cuda-gdb…

链表题解——合并两个有序链表【LeetCode】

1. 算法思路 这段代码的核心思想是 合并两个有序链表。具体步骤如下&#xff1a; 初始化哨兵节点&#xff1a; 创建一个哨兵节点 dummy&#xff0c;用于简化链表操作&#xff0c;避免处理头节点的特殊情况。使用指针 cur 指向 dummy&#xff0c;用于构建新的链表。 遍历两个链…

K8S集群主机网络端口不通问题排查

一、环境&#xff1a; k8s: v1.23.6 docker: 20.10.14 问题和故障现象&#xff1a;devops主机集群主机节点到端口8082不通&#xff08;网络策略已经申请&#xff0c;并且网络策略已经实施完毕&#xff09;&#xff0c;而且网络实施人员再次确认&#xff0c;网络策…

qemu安装risc-V 64

参考这篇文章https://developer.aliyun.com/article/1323996&#xff0c;其中在wsl下面安装可能会报错环境变量中有空格。 # clean_path.sh#!/bin/bash# 备份旧 PATH OLD_PATH"$PATH"# 过滤掉包含空格、制表符、换行的路径 CLEAN_PATH"" IFS: read -ra PA…

python爬虫:RoboBrowser 的详细使用

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、RoboBrowser概述1.1 RoboBrowser 介绍1.2 安装 RoboBrowser1.3 与类似工具比较二、基本用法2.1 创建浏览器对象并访问网页2.2 查找元素2.3 填写和提交表单三、高级功能3.1 处理文件上传3.2 处理JavaScript重定向3.3…

CTFSHOW-WEB-36D杯

给你shell 这道题对我这个新手还是有难度的&#xff0c;花了不少时间。首先f12看源码&#xff0c;看到?view_source&#xff0c;点进去看源码 <?php //Its no need to use scanner. Of course if you want, but u will find nothing. error_reporting(0); include "…