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 启动失败。

相关推荐
jiushun_suanli3 小时前
FPGA(现场可编程门阵列)详解
经验分享·学习·fpga开发
百***25613 小时前
Nginx作用以及应用场景
运维·nginx
小徐敲java3 小时前
window使用phpStudy在nginx部署前端测试
运维·前端·nginx
Crazy________3 小时前
38nginx四层负载均衡配置,和动静分离解析
linux·运维·nginx·负载均衡
百***35944 小时前
如何在树莓派部署Nginx并实现无公网ip远程访问内网制作的web网站
前端·tcp/ip·nginx
虫洞没有虫4 小时前
Go语言学习笔记(二)
笔记·学习
AA陈超5 小时前
ASC学习笔记0001:处理目标选择系统中当Actor拒绝目标确认时的调用
c++·笔记·学习·游戏·ue5·游戏引擎·虚幻
AI研一研6 小时前
如何快速学习知识、查找要点、把知识读“薄”、读“精”?
人工智能·学习
roman_日积跬步-终至千里6 小时前
【Nginx】Nginx 多协议负载均衡实战:StarRocks 与 MinIO 代理配置全解析
运维·nginx·负载均衡