nginx的基础使用
目录
一、概念
1.1 核心概念
1.2 核心作用
1.3 主要应用场景
二、核心架构与工作原理
三、基础操作与配置
3.1 目录结构
3.2 核心配置文件:nginx.conf
3.2.1 全局与事件块
3.2.2 HTTP 块配置
3.2.3 Server 块配置
3.2.4 注意事项
3.3 常用命令
一、概念
1.1 核心概念
Nginx 是一个高性能、高并发、低内存消耗的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。可以把Nginx想象成一个非常高效、多才多艺的“交通警察”和“内容分发员”。它位于客户端(如浏览器)和你的后端服务(如应用服务器、文件存储)之间,指挥流量、分发内容并提供安全保障。
⽀持50000个并发连接数,不仅如此,CPU和内存的占⽤也⾮常的低,10000个没有活动的连 接才占⽤2.5M的内存。
正向代理是客户端的代理,它代表客户端向服务器发送请求,隐藏了真实的客户端。
反向代理是服务器的代理,它代表服务器接收客户端的请求,隐藏了真实的服务器。
擅长:
-
IO 密集型操作:处理网络流量、读写静态文件。
-
请求路由和分发:根据规则决定将请求发往何处。
-
内容转换:简单的头部修改、Gzip 压缩、响应重写。
-
缓存:缓存代理内容和静态内容,极大减轻后端压力。
1.2 核心作用
-
高性能的 Web 服务器
-
静态内容服务:这是 Nginx 的看家本领。它能够以极高的并发性和极低的内存消耗处理静态文件(如 HTML、CSS、JavaScript、图片、视频、字体等)的请求。它的异步非阻塞事件驱动架构使其在处理大量并发连接时表现卓越,远超传统的 Apache 等多线程/多进程模型。
-
SSL/TLS 终止:Nginx 可以处理 HTTPS 连接的加密和解密工作(即 SSL/TLS 终止)。客户端与 Nginx 建立安全的 HTTPS 连接,而 Nginx 与后端服务器则可以通过普通的 HTTP 通信。这减轻了后端服务器的计算压力。
-
缓存:Nginx 可以作为缓存服务器,将来自后端的响应缓存起来。对于相同的请求,Nginx 可以直接从缓存中返回内容,而无需再次请求后端服务器,极大地加快了响应速度并减少了后端负载。
-
高可靠性:Nginx 以稳定性著称,即使在极高负载下也能平稳运行。它的主进程(Master Process)和工作进程(Worker Process)分离,即使工作进程出现问题,主进程也可以快速重启一个新的,保证服务不中断。
-
高扩展性:通过模块化的设计,Nginx 的功能可以通过模块进行扩展。有大量的官方第三方模块可供选择,用于实现各种功能,如地理IP定位、图像转换、身份验证等。
-
-
反向代理服务器
-
负载均衡:Nginx 可以接收所有客户端的请求,然后按照一定的策略(如轮询、权重、IP哈希、最少连接数等)将请求分发到后端的多个应用服务器(如 Tomcat, Node.js, Django, PHP-FPM 等集群)。这提高了应用的可扩展性、可用性和性能。
-
应用解耦与安全:客户端不直接访问应用服务器,而是通过 Nginx 这个中间层。这隐藏了后端服务器的真实 IP 和结构,提供了额外的安全层。同时,后端服务器的变化(如扩容、下线)对客户端是透明的。
-
-
API 网关(反向代理功能的延伸)
-
在现代微服务架构中,Nginx 常被用作简单的 API 网关,实现路由转发(将
/user/**
的请求转发到用户服务,将/order/**
的请求转发到订单服务)、认证、限流、日志聚合等。
-
1.3 主要应用场景
-
静态内容服务:作为 Web 服务器,直接提供 HTML、图片、视频等静态文件。这是其最直接和高效的应用。
-
反向代理服务器:隐藏后端真实服务器,提高安全性;实现负载均衡,将流量分发到多个应用服务器实例。
-
API 网关:在现代微服务架构中,Nginx 常被用作 API 网关,负责请求路由、认证、限流、日志记录等。
-
SSL 终端:集中管理 SSL 证书,为多个后端服务提供 HTTPS 访问能力。
-
缓存层:在用户和后端应用之间建立缓存层,加速访问并减轻应用服务器压力。
-
访问控制与安全:通过配置实现基于 IP 的访问限制、密码认证、限制请求速率等,增强应用安全性。
二、核心架构与工作原理
Nginx 采用一个主进程(Master Process) 和多个工作进程(Worker Process) 的模型。
-
主进程 (Master Process):
-
以
root
身份运行(为了绑定 80/443 等特权端口)。 -
主要职责是:读取和验证配置、管理/维护工作进程(启动、停止、平滑重载配置)。
-
它不处理具体的客户端请求。
-
-
工作进程 (Worker Process):
-
以非特权用户(如
www-data
,nginx
)运行,提高安全性。 -
是真正处理 HTTP 请求的进程。
-
它们相互独立,使用异步非阻塞模型来处理成千上万的并发连接。
-
工作进程的数量通常配置为与服务器的 CPU 核心数相同,以最大化硬件性能。
-
-
事件驱动模型:
-
每个工作进程内部都有一个高效的事件循环(Event Loop)。
-
它不断地检查是否有新的网络事件发生(如新的连接、可读的数据、可写的缓冲区)。
-
当一个事件发生时,工作进程会快速地处理它(如读取请求头、访问磁盘文件、转发请求),然后立即返回事件循环去处理下一个事件,而不是等待一个操作(如磁盘I/O)完成。操作完成后会触发另一个事件,工作进程再回来处理。
-
这种“非阻塞”的方式避免了进程因等待而“空闲”,使得 CPU 利用率非常高。
-
三、基础操作与配置
3.1 目录结构
-
路径差异:以下路径是基于 Linux 发行版通过包管理器安装 的典型路径。如果您是通过源码编译方式安装的 Nginx,前缀路径通常为
/usr/local/nginx/
(例如:配置文件在/usr/local/nginx/conf/nginx.conf
)。 -
配置管理最佳实践:建议将自定义的虚拟主机配置(server block)在
/etc/nginx/sites-available/
下创建文件(如example.com
),然后通过ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
命令创建软链接来启用它。这种模式可以轻松地启用和禁用站点。
目录 | 文件 | 说明 |
---|---|---|
/etc/nginx/ | 核心配置目录,所有配置文件都存放于此。 | |
nginx.conf | 主配置文件。Nginx 启动时读取的入口文件,包含全局设置,并通过 include 指令引用其他配置。 | |
mime.types | MIME类型映射文件。定义了文件扩展名与内容类型(Content-Type)的对应关系。 | |
proxy_params fastcgi_params | 通用参数文件。通常包含反向代理或FastCGI相关的通用配置指令,供其他配置文件 include 以保持整洁。 | |
sites-available/ | 可用站点配置目录。在此目录中存放所有虚拟主机(server block)的配置文件。但这里的配置不会被Nginx直接启用,相当于一个配置仓库。 | |
sites-enabled/ | 启用站点配置目录。此目录中的文件通常是 sites-available/ 中配置文件的符号链接(软链接)。Nginx 主配置会包含此目录下的文件,只有在这里的配置才会被真正启用。通过创建或删除符号链接来启用或禁用站点非常方便。 | |
conf.d/ | 附加配置目录。通常用于存放各种服务的配置文件(*.conf )。主配置文件nginx.conf 默认会包含此目录下的所有 .conf 文件。管理自定义配置的推荐位置。通常在这里为每个网站或服务创建一个独立的 .conf 文件(如 example.com.conf )。 | |
modules-available/ | 可用模块目录。存放已安装的动态模块(.so 文件)的配置文件。 | |
modules-enabled/ | 启用模块目录。存放指向 modules-available/ 目录的符号链接,用于启用动态模块。 | |
/var/log/nginx/ | 日志文件目录。存放 Nginx 运行过程中产生的日志文件。 | |
access.log | 访问日志文件。记录所有客户端请求的详细信息(默认配置下)。 | |
error.log | 错误日志文件。记录 Nginx 运行和调试过程中的错误、警告等信息。排查故障时首先查看的文件。日志级别可调。 | |
/var/www/html/ 或 /usr/share/nginx/html/ | 默认网站根目录。存放网站静态资源(HTML, CSS, JS, 图片等)的位置。访问服务器时,Nginx 默认会在此寻找 index.html 等文件。 | |
/usr/sbin/nginx | Nginx 二进制可执行文件。Nginx 服务的主程序文件。 | |
/lib/systemd/system/ /etc/systemd/system/ | nginx.service | Systemd 服务单元文件。用于通过 systemctl 命令(如 systemctl start nginx )来管理 Nginx 服务的启动、停止、重启等。 |
/usr/lib/nginx/ | Nginx 模块目录。存放 Nginx 动态模块(.so 文件)的目录。 | |
/var/cache/nginx/ | Nginx 缓存目录。如果配置了代理缓存或 FastCGI 缓存,生成的缓存文件会存放于此。 | |
/run/nginx.pid | Nginx 主进程 PID 文件。此文件存储了当前正在运行的 Nginx 主进程的进程ID(PID)。 |
3.2 核心配置文件:nginx.conf
Nginx 的配置文件通常是一个名为 nginx.conf
的文本文件。它的结构遵循分层嵌套的模式,主要由 Main(全局设置)、Events(事件模块设置)、Http(HTTP 服务器设置)以及 Server(虚拟主机设置)和 Location(URL 匹配特定位置设置)等块组成。其中,Server 块继承 Main 块,Location 块又继承 Server 块。
3.2.1 全局与事件块
这个文件是 Nginx 的核心,主要设置全局参数和工作模式。
Main 和 Events 块核心配置项:
文件功能 | 配置项 | 说明 |
---|---|---|
全局设置 | user | 指定运行 Nginx worker 进程的用户和组,例如 user nginx nginx; 。权限控制,增强安全性。 |
worker_processes | 设置 worker 进程的数量。通常设置为与 CPU 核心数相等或 auto (自动检测)。 | |
error_log | 错误日志的存放路径和记录级别(如 warn )。调试和故障排除的关键。 | |
pid | 指定存储 Nginx master 进程 PID 的文件路径。方便管理进程。 | |
worker_rlimit_nofile | 设置一个 worker 进程能打开的最大文件描述符数。在高并发场合非常重要,需要根据系统限制(ulimit -n )调整。 | |
事件模块 | events | 包含事件处理相关的配置。 |
worker_connections | 每个 worker 进程能够同时处理的最大连接数。理论总并发连接数 = worker_processes × worker_connections 。 | |
use | 指定事件驱动模型。在 Linux 系统下,推荐使用 epoll ,它能高效处理大量连接。 | |
multi_accept | 设置为 on 时,一个 worker 进程可以同时接受多个新连接。有助于提高吞吐量。 |
生产配置示例 (nginx.conf 部分):
# 运⾏⽤户和组,为了安全考虑,不建议使⽤ root,指定非 root 用户运行 worker 进程。
user nginx nginx;
# Worker进程数,设置为auto可⾃动检测CPU核⼼数
worker_processes auto;
# 错误日志路径及级别(debug, info, notice, warn, error, crit, alert, emerg)
error_log /var/log/nginx/error.log warn;
# 存储主进程PID的⽂件,便于服务管理
pid /var/run/nginx.pid;
# ⼀个Worker进程能打开的最⼤⽂件描述符数(连接数),需配合系统设置
worker_rlimit_nofile 65535;# 事件处理模型配置
events {# 使⽤epoll事件驱动模型(Linux环境下⾼性能⽅案)use epoll;# 每个Worker进程的最⼤连接数worker_connections 10240;# 允许⼀个Worker同时接受多个新连接multi_accept on;
}
3.2.2 HTTP 块配置
HTTP 块定义了 Nginx 如何处理 HTTP 和 HTTPS 请求,是配置最丰富的部分。
Http 块核心配置项:
文件功能 | 配置项 | 说明 |
---|---|---|
基础设置 | include | 引入其他配置文件(如 mime.types ),使配置更清晰、模块化。 |
default_type | 默认的 MIME 类型。当无法识别文件类型时,会使用此类型,例如 application/octet-stream 。 | |
sendfile | 设置为 on 时,启用高效文件传输模式,减少文件在应用和内核空间之间的拷贝。 | |
日志设置 | log_format | 定义访问日志的记录格式。可以包含客户端IP、请求时间、请求方法、状态码、User-Agent等信息。 |
access_log | 访问日志的存放路径和使用的格式。 | |
传输优化 | tcp_nopush | 在 sendfile on 时有效。将数据包攒到一起发送,提高网络效率。 |
tcp_nodelay | 禁用 Nagle 算法,允许立即发送小数据包,改善实时性。 | |
keepalive_timeout | 设置客户端与服务器保持长连接的超时时间(单位:秒)。减少 TCP 连接重复建立的开销。 | |
压缩与缓存 | gzip | 设置为 on 时,开启 Gzip 压缩,有效减少传输数据量。 |
gzip_comp_level | Gzip 压缩级别 (1-9)。级别越高压缩比越大,但 CPU 消耗也越多,通常建议 2-6。 | |
gzip_types | 指定需要压缩的 MIME 类型,例如 text/css application/javascript 。 | |
客户端限制 | client_max_body_size | 允许客户端请求 body 的最大体积。重要:上传文件时需调整此值,例如 20m (20MB)。 |
client_body_buffer_size | 设置用于读取客户端请求体的缓冲区大小。 | |
上游服务与代理 | upstream | 定义一组后端服务器,用于负载均衡或反向代理。 |
proxy_pass | 在 location 块中使用,将请求转发到指定的 upstream 或后端服务器地址。 |
生产配置示例 (http 块部分):
http {# 引⼊MIME类型定义⽂件include /etc/nginx/mime.types;# 默认MIME类型,当⽆法识别⽂件类型时使⽤default_type application/octet-stream;# 定义⽇志格式 mainlog_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)sendfile on;# 优化数据包发送,减少通信次数(通常在sendfile开启时有效)tcp_nopush on;# 禁⽤Nagle算法,减少数据传输延迟tcp_nodelay on;# 根据需要隐藏 Nginx 版本号# server_tokens off;# 客户端连接保持超时时间(秒)keepalive_timeout 65;# 开启Gzip压缩gzip on;# 设置Gzip压缩级别(1-9,压缩⽐和CPU开销折衷)gzip_comp_level 6;# 最⼩压缩⽂件⼤⼩,太⼩的⽂件压缩效果不明显gzip_min_length 1k;# 指定需要压缩的MIME类型gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;# 允许客户端请求的最⼤Body体积(重要,特别是上传⽂件时)client_max_body_size 20m;# 客户端请求体缓冲区⼤⼩client_body_buffer_size 128k;# 负载均衡后端服务器组定义(upstream)upstream backend_servers {# weight表⽰权重,权重越⾼被分配到的⼏率越⼤server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s; # max_fails表⽰失败次数,fail_timeout表⽰超时时间server 192.168.1.11:8080 weight=5 max_fails=3 fail_timeout=30s;server 192.168.1.12:8080 weight=1 max_fails=3 fail_timeout=30s; # 此服务器权重较低,处理较少请求# 还可配置负载均衡策略,如ip_hash(同IP固定后端)、least_conn(最少连接数)等}# 引⼊其他conf⽂件(如虚拟主机配置)include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;
}
3.2.3 Server 块配置
Server 块定义了虚拟主机,用于处理对特定域名或端口的请求。通常在 nginx.conf 或 conf.d/*.conf 中。
模块化配置:使用 include
指令将不同站点的配置拆分到 /etc/nginx/conf.d/
或 /etc/nginx/sites-enabled/
下的独立文件中,使结构更清晰,管理更方便
Server 块核心配置项:
文件功能 | 配置项 | 说明 |
---|---|---|
虚拟主机标识 | listen | 服务器监听的 IP 地址和端口(如 80 , 443 ssl )。 |
server_name | 域名(或主机名),用于匹配请求。可以使用通配符(*.example.com )或正则表达式。 | |
根目录与索引 | root | 该 server 或 location 块的 根目录,用于构造请求文件的完整路径。 |
index | 指定默认的索引文件。例如 index index.html index.htm; 。 | |
SSL 证书 | ssl_certificate | SSL 证书文件(如 .pem 或 .crt 文件)的路径。 |
ssl_certificate_key | SSL 证书私钥文件(.key 文件)的路径。 | |
错误页面 | error_page | 定义特定错误码(如 404 , 500 )时返回的自定义页面。 |
位置块 | location | 根据请求的 URI(路径)进行更精细的配置。匹配规则多样(精确 = , 前缀 ^~ , 正则 ~ 或 ~* 等),优先级不同。 |
反向代理 | proxy_set_header | 在 location 块中与 proxy_pass 配合使用,将客户端信息(如真实 IP)传递给后端服务器。常用 Host , X-Real-IP , X-Forwarded-For , X-Forwarded-Proto 等头部。 |
静态资源 | alias | 在 location 块中定义目录别名,用于将请求映射到文件系统中的特定路径,与 root 指令有所不同。 |
try_files | 尝试按顺序提供文件或目录,若都不存在可指定默认动作(如转发或返回错误页面)。常用于单页应用(SPA)的路由处理。 |
生产配置示例 (Server 块部分):以下示例包含一个处理 HTTP 并重定向到 HTTPS 的 server 块,以及一个配置了 SSL、静态资源服务和反向代理的 HTTPS server 块。
# 重定向HTTP请求到HTTPS
server {listen 80;server_name example.com www.example.com;# 301永久重定向到HTTPS版本return 301 https://$server_name$request_uri;
}# HTTPS主服务器配置
server {# 监听443端⼝,并启⽤SSLlisten 443 ssl http2; # http2可提升性能server_name example.com www.example.com;# SSL证书和密钥路径ssl_certificate /etc/nginx/ssl/example.com.crt;ssl_certificate_key /etc/nginx/ssl/example.com.key;# SSL会话缓存等优化参数ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;# 根⽬录和默认索引⽂件root /usr/share/nginx/html;index index.html index.htm;# 通⽤Location块 - 处理静态资源location / {# 尝试提供服务:先找$uri⽂件,再找$uri/目录下的索引⽂件,最后移交index.html(适⽤于单⻚应⽤)try_files $uri $uri/ /index.html;}# 处理后端API请求 - 反向代理location /api/ {# 代理到之前定义的 upstream 组 或 特定后端地址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;# ⼀些超时和缓冲区配置proxy_connect_timeout 30s;proxy_send_timeout 30s;proxy_read_timeout 30s;client_max_body_size 20m; # 覆盖http块中的全局设置}# 处理静态⽂件(图⽚, CSS, JS)的Location块,并设置缓存location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {# 静态资源根⽬录(也可使⽤alias)root /usr/share/nginx/static;# 设置浏览器缓存时间expires 30d;# 关闭⽇志记录以减少I/Oaccess_log off;add_header Cache-Control "public, immutable";}# 精确匹配 = 的Location⽰例:健康检查端点location = /health {access_log off;# 返回200状态码和"OK"⽂本return 200 "OK\n";add_header Content-Type text/plain;}# 定义错误⻚⾯error_page 404 /404.html;location = /404.html {root /usr/share/nginx/error_pages;internal; # 标记此location只能由内部请求使⽤}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/error_pages;internal;}
}
配置 Nginx SSL 私钥文件的权限是确保服务器安全的重要环节。核心原则是:尽可能收紧权限,确保仅允许必要的用户(通常是 root 或 Nginx 主进程)读取该文件。
权限设置 | 所有权设置 (示例) | 适用场景/说明 |
---|---|---|
600 (rw-------) | root:root | 常见设置。 root用户拥有全部权限,其他用户无任何权限。Nginx主进程通常以root启动,有能力读取。 |
640 (rw-r-----) | root:ssl-cert 或 root:nginx | 将私钥文件组所有者设为特定的组(如ssl-cert 或nginx ),并让Nginx工作进程用户加入该组。 |
400 (r--------) | root:root | 比600 更严格,连root用户也无法修改(但可以更改权限后修改),只允许读取。 |
3.2.4 注意事项
-
日志管理:定期轮询(rotate)日志文件,避免日志文件过大。可使用
logrotate
工具。 -
测试与重载:每次修改配置文件后,务必使用
nginx -t
命令测试配置语法是否正确。确认无误后,使用nginx -s reload
命令平滑重载配置,而不会中断现有连接。 -
性能调优:
-
根据 CPU 核心数设置
worker_processes
。 -
合理设置
worker_connections
和worker_rlimit_nofile
,以支持高并发。 -
启用
sendfile
、tcp_nopush
、gzip
等优化选项。 -
根据静态资源情况设置浏览器缓存 (
expires
)。
-
-
权限与安全:
-
使用
user
指令指定非 root 用户运行 worker 进程。 -
确保 SSL 私钥文件权限设置为
600
或400
,且仅对 root 用户可读。 -
根据需要隐藏 Nginx 版本号:在
http
块中设置server_tokens off;
-
限流:使用
limit_req_zone
限制请求速率,防止恶意攻击。
-
3.3 常用命令
类别 | 命令 | 作用描述 | 常用场景 |
---|---|---|---|
启动命令 | nginx | 启动 Nginx 服务 | 初次启动 Nginx |
systemctl start nginx | 使用 systemd 系统启动 Nginx 服务 | 在 systemd 系统上启动 Nginx | |
停止命令 | nginx -s stop | 立即停止 Nginx 服务 | 需要立即终止服务时 |
nginx -s quit | 优雅停止:等待当前请求处理完毕后再停止 | 希望正常处理完已接收的请求后再停止,避免中断业务 | |
systemctl stop nginx | 使用 systemd 系统停止 Nginx 服务 | 在 systemd 系统上停止 Nginx | |
重启与重载 | nginx -s reload | 重载配置:重新加载配置文件而不中断正在处理的连接 | 修改了 nginx.conf 或其他配置文件后,希望新配置生效 |
systemctl reload nginx | 使用 systemd 系统重载 Nginx 配置 | 在 systemd 系统上重载配置 | |
systemctl restart nginx | 重启服务:先停止再启动 Nginx 服务 | 配置文件变更无法通过重载生效,或需要完全重启服务时 | |
配置检查 | nginx -t | 测试配置文件语法是否正确 | 修改配置文件后,检查是否有语法错误 before reload 或 restart |
nginx -T | 测试配置并显示配置内容 | 需要查看当前 Nginx 实际读取的配置内容时 | |
日志管理 | tail -f /var/log/nginx/access.log | 实时查看访问日志尾部 | 实时监控访问情况,排查问题 |
tail -f /var/log/nginx/error.log | 实时查看错误日志尾部 | 查看错误信息,诊断 Nginx 运行问题 | |
nginx -s reopen | 重新打开日志文件 | 日志文件被切割(logrotate)后,让 Nginx 开始写入新的日志文件 | |
状态与信息查询 | nginx -v | 查看 Nginx 版本 | 查看当前安装的 Nginx 版本号 |
nginx -V | 查看 Nginx 详细版本及编译信息 | 查看编译时开启了哪些模块和参数 | |
systemctl status nginx | 查看 Nginx 服务运行状态 | 检查 Nginx 是否正常运行、有无错误 | |
ps aux | grep nginx | 查看 Nginx 进程信息 | 查看 Nginx 主进程和工作进程的状态及 PID | |
其他命令 | nginx -c /path/to/nginx.conf | 使用指定配置文件启动 Nginx | 需要使用非默认位置的配置文件时 |
其他:
-
检查端口监听:使用
netstat -tulnp | grep nginx
或ss -tulnp | grep nginx
查看 Nginx 正在监听的端口和状态。