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

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

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

                相关文章

                C语言【指针篇】(一)

                前言 指针基础概念理解,从底层出发理解指针 C语言【指针篇】(一) 前言正文1. 内存和地址1.1 内存1.2 究竟该如何理解编址 2. 指针变量和地址2.1 取地址操作符(&)2.2 指针变量和解引用操作符(*)2.3 指针变量的大小 3. 指针变量类型的意义…

                【每日八股】Redis篇(二):数据结构

                Redis 数据类型? 主要有 STRING、LIST、ZSET、SET 和 HASH。 STRING String 类型底层的数据结构实现主要是 SDS(简单动态字符串),其主要应用场景包括: 缓存对象:可以用 STRING 缓存整个对象的 JSON&…

                文章精读篇——用于遥感小样本语义分割的可学习Prompt

                题目:Learnable Prompt for Few-Shot Semantic Segmentation in Remote Sensing Domain 会议:CVPR 2024 Workshop 论文:10.48550/arXiv.2404.10307 相关竞赛:https://codalab.lisn.upsaclay.fr/competitions/17568 年份&#…

                游戏引擎学习第119天

                仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾和今天的议程 如果你们还记得昨天的进展,我们刚刚完成了优化工作,目标是让某个程序能够尽可能快速地运行。我觉得现在可以说它已经快速运行了。虽然可能还没有达到最快的速度,但我们…

                HybridCLR+Adressable+Springboot热更

                本文章会手把手教大家如何搭建HybridCLRAdressableSpringboot热更。 创作不易,动动发财的小手点个赞。 安装华佗 首先我们按照官网的快速上手指南搭建一个简易的项目: 快速上手 | HybridCLR 注意在热更的代码里添加程序集。把用到的工具放到程序集里…

                多无人机协同路径规划(论文+仿真)

                在现代技术的快速发展下,飞行器的种类也越来越多了,他们的应用场景和应用功能也越来越完善和复杂。举例来说,ps-x625型号就是大疆无人机生产的就是在植物保护方面有很好的应用,宝鸡的兴义生产的X8型号无人机在航空领域有很大突破&…

                CentOS环境变量配置+解析

                环境变量的作用就是让系统快速通过你的命令找到你的可执行程序,windows系统里也同理,也就是你每次输入个命令,系统就会找环境变量里到底有没有叫这个命令进程的 一、环境变量配置 1.编辑配置文件 vim /etc/profile export PATH$PATH:$JAVA…

                einops测试

                文章目录 1. einops2. code3. pytorch 1. einops einops 主要是通过爱因斯坦标记法来处理张量矩阵的库,让矩阵处理上非常简单。 conda : conda install conda-forge::einopspython: 2. code import torch import torch.nn as nn import torch.nn.functional as…

                Unity教程(二十一)技能系统 基础部分

                Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

                Docker:Docker从入门到精通(一)- Docker简介

                一、前言 通过本专栏的学习,我们将了解   1. 掌握Docker基础知识,能够理解Docker镜像与容器的概念   2. 完成Docker安装与启动   3. 掌握Docker镜像与容器相关命令   4. 掌握Tomcat Nginx 等软件的常用应用的安装   5. 掌握docker迁移与备份相…

                单机上使用docker搭建minio集群

                单机上使用docker搭建minio集群 1.集群安装1.1前提条件1.2步骤指南1.2.1安装 Docker 和 Docker Compose(如果尚未安装)1.2.2编写docker-compose文件1.2.3启动1.2.4访问 2.使用2.1 mc客户端安装2.2创建一个连接2.3简单使用下 这里在ubuntu上单机安装一个m…

                Image Downloader下载文章图片的WordPress插件

                源码介绍 一个用于下载图片的WordPress插件,包含下载统计功能,支持任何主题使用 用户点击下载后自动打包该文章所有原始图片,并把文章标题作为压缩包的文件名。 不占用服务器空间,也不占网盘空间,直接利用浏览器的性…

                PLC通讯

                PPI通讯 是西门子公司专为s7-200系列plc开发的通讯协议。内置于s7-200 CPU中。PPI协议物理上基于RS-485口,通过屏蔽双绞线就可以实现PPI通讯。PPI协议是一种主-从协议。主站设备发送要求到从站设备,从站设备响应,从站不能主动发出信息。主站…

                VScode+stfp插件,实现文件远程同步保存【2025实操有效】

                目录 1 痛点2 准备工作3 操作步骤3.1 第一步,下载STFP插件3.2 第二步,修改配置文件3.3 第三步,测试是否成功 4 后记 1 痛点 我一直用vscode远程连接服务器,传代码文件等到服务器上面,突然有一次服务器那边尽心维修&am…

                【quicker】调节PPT指定字号字体大小/快速调节WPS的PPT字体大小

                在quicker的拓展动作中找不到直接指定字号大小方式的动作。 换个思路,既然无法通过alt键模拟,不如模拟右键菜单触发?尝试过失败了 所以有了第三种方法 ,首先给字体窗口设置快捷键,此处设置的是altshiftf,然…

                Grouped-Query Attention(GQA)详解: Pytorch实现

                Grouped-Query Attention(GQA)详解 Grouped-Query Attention(GQA) 是 Multi-Query Attention(MQA) 的改进版,它通过在 多个查询头(Query Heads)之间共享 Key 和 Value&am…

                百度百舸 DeepSeek 一体机发布,支持昆仑芯 P800 单机 8 卡满血版开箱即用

                在私有云环境中成功部署 DeepSeek 满血版并实现性能调优,并不是一件容易的事情。选择合适的 GPU 配置、安装相应的环境、成功部署上线业务、加速推理任务加速、支撑多用户并发 …… 完成业务测试,成功融入生产业务中。 为了帮助企业快速实现 DeepSeek 服…

                c++入门-------命名空间、缺省参数、函数重载

                C系列 文章目录 C系列前言一、命名空间二、缺省参数2.1、缺省参数概念2.2、 缺省参数分类2.2.1、全缺省参数2.2.2、半缺省参数 2.3、缺省参数的特点 三、函数重载3.1、函数重载概念3.2、构成函数重载的条件3.2.1、参数类型不同3.2.2、参数个数不同3.2.3、参数类型顺序不同 前言…

                tortoiseGit的使用和上传拉取

                tortoiseGit的使用和上传拉取 下载TortoiseGit 通过网盘分享的文件:tortoiseGit.zip 链接: https://pan.baidu.com/s/1EOT_UsM9_OysRqXa8gES4A?pwd1234 提取码: 1234 在电脑桌面新建文件夹并进入 右击鼠标 将网址复制上去 用户名和密码是在git注册的用户名和…

                Mybatis学习总结

                官网 概念 用于简化JDBC的开发。 在配置mybatis的时候如果没有建立连接识别不了信息,我们需要在idea配置mysql的配置信息 JDBC是一套操作关系数据库的API,有效率,和mybatis比起来资源节约,性能高,不繁琐。 数据库连…