Nginx学习

一、nginx简介

1.什么是nginx

  • Nginx 是高性能的轻量级 HTTP 和邮箱代理服务器,具备反向代理、TCP/UDP代理功能。

  • 中国使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

2.nginx的功能

作为 web 服务器

  • Nginx 可以作为静态页面的 web 服务器,同时支持 CGI 协议的动态语言,比如 php 等。但不支持 java。

  • 静态资源托管高效:能快速处理 HTML、CSS、JS、图片等静态文件请求,通过sendfilegzip等配置可进一步提升传输效率。

  • 支持多虚拟主机:可在单个 Nginx 实例上通过不同的server块配置多个域名的网站,实现资源的高效利用。

  • 功能扩展性强:除了基础的 Web 服务功能,还可结合反向代理、负载均衡、访问控制等功能,满足复杂 Web 场景的需求。

  • 可高效托管静态资源,支持多虚拟主机配置,能快速响应客户端请求。

正向代理

  • Nginx 代理客户端向目标服务器发起请求。

  • 突破访问限制:如企业内网用户通过 Nginx 代理访问外网资源。

  • 缓存与带宽优化:对频繁请求的资源进行缓存,减少重复流量。

  • 访问管控:统一记录客户端请求日志、实施访问策略。

反向代理

  • 代理后端服务器向客户端响应请求。

  • 隐藏后端架构:客户端仅需访问 Nginx 的地址,不知道后端多台服务器的存在。

  • 负载均衡:可通过权重、IP 哈希等策略将请求分发到多个后端节点,提升系统性能与可用性。

  • 动静分离:静态资源由 Nginx 直接处理,动态请求转发至后端应用服务器。

  • 安全加固:作为后端服务的 "防护层",可过滤恶意请求、实现 HTTPS 加密等。

负载均衡

  • 通过多种方法将请求分发到多个后端节点,提升系统的可用性和性能。

  • 调度策略

    • 轮询(默认):按顺序依次将请求分发到后端服务器。

    • 权重(weight):为不同服务器设置权重值,权重高的接收更多请求,适用于服务器性能差异场景。

    • IP 哈希(ip_hash):根据客户端 IP 的哈希值将请求固定分发到某台服务器,可解决会话保持问题。

    • 最少连接(least_conn):将请求分发到当前连接数最少的服务器,适用于请求处理时间差异较大的场景。

动静分离

  • 把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

  • 静态资源由 Nginx 直接处理,利用其高效的静态文件服务能力,减少后端应用服务器压力。

  • 动态请求转发至后端应用服务器,让专业的应用服务器处理业务逻辑,实现资源的合理分工。

3.nginx的特点

  • 并发能力强:单机nginx可支持十万级的并发连接,最高支持百万计并发连接。

  • 占有内存少:在同等级web服务器中,Nginx占用的内存最少。

  • 高扩展性:采用模块化设计,可以根据需要添加或删除模块,具有良好的扩展性。

  • 高可靠性:采用master-worker模式,如果worker出现故障,master可以快速开启一个新的worker来提供服务。能够处理大量的并发连接而不会崩溃。

  • 可以运行在x86、ARM等多种平台上,同时支持Linux、Windows等主流操作系统。

4.Nginx 架构

Master进程

  • 配置管理:加载、解析 Nginx 配置文件,并将配置同步给 Worker 进程。

  • 进程管理:创建、监控 Worker 进程,当 Worker 进程异常退出时,Master 会自动重启新的 Worker 进程,保障服务可用性。

  • 信号处理:接收对nginx的管理指令,并将指令分发到 Worker 进程。

worker进程

  • 并发处理:采用事件驱动的异步非阻塞 I/O 模型,结合Linux、FreeBSD等 I/O 多路复用机制。

  • 功能:接收、处理客户端请求,完成静态资源返回、反向代理转发、负载均衡调度等业务。

  • 高可用性:多个 Worker 进程相互独立,由 Master 进程监控,若某个 Worker 异常退出,Master 会自动重启新的 Worker,保障服务不中断

  • 性能优化:Worker 进程数通常配置为与 CPU 核心数一致,通过worker_processes指令设置,利用多核资源提升性能。

5.nginx关键工作机制

  • 抢占机制:当客户端发起请求时,会激活accept_mutex互斥锁,哪个worker抢占了该互斥锁,该客户端的请求就由那个worker响应和处理

  • 异步非阻塞模式:在传统事件处理模式下,如果所有的worker被客户端阻塞后,新来的客户就需要等待,直到原来的客户端释放worker后才能被处理请求,在异步非阻塞模式下,底层使用了linux的epoll模型,就算worker被阻塞,新的客户端请求也会被正常处理

二、Nginx的安装

Nginx版本

  • Mainline version: 主要开发版本。

  • Stable version: 当前最新稳定版。

  • Legacy versions: 旧的稳定版。

Nginx安装方式

  • 包管理器安装:通过系统包管理器直接安装。安装过程简单快捷,自动处理依赖,适合快速部署或对功能需求较基础的场景。

  • 源码编译安装: 下载源码包→安装依赖→配置编译参数→编译安装。可自定义功能模块(如启用 SSL、HTTP/2 等),指定安装路径,适合对功能和环境有个性化需求的场景。(推荐)

  • Docker 容器安装:拉取 Nginx 官方镜像→运行容器。环境隔离性好,便于迁移和版本管理。

Nginx 编译安装

  • 安装依赖:安装编译器(如 GCC)及相关库(如 PCRE、zlib),以支持 Nginx 的功能模块。

  • 下载源码:从 Nginx 官网下载对应版本的源码包(如nginx-1.24.0.tar.gz)。

  • 配置编译参数:通过./configure命令指定安装路径、启用的模块(如--with-http_ssl_module启用 HTTPS)等。

  • 编译安装:执行make编译源码,再执行make install完成安装。

工具介绍

在 Nginx 编译安装中,常用的编译器是GCC(GNU Compiler Collection),支持多种编程语言,如C、C++和Java等。

  • 功能:是一套开源的编译器集合,可将 Nginx 的 C 语言源码编译为可执行程序。

  • 优势:支持多平台(Linux、Unix、Windows 等),对 C/C++ 语言的编译优化能力强,是开源软件编译的主流工具。

  • 安装方式:在 Linux 系统中,可通过包管理器安装,如红帽系统执行yum install gcc -y

Automake: 构建工具。自动生成 Makefile 的工具,简化编译流程,让 Nginx 源码的编译配置更高效。

依赖库

  • pcre:支持正则表达式,是 Nginx rewrite 模块的核心依赖,用于 URL 重写、 location 匹配等场景。
  • zlib:提供数据压缩能力,支持 Nginx 的 gzip 模块,可对 HTTP 响应进行压缩,减少带宽消耗。
  • openssl:支持 SSL/TLS 加密,是 Nginx 实现 HTTPS 协议的必备依赖,保障数据传输的安全性。

编译安装步骤

  • 安装编译器和依赖库(以红帽系系统为例)执行命令yum install gcc automake pcre-devel zlib-devel openssl-devel -y,一次性安装所有必需的编译工具和依赖库。

  • 下载 Nginx 源码,从Nginx 官网下载稳定版源码包。

配置编译选项(如启用或禁用某些模块)

  • 解压源码后进入目录,通过./configure命令指定安装路径和启用的模块,例如:./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_gzip_static_module

编译和安装Nginx

  • 执行make编译源码,再执行make install完成安装,最终可在指定路径(如/usr/local/nginx)下找到 Nginx 的可执行程序和配置文件。

    [root@shiyan ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y #安装 Nginx 编译所需的编译器(gcc)和依赖库(pcre-devel正则库、zlib-devel压缩库、openssl-devel加密库)
    [root@shiyan nginx-1.24.0]# useradd -s /sbin/nologin -M nginx #创建 Nginx 运行用户nginx,-s /sbin/nologin设置为无登录权限,-M不创建家目录,增强安全性
    [root@shiyan nginx]# tar zxf nginx-1.24.0.tar.gz
    [root@shiyan nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
    [root@shiyan nginx]# cd nginx-1.24.0/
    [root@shiyan nginx-1.24.0]# ls #列出目录内容,查看源码结构(如configure配置脚本、src源码目录等)
    auto CHANGES.ru configure html Makefile objs src
    CHANGES conf contrib LICENSE man README
    [root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx
    --user=nginx \ # 指定nginx运行用户
    --group=nginx \ # 指定nginx运行组
    --with-http_ssl_module \ # 启用https
    --with-http_v2_module \ # 启用http版本2
    --with-http_realip_module \ # 启用ip透传
    --with-http_stub_status_module \ # 启用状态页面
    --with-http_gzip_static_module \ # 启用压缩
    --with-pcre \ # 启用正则
    --with-stream \ # 启用tcp反向代理
    --with-stream_ssl_module \ # 启用tcp的ssl加密
    --with-stream_realip_module # 启用tcp的透传ip
    [root@Nginx nginx-1.24.0]# make && make install

  • 安装完nginx后,会在 路径 /usr/local 下自动生成 nginx 文件夹。

  • 进入这个目录,查看目录内容

    复制代码
    [root@shiyan nginx]# cd /usr/local/nginx
    [root@shiyan nginx]# ls
    client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
  • 以下几个目录最为关键:

  • conf存放Nginx的配置文件,核心配置文件`nginx.conf`就在此目录下,可在此配置虚拟主机、反向代理、负载均衡等规则

  • html:存放默认的网页文件,如`index.html`(Nginx默认首页),也可在此放置静态资源(如图片、CSS、JS)

  • logs:存储Nginx的日志文件,包括访问日志`access.log`、错误日志`error.log`和进程ID文件`nginx.pid'

  • sbin:存放Nginx的可执行程序`nginx`,用于启动、停止、重载Nginx服务

部署Nginx

复制代码
[root@shiyan ~]# setenforce  0             #临时关闭 SELinux      
[root@shiyan ~]# systemctl stop  firewalld #临时停止 firewalld 防火墙服务,关闭系统的网络端口访问限制,使外部可访问 Nginx 的 80、443 等端口。

[root@shiyan ~]# systemctl disable  firewalld   #禁用 firewalld 防火墙的开机自启,确保系统重启后防火墙不会自动开启,长期为服务提供无防火墙拦截的网络环境(若需重新启用,可执行systemctl enable firewalld)。 

[root@shiyan ~]# vim ~/.bash_profile       #编辑用户的环境变量配置文件~/.bash_profile,用于添加 Nginx 可执行程序的路径到系统环境变量中
export PATH=$PATH:/usr/local/nginx/sbin    #将 Nginx 可执行程序所在的sbin目录(/usr/local/nginx/sbin)加入PATH,使得在任意目录下都可直接执行nginx命令
[root@shiyan ~]# source ~/.bash_profile    #使刚修改的环境变量配置立即生效,无需重新登录系统
[root@shiyan ~]# nginx -V                  #查看 Nginx 的版本信息及编译参数
nginx version: nginx/1.24.0                #版本号
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC)    #编译工具
built with OpenSSL 3.0.7 1 Nov 2022                      #启用的功能模块
TLS SNI support enabled
configure arguments: --group=nginx --with-http_ssl_module --with-http_v2_module -
-with-http_realip_module --with-http_stub_status_module --withhttp_gzip_static_module
 --with-pcre --with-stream --with-stream_ssl_module --
with-stream_realip_module
[root@shiyan ~]# systemctl start  nginx    # 启动httpd

[root@shiyan ~]# systemctl enable  nginx   # 设置开机启动
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@shiyan ~]# systemctl status  nginx    # 查看状态,q键退出查看

[root@shiyan ~]# ps  -ef  |  grep  nginx  # 查看进程
root        481       1  0 13:57 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx       482    481  0 13:57 ?        00:00:00 nginx: worker process
nginx       483    481  0 13:57 ?        00:00:00 nginx: worker process
root        497    497  0 14:00 pts/0    00:00:00 grep --color=auto nginx

Nginx的常用命令

复制代码
systemctl start nginx       # 启动服务

systemctl restart nginx     # 重启服务

systemctl enable nginx      # 开机启动

systemctl stop nginx        # 停止服务

systemctl disable nginx     # 取消开机启动

systemctl status nginx      # 查看状态

systemctl reload nginx      # 配置重载

grep nginx                  # 查看服务状态

nginx  -s  reload           # 重新加载配置文件

nginx  -s  stop             # 强行停止服务

nginx  -s  quit             # 优雅停止服务,即所有请求处理完后退出服务

nginx  -v                   # 查看版本号

nginx -t                    # 检查配置文件的语法错误,无错返回ok

Nginx的配置目录结构

复制代码
[root@shiyan ~]# cd  /etc/nginx     # 服务目录
[root@shiyan nginx]# yum  install  tree  -y
[root@shiyan nginx]# tree
.
├── conf.d                 # 子配置文件目录
├── default.d              # 默认子配置目录,通常存放默认虚拟主机的配置
├── fastcgi.conf           # FastCGI 协议的配置文件,定义 FastCGI 交互的参数
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── koi-utf                # KOI8-R 编码(俄语)转换的映射文件
├── koi-win                # KOI8-R 编码(俄语)转换的映射文件
├── mime.types             # 配置支持的媒体类型
├── mime.types.default     # 样例文件
├── nginx.conf             # 主配置文件
├── nginx.conf.default     # 样例文件
├── scgi_params            
├── scgi_params.default
├── uwsgi_params
├── uwsgi_params.default
└── win-utf                #  KOI8-R 编码(俄语)转换的映射文件

nginx命令示例

复制代码
[root@shiyan ~]# vim /usr/local/nginx/conf/nginx.conf
[root@shiyan ~]# ps aux | grep nginx      # 查看进程
root       48148 0.0 0.1   9868 2052 ?       Ss   14:00   0:00 nginx: master process nginx -g worker_processes 6;
nobody     48149 0.0 0.2 14200 4868 ?       S   14:00   0:00 nginx: worker process
nobody     48150 0.0 0.2 14200 4868 ?       S   14:00   0:00 nginx: worker process
nobody     48151 0.0 0.2 14200 4868 ?       S   14:00   0:00 nginx: worker process
[root@shiyan ~]# nginx -s quit     #停止 Nginx 服务,处理完当前请求后终止进程,保障服务平滑关闭
[root@shiyan ~]# ps aux | grep nginx
root       48171 0.0 0.1 221664 2176 pts/0   S+   14:04   0:00 grep --color=auto nginx

Nginx主配置文件

复制代码
# main配置段
user nginx;              # 运行的账户,默认即是nginx,可以不进行设置
worker_processes auto;   # worker进程数,根据硬件调整,通常等于CPU数量或者2倍于CPU
error_log /var/log/nginx/error.log;   # 错误日志存放目录
pid /run/nginx.pid;      # 指定运行Nginx master主进程的pid文件存放路径

include /usr/share/nginx/modules/*.conf;  #  导入的外部文件位置

# events配置段,性能模块设置,其中可以设置时间处理模式等
events {     
	     use epoll;      # 使用epoll事件驱动模型,但不推荐配置它,让nginx自己选择
   		 worker_connections 1024;   # 每个进程的最大连接数量(并发数)
   		 accept_mutex on # 默认是off关闭的,这里推荐打开
}

# http配置段,包含全局块和server块,使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http {  
    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  main;   # 访问日志存储位置

    sendfile            on;   # 高效文件传输模式,默认开启
    tcp_nopush          on;   # 性能优化参数,数据是否立刻发送
    tcp_nodelay         on;   # 性能优化参数,小数据包是否延迟发送
    keepalive_timeout   65;   # 超时时间
    types_hash_max_size 4096; # 性能优化参数,影响散列表的冲率

    include             /etc/nginx/mime.types;      # 可解析的静态资源类型
    default_type        application/octet-stream;   # 默认文件类型

    include /etc/nginx/conf.d/*.conf;   # 加载子配置项
    # server配置段,虚拟主机设置
    server {  
        listen       80;        # 监听IPV4端口
        listen       [::]:80;   # 监听IPV6端口
        server_name  _;         # 访问的域名
        root         /usr/share/nginx/html;    # 网页默认目录

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;   # 子配置文件存储路径
		
		# location配置段,一般用来匹配不同的URI请求
      	location / {
        	root   /usr/share/nginx/html;      # 相对路径网站根目录
        	alias  /usr/share/nginx/html/;     # 绝对路径网站根目录
        	index  index.html index.htm;       # 默认首页文件
        	deny 172.168.22.11;        # 禁止访问的ip地址,可以为all
        	allow 172.168.33.44;       # 允许访问的ip地址,可以为all
        	autoindex  on;             # 开启目录文件列表
        	autoindex_exact_size on;   # 显示出文件的确切大小,单位是bytes
			autoindex_localtime on;    # 显示的文件时间为文件的服务器时间
			charset utf-8,gbk;         # 避免中文乱码
			auth_basic "xxxx";         # 加密网页验证时的提示信息
    		auth_basic_user_file   /路径/文件名;   # 加密网页使用的密码验证文件
      		}
        error_page 404 /404.html;        # 404时返回给客户端的页面
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;  # 50x错误返回给客户端的页面
           location = /50x.html {
        }
    }
}

层级结构

配置详解

Nginx 的配置文件,主要由全局块、events 块、http 块三部分组成,每部分又包含细分的配置指令和模块。

1.全局块(Global Context)

作用:定义影响 Nginx 整体运行的全局参数。

  • user :指定 Nginx 工作进程的运行用户和用户组,如user nginx nginx;,用于权限隔离,提升安全性。

  • worker_processes :设置工作进程数量,通常建议与 CPU 核心数一致(可设为auto,由 Nginx 自动匹配),如worker_processes auto;,以充分利用硬件资源。

  • error_log :定义错误日志的路径和级别(可选debuginfowarnerror等),如error_log /var/log/nginx/error.log warn;,用于排查故障。

  • pid :指定 Nginx 主进程 ID(PID)的存储文件路径,如pid /run/nginx.pid;

  • worker_rlimit_nofile :设置单个工作进程可打开的最大文件描述符数,需配合系统ulimit调整,如worker_rlimit_nofile 65535;,用于支持高并发连接。

2.events 块

作用:配置 Nginx 的网络连接模型和并发参数。

  • worker_connections :设置每个工作进程的最大并发连接数,如worker_connections 4096;,Nginx 的最大并发数为worker_processes × worker_connections

  • use :指定事件驱动模型,Linux 系统推荐epoll(高效异步 I/O),如use epoll;;BSD 系统推荐kqueue

  • multi_accept :是否允许一个工作进程一次性接受所有新连接,高并发场景建议设为on,如multi_accept on;

  • accept_mutex :是否启用连接互斥锁,高并发时建议设为off以减少延迟,如accept_mutex off;

3.http 块

作用:配置 HTTP 协议相关的所有功能,是 Nginx 配置的核心区域,包含 ** 全局 HTTP 设置、server 块(虚拟主机)、location 块(URL 路由)** 等。

a. 全局 HTTP 设置
  • include :引入外部配置文件,实现模块化管理,如include /etc/nginx/mime.types;(引入 MIME 类型映射)、include /etc/nginx/conf.d/*.conf;(引入虚拟主机配置)。

  • default_type :设置默认的 MIME 类型,未知文件类型时使用,如default_type application/octet-stream;(默认二进制流,浏览器会触发下载)。

  • log_format:自定义访问日志格式。

  • access_log :指定访问日志的路径和格式,如access_log /var/log/nginx/access.log main;

  • sendfile :启用零拷贝文件传输(sendfile()系统调用),提升静态文件传输性能,设为on

  • tcp_nopush :配合sendfile使用,合并数据包减少网络开销,设为on

  • keepalive_timeout :设置客户端长连接的超时时间(秒),如keepalive_timeout 65;

  • gzip:启用 Gzip 压缩以减少传输体积,可配置压缩级别、压缩类型等。

b. server 块(虚拟主机)

作用:定义单个虚拟主机的配置,可实现多域名、多端口的隔离服务。

  • listen :指定监听的 IP 和端口,如listen 80;(监听 80 端口)、listen 127.0.0.1:8080;(仅监听本地回环地址的 8080 端口)。

  • server_name :指定虚拟主机的域名,支持通配符(如*.example.com)和正则(如~^www\.example\.com$),如server_name example.com www.example.com;

  • root :设置网站的根目录,用于静态文件服务,如root /var/www/html;

  • index :设置默认首页文件,如index index.html index.htm;

  • error_page :自定义错误页面,如error_page 404 /404.html;error_page 500 502 503 504 /50x.html;

c. location 块(URL 路由)

作用:匹配请求的 URL 路径,定义对应的处理逻辑(静态文件、反向代理、负载均衡等)。

  • 匹配规则

    • 精确匹配:location = /about { ... }(仅匹配/about)。

    • 前缀匹配:location /images/ { ... }(匹配以/images/开头的路径)。

    • 正则匹配:location ~ \.php$ { ... }(匹配以.php结尾的路径,区分大小写);location ~* \.jpg$ { ... }(不区分大小写)。

  • 常用指令

    • try_files:尝试按顺序查找文件,常用于前端单页应用路由,如try_files $uri $uri/ /index.html;

    • proxy_pass:反向代理到上游服务器,如proxy_pass http://backend_server;,常用于对接后端应用(如 Java、Python 服务)。

    • fastcgi_pass:传递请求到 FastCGI 服务器(如 PHP-FPM),如fastcgi_pass 127.0.0.1:9000;

    • expires:设置客户端缓存时间,如expires 30d;(静态资源缓存 30 天)。

示例
复制代码
#精确匹配
curl http://localhost/test

#前缀匹配(^~)
curl http://localhost/static/files/report.pdf

#区分大小写的正则匹配
curl http://localhost/login.PHP

#不区分大小写的正则匹配
curl http://localhost/pic.JPG

#普通前缀匹配
curl http://localhost/static/css/style.css

#默认匹配
curl http://localhost/abc123
location 尾部斜杠(/)差异
  • 尾部无斜杠(/test):优先匹配同名文件,无文件则匹配同名目录。

  • 尾部有斜杠(/test/):仅匹配同名目录,不识别文件,无目录则返回异常。

    创建网站根目录(与Nginx配置的root一致)

    mkdir -p /var/www/html
    cd /var/www/html

    1. 创建 test 目录 + 目录内首页文件

    mkdir test
    echo "这是 test 目录下的 index.html" > test/index.html

    2. 创建独立的 test 文件(无后缀)

    echo "这是独立的 test 文件" > test
    配置目录 / 文件权限(确保 Nginx 可访问)

    chmod -R 755 /var/www/html
    chown -R nginx:nginx /var/www/html

    Nginx 配置

    server {
    listen 80;
    server_name localhost; # 替换为你的服务器IP或域名
    root /var/www/html; # 网站根目录,与上述创建的目录一致
    index index.html; # 默认首页文件

    复制代码
      # 1. location 尾部无斜杠:匹配 /test(文件或目录)
      location /test {
          return 200 "尾部无斜杠 /test:\n访问内容:$request_filename\n内容:$(cat $request_filename 2>/dev/null || echo '无对应文件/目录')\n";
      }
    
      # 2. location 尾部有斜杠:仅匹配 /test/(目录)
      location /test/ {
          return 200 "尾部有斜杠 /test/:\n访问内容:$request_filename\n内容:$(cat $request_filename 2>/dev/null || echo '无对应目录')\n";
      }

    }

    配置生效命令

    验证配置语法

    nginx -t

    输出 test is successful 表示语法正确。

    重新加载 Nginx

    nginx -s reload # 或 systemctl reload nginx

    测试不同访问路径(curl 命令)

    测试尾部无斜杠的 location /test

    访问 /test(匹配文件,优先级高于目录):

    curl http://localhost/test

    预期输出:

    plaintext

    尾部无斜杠 /test:

    访问内容:/var/www/html/test
    内容:这是独立的 test 文件
    若删除独立的 test 文件,再访问 /test(匹配目录)#

    rm /var/www/html/test # 删除独立文件
    curl http://localhost/test

    预期输出:

    plaintext

    尾部无斜杠 /test:

    访问内容:/var/www/html/test/index.html
    内容:这是 test 目录下的 index.html

    测试尾部有斜杠的 location /test/

    访问 /test/(仅匹配目录):
    bash
    curl http://localhost/test/
    预期输出:
    plaintext

    尾部有斜杠 /test/:

    访问内容:/var/www/html/test/index.html
    内容:这是 test 目录下的 index.html
    若删除 test 目录,再访问 /test/(无对应目录):

    rm -rf /var/www/html/test # 删除test目录
    curl http://localhost/test/
    预期输出:
    plaintext

    尾部有斜杠 /test/:

    访问内容:/var/www/html/test/index.html
    内容:无对应目录

d.upstream 块(负载均衡)
  • 作用:定义后端服务器组,实现负载均衡和健康检查,通常在 http 块中使用。
e.SSL/TLS 配置(HTTPS)
  • 作用:配置安全加密通信,需在 server 块中设置。

nginx全局配置

正常运行必备配置

复制代码
# 指定工作进程的用户和用户组
user nginx nginx;

# 工作进程数量(建议与CPU核心数一致,auto为自动匹配)
worker_processes auto;

# 主进程PID文件路径
pid /run/nginx.pid;

# 加载动态模块配置
include /usr/share/nginx/modules/*.conf;

优化性能相关配置

复制代码
# 单个工作进程可打开的最大文件描述符数(支持高并发)
worker_rlimit_nofile 65535;

# 工作进程绑定CPU核心(减少进程切换开销,4核心示例)
worker_cpu_affinity 0001 0010 0100 1000;

# 自动绑定(Nginx 1.9.10+支持)
# worker_cpu_affinity auto;

# 定时器分辨率(减少时间精度误差,提升时间敏感场景性能)
timer_resolution 100ms;

调试及定位问题配置

复制代码
# 错误日志配置(路径+级别:debug/info/warn/error/crit)
error_log /var/log/nginx/error.log warn;

# 调试模式(仅开发环境使用,会产生大量日志)
# error_log /var/log/nginx/debug.log debug;

# 调试断点(调试特定阶段,stop=暂停,abort=终止进程)
# debug_points stop;

# 传递环境变量到Nginx进程(用于自定义调试参数)
env NGINX_DEBUG=on;

事件驱动相关配置

复制代码
events {
    # 事件驱动模型(Linux推荐epoll,BSD推荐kqueue)
    use epoll;

    # 单个工作进程最大并发连接数
    worker_connections 10240;

    # 允许工作进程一次性接受所有新连接(高并发优化)
    multi_accept on;

    # 关闭连接互斥锁(减少高并发延迟)
    accept_mutex off;
}

配置后需通过nginx -t验证语法正确性,再执行nginx -s reload生效。

root指令与alias指令区别

|------------|----------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|
| 作用范围 | 可在 http、server、location 等配置块中使用 | 仅能在 location 配置块中使用 |
| 路径拼接逻辑 | 定义的路径会与 URI 叠加生成最终访问路径,如root /opt/nginx/static;,访问/image/1.png时,实际路径为/opt/nginx/static/image/1.png | 直接指定绝对路径,不会与 URI 叠加,如alias /opt/nginx/static/image/;,访问/image/1.png时,实际路径为/opt/nginx/static/image/1.png |
| 末尾斜杠要求 | 无强制要求 | 末尾必须添加斜杠 |
| 应用场景 | 适用于为一组 location 定义统一的根目录 | 适用于单个 location 需要映射到特定绝对路径的场景 |

  • 两者都是用来设置静态资源的目录位置,但root会和请求的 URI(访问路径)叠加生成最终路径,而alias是直接指定绝对路径,不会叠加 URI。

示例

前提准备(服务器端操作)
复制代码
# 为 root 指令创建目录结构
mkdir -p /opt/nginx/static/image
# 为 alias 指令创建目录结构
mkdir -p /opt/nginx/static/alias_image
# 生成测试图片(或上传真实图片)
touch /opt/nginx/static/image/test.jpg
touch /opt/nginx/static/alias_image/test.jpg

#确保 Nginx 有权限访问目录
chmod -R 755 /opt/nginx/static
chown -R nginx:nginx /opt/nginx/static
root指令
复制代码
server {
    listen 80;
    server_name your_domain.com; # 替换为你的域名或服务器IP

    location /root-image {
        root /opt/nginx/static; # 根目录,不包含 URI 中的 /root-image
        expires 30d; # 静态资源缓存优化
        autoindex on; # 允许目录浏览(测试用,生产环境建议关闭)
    }
}
alias指令
复制代码
server {
    listen 80;
    server_name your_domain.com; # 替换为你的域名或服务器IP

    location /alias-image {
        alias /opt/nginx/static/alias_image/; # 直接指定绝对路径,末尾必须加斜杠
        expires 30d;
        autoindex on;
    }
}
配置生效与测试
复制代码
nginx -t         # 验证语法正确性
nginx -s reload  # 重启 Nginx 使配置生效

# 测试 root 指令:实际访问路径 /opt/nginx/static/root-image/test.jpg
curl -I http://your_domain.com/root-image/test.jpg

# 测试 alias 指令:实际访问路径 /opt/nginx/static/alias_image/test.jpg
curl -I http://your_domain.com/alias-image/test.jpg
  • 若返回 200 OK,说明路径映射成功;
  • 若返回 404 Not Found,需检查目录路径、文件存在性或权限配置;

nginx.conf 配置文件的语法规则

  • 指令格式 由指令名和参数组成,以分号(;)结尾。示例:worker_processes auto;

  • 配置块 用大括号({})包裹一组相关指令,形成作用域。示例:nginx<br>http {<br> server {<br> listen 80;<br> }<br>}<br>

  • 注释 单行注释以#开头,无多行注释语法。示例:# 这是一条注释

  • 变量引用 用符号引用内置变量或自定义变量。示例:access_log /var/log/nginx/access.log remote_addr;

  • 包含文件 用include指令引入外部配置文件,实现模块化管理。示例:include /etc/nginx/conf.d/*.conf;

  • 语法验证 可通过nginx -t命令验证配置文件语法正确性,避免因语法错误导致 Nginx 启动失败。

相关推荐
何中应2 天前
Nginx转发请求错误
前端·后端·nginx
西岸行者2 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
芝士雪豹只抽瑞克五2 天前
Nginx 高性能Web服务器笔记
服务器·nginx
悠哉悠哉愿意2 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
失重外太空啦2 天前
nginx
运维·nginx
别催小唐敲代码3 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
天蓝不会忘记023 天前
lvs,haproxy,keepalived,nginx,tomcat介绍和实验
nginx·tomcat·lvs