当前位置: 首页 > news >正文

详解Nginx 配置

一、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设置的请求头信息是否符合后端服务器的要求。

                相关文章:

              • 将Neo4j用于Python学习的创新方法
              • 操作系统3.1
              • 自用题库---面试使用
              • 黑盒测试和白盒测试常用的测试方法有哪些?
              • 【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin scatter plot Venn)
              • C++:pthread线程分离和线程属性
              • 软件测试概念
              • 【VSCode】MicroPython环境配置
              • Java面试第六山!《MySQL基础知识点》
              • C语言基础11天:函数
              • Unity面板介绍_Project工程面板(23.1.1)
              • 解决OpenEuler系统修改句柄无效的问题
              • 《QT+PCL 第五章》点云特征-ESF
              • 基于Python/Java的医院系统切换互联网医院深度编程对接探索
              • 【个人总结】9. 通讯协议、物联网、DSP及FatFS文件系统 工作三年的嵌入式常见知识点梳理及开发技术要点(欢迎指正、补充)
              • 【大语言模型_4】源码编译vllm框架cpu版
              • Spring Data JPA 排序实战:基于 Sort 参数的实现
              • nginx ngx_http_module(9) 指令详解
              • Oracle LiveLabs实验:Oracle AI Vector Search - Basics
              • 如何通过AI优化敏捷开发中的任务管理与分配?
              • 给网站做seo诊断/国内免费推广产品的网站
              • 网站建设开发公司地址/网上如何推广自己的产品
              • 北京网架公司/seo网站免费优化软件
              • 个体户备案网站可以做企业站吗/谷歌网址
              • 昆明网站建设有限公司/想做app推广项目在哪找
              • 管理咨询公司利润率/惠州企业网站seo