详解Nginx 配置

news/2025/2/21 20:36:26/

一、Nginx 介绍

Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器。它由俄罗斯的程序设计师 Igor Sysoev 所开发,自 2004 年发布以来,凭借其高性能、低内存消耗、高并发处理能力等特点,迅速在 Web 服务器领域崭露头角。Nginx 可以高效地处理静态资源,如 HTML、CSS、JavaScript 文件和图片等,同时通过反向代理功能,将客户端请求转发到后端的应用服务器,实现负载均衡,提高整个系统的可用性和性能。它广泛应用于各类大型网站、高流量应用以及云服务平台等场景。

二、Nginx 配置基础

(一)配置文件结构剖析

Nginx 的配置文件通常为nginx.conf,其结构清晰,主要由以下几个部分组成:

全局块:从配置文件开始到events块之间的部分,用于设置一些影响 Nginx 全局运行的指令,如运行用户、工作进程数等。

events 块:主要用于配置 Nginx 的网络连接相关的事件处理,如选择事件驱动模型、设置每个工作进程的最大连接数等。

http 块:这是 Nginx 配置中最为核心的部分,用于配置 HTTP 服务器相关的参数,如文件类型映射、日志记录、gzip 压缩等。在http块中还可以包含多个server块。

server 块:每个server块代表一个虚拟主机,用于配置特定网站或应用的相关参数,如监听端口、服务器名称、访问日志等。在server块中又可以包含多个location块。

location 块:用于匹配特定的 URL 路径,并对其进行相应的配置,如设置根目录、代理转发等。

(二)常用配置指令详解

全局配置指令

user:指定 Nginx 工作进程运行的用户和用户组,例如user nginx nginx;,以确保服务器的安全性。

worker_processes:设置 Nginx 的工作进程数,一般建议设置为与服务器 CPU 核心数相同,以充分利用 CPU 资源,如worker_processes pid:指定 Nginx 进程 ID 文件的路径,方便管理和监控 Nginx 进程,如pid /var/run/nginx.pid;。

error_log:设置错误日志的路径和级别,有助于排查服务器运行过程中出现的问题,如error_log /var/log/nginx/error.log warn;。

    事件配置指令

    use:选择 Nginx 的事件驱动模型,常见的有epoll(适用于 Linux 系统)、kqueue(适用于 FreeBSD 等系统)等,如use epoll;,以提高服务器的性能。

    worker_connections:设置每个工作进程能够处理的最大连接数,结合服务器性能和业务需求合理设置,如worker_connections 1024;。

    accept_mutex:开启或关闭 Nginx 的 “接受锁”,防止多个工作进程同时接受新连接时可能出现的 “惊群” 现象,默认开启,如accept_mutex on;。

      HTTP 配置指令

      include:用于包含其他配置文件,方便管理和维护,如include /etc/nginx/mime.types;,引入文件类型映射表。

      default_type:设置默认的 MIME 类型,当服务器无法识别文件类型时使用,如default_type application/octet-stream;。

      sendfile:开启高效的文件传输模式,减少磁盘 I/O 开销,提高文件传输效率,如sendfile on;。

      keepalive_timeout:设置客户端与服务器之间的长连接超时时间,如keepalive_timeout 65;。

      gzip:开启 gzip 压缩功能,减少数据传输量,提高网站访问速度,如gzip on;,并可进一步配置压缩级别等参数。

        Server 配置指令

        listen:指定服务器监听的端口,如listen 80;,监听 HTTP 协议的 80 端口。

        server_name:设置服务器的名称,可以是域名或 IP 地址,如server_name example.com;。

        access_log:指定访问日志的路径和格式,用于记录客户端的访问信息,如access_log /var/log/nginx/access.log main;。

        error_log:在server块中设置的错误日志,仅记录当前虚拟主机相关的错误信息,覆盖http块中的全局错误日志设置。

          Location 配置指令

          匹配规则:location通过不同的匹配符号来确定匹配规则。例如,=表示精确匹配,~表示区分大小写的正则表达式匹配,~*表示不区分大小写的正则表达式匹配,^~表示普通字符串匹配,且一旦匹配成功,不再进行其他正则表达式匹配。

          常用指令

          • root:设置请求的根目录,如root /usr/share/nginx/html;,当访问/路径时,会从该目录下查找对应的文件。

            • alias:用于替换路径,与root略有不同,如alias /data/www/;,可以将特定的 URL 路径映射到不同的文件目录。

              • proxy_pass:实现代理转发功能,将匹配的请求转发到后端服务器,如proxy_pass http://backend_server;。

                三、Nginx 进阶配置实例

                (一)反向代理配置

                假设我们有一个后端应用服务器运行在www.rhihi.com:8080,希望通过 Nginx 将对example.com的请求转发到该后端服务器。配置如下:

                server {listen 80;server_name example.com;location / {proxy_pass http://www.rhihi.com: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;}}

                在上述配置中,proxy_pass指令将请求转发到http://www.rhihi.com:8080,同时通过proxy_set_header指令设置了一些请求头信息,以便后端服务器能够正确处理请求。

                (二)负载均衡配置

                假设有三个后端服务器backend1、backend2、backend3,分别运行在192.168.1.10:80、192.168.1.11:80、192.168.1.12:80,我们使用 Nginx 的轮询负载均衡策略将请求分发到这三个服务器上。配置如下:

                upstream backend_servers {server 192.168.1.10:80;server 192.168.1.11:80;server 192.168.1.12:80;}server {listen 80;server_name example.com;location / {proxy_pass http://backend_servers;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指令定义了后端服务器集群,Nginx 会按照轮询的方式依次将请求分发到各个后端服务器上。

                (三)动静分离配置

                为了提高网站性能,我们将静态资源(如图片、CSS、JavaScript 文件)和动态请求(如 PHP、Python 等应用程序的请求)分开处理。假设静态资源存放在/var/www/static目录下,动态请求由后端的 FastCGI 服务器处理。配置如下:

                server {listen 80;server_name example.com;location /static/ {root /var/www/;expires 30d;access_log off;}location / {fastcgi_pass 127.0.0.1:9000;fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;include fastcgi_params;}}

                在上述配置中,/static/路径下的请求会被 Nginx 直接从/var/www/static目录中读取静态资源,并设置了缓存过期时间为 30 天,同时关闭了该路径的访问日志。而其他请求则通过fastcgi_pass转发到后端的 FastCGI 服务器进行处理。

                (四)HTTPS 配置

                为了实现网站的安全访问,我们需要为 Nginx 配置 HTTPS。首先,需要获取 SSL 证书,假设证书文件为example.com.crt和example.com.key,存放在/etc/nginx/ssl目录下。配置如下:

                server {listen 443 ssl;server_name example.com;ssl_certificate /etc/nginx/ssl/example.com.crt;ssl_certificate_key /etc/nginx/ssl/example.com.key;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;location / {# 正常的业务逻辑配置}}

                上述配置中,listen 443 ssl表示监听 443 端口并启用 SSL 加密,ssl_certificate和ssl_certificate_key指定了证书文件的路径,同时通过ssl_protocols和ssl_ciphers指令设置了支持的 SSL 协议版本和加密算法。

                四、Nginx 配置优化技巧

                (一)性能优化

                调整工作进程数:根据服务器的 CPU 核心数合理设置worker_processes,充分利用 CPU 资源,提高并发处理能力。

                优化连接数:通过合理设置worker_connections,增加每个工作进程能够处理的最大连接数,同时结合keepalive_timeout等参数,优化连接的复用和管理,减少连接建立和销毁的开销。

                启用高效文件传输:开启sendfile指令,采用高效的文件传输模式,减少磁盘 I/O 操作,提高文件传输效率。

                启用 gzip 压缩:根据业务需求合理配置gzip指令,对传输的数据进行压缩,减少网络带宽消耗,加快页面加载速度。

                (二)安全优化

                关闭版本信息显示:在http块中添加server_tokens off;指令,避免在响应头中暴露 Nginx 的版本信息,降低被攻击的风险。

                设置访问控制:通过location块结合allow和deny指令,限制特定 IP 或 IP 段的访问,如只允许某些内部 IP 访问管理后台页面。

                防止恶意请求:利用limit_req和limit_conn指令,设置请求频率限制和连接数限制,防止恶意用户通过大量请求对服务器进行攻击。

                五、Nginx 配置常见问题与解决

                配置文件语法错误:在修改 Nginx 配置文件后,使用nginx -t命令检查语法是否正确。如果出现语法错误,根据错误提示信息仔细检查配置文件中的指令拼写、符号使用等问题。

                服务器无法启动:可能是端口被占用、配置文件错误或权限不足等原因导致。使用netstat -tlnp命令检查端口占用情况,确保 Nginx 监听的端口未被其他程序占用。同时,检查配置文件的权限是否正确,确保 Nginx 进程有足够的权限读取配置文件和访问相关资源。

                代理转发异常:如果代理转发出现问题,检查proxy_pass指令的目标地址是否正确,后端服务器是否正常运行。同时,注意检查proxy_set_header设置的请求头信息是否符合后端服务器的要求。


                http://www.ppmy.cn/news/1573974.html

                相关文章

                openharmony中hdf框架的设备节点(HdfDeviceNode)和设备实例(HdfDevice)的区别

                设备节点(HdfDeviceNode)和设备实例(HdfDevice)的区别 在 OpenHarmony 驱动框架 HDF 中,设备节点(HdfDeviceNode) 和 设备实例(HdfDevice) 是两个重要的概念&#xff0c…

                整合Salesmart/WhatsApp、开源Odoo模块和Deepseek AI能力,实现针对国外客户的智能客服和个性化推荐服务

                一、项目背景 本文提出了一套针对软管制造公司的智能客服与个性化推荐系统实施方案,旨在通过整合开源Odoo模块、Salesmart/WhatsApp以及Deepseek AI能力,打造一个724小时不间断服务的智能化平台,专注于服务国外客户。方案围绕实现不间断服务…

                python游戏库入门:ursina游戏引擎——复原《我的世界》

                目录 : 主要特性 依赖库: 第一个 ursina代码: 创建一个物体: 代码解读: 复原《我的世界》: 总结 Ursina 是一个用于创建 3D 游戏和应用程序的 Python 游戏引擎。它基于 Panda3D 引擎构建&#xff0c…

                ARM Linux平台下 OpenCV Camera 实验

                一、硬件原理 1. OV2640 1.1 基本功能 OV2640 是一款低功耗、高性能的图像传感器,支持以下功能: 最高分辨率:200 万像素(1600x1200)。 输出格式:JPEG、YUV、RGB。 内置图像处理功能:自动曝…

                Java Swing 学习笔记

                一、什么是Swing swing是一个比较老的技术了,我觉得学习它还是很有必要的,也比较容易激发学习的兴趣。 Swing 是构建在 AWT(Abstract Window Toolkit)之上的轻量级 GUI 工具包,用于创建跨平台的图形用户界面。与 AWT…

                老游戏回顾:SOR

                被称为QTE之子,销量约130w。CE引擎打造,画面精美。 以罗马帝国为背景的一款动作游戏,游戏中玩家将化身罗马将领马略提图斯(Marius Titus),为了替家族的死亡复仇而投身军旅,率领罗马战士展开一场…

                火绒V6.0小工具提取版——无需安装,一键解锁实用功能!

                在国内众多杀毒软件中,火绒无疑是口碑最佳的存在。它完全免费,无需登录,没有会员限制,也没有恼人的弹窗广告,使用体验直接“吊打”某些知名收费杀毒软件。即便火绒如此好用,仍有不少朋友选择“裸奔”。毕竟…

                js解析后端传来的如图示的list集合,怎么获取每个map的key和value

                如图示&#xff0c;后端传到前端的questTypeList是一个HashMap的list集合 使用c标签将传来的集合放到下拉单选框中&#xff0c; <% taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core" %><html> <body><form action"yo…