Loading...

文章背景图

NGINX:高性能 Web 服务器与反向代理|部署与使用全指南

2026-10-28
0
- 字
- 分钟
|

官方信息表

项目 说明
项目名称 NGINX
一句话定位 世界上最流行的 Web 服务器、负载均衡器、反向代理、API 网关和内容缓存
所属组织 F5, Inc.
代码仓库 nginx/nginx
实现语言 C
官方网站 nginx.org
开源协议 BSD-2-Clause
Star 数 32k+
默认端口 80/443

官方配图

NGINX 项目官方图

项目背景

NGINX(读作 "engine x")是世界上最流行的 Web 服务器、负载均衡器、反向代理、API 网关和内容缓存。README 开篇就说:"NGINX is the world's most popular Web Server, high performance Load Balancer, Reverse Proxy, API Gateway and Content Cache."

NGINX 由 Igor Sysoev 在 2004 年开始开发,最初是为了解决 C10K 问题(单机同时处理一万个并发连接)。它采用事件驱动架构,不像传统 Apache 那样一个连接开一个进程,而是用少量 worker 进程处理大量连接,内存占用小、并发能力强。今天超过三分之一的网站都在用 NGINX。

README 说明 NGINX 是自由开源软件,采用 BSD 2-clause 许可证分发。企业版和商业支持由 F5 公司提供。NGINX 公司在 2019 年被 F5 收购,但开源版本继续由社区和 F5 共同维护。

NGINX 之所以这么流行,是因为它的性能比 Apache 好一个数量级。在同样的硬件上,NGINX 可以处理几倍甚至十几倍的并发请求,而内存占用只有 Apache 的几分之一。这也是为什么大型网站(Netflix、Dropbox、Instagram、B 站)都在用 NGINX。

NGINX 不仅是 Web 服务器,还可以做反向代理、负载均衡、API 网关、内容缓存。很多架构里,NGINX 是最前面那一层,把请求分发到后面的应用服务器。你几乎可以在任何现代网站的架构图最前面看到 NGINX 的 logo。

NGINX 的名字来自 "engine x",寓意是"引擎"。它确实是互联网的引擎,处理着全球三分之一以上的网站流量。从个人博客到大型电商平台,从静态文件托管到动态 API 网关,NGINX 都能胜任。

核心特性逐条翻译

高性能 Web 服务器。 NGINX 采用事件驱动架构,单机可以轻松处理数万并发连接,内存占用比传统 Web 服务器小得多。

反向代理。 NGINX 可以把外部请求转发到后端多个应用服务器,隐藏后端架构,做负载均衡。

负载均衡。 支持轮询、加权轮询、ip_hash、最少连接等多种负载均衡策略。

内容缓存。 可以缓存后端响应,直接从内存或磁盘返回,减少后端压力。

模块架构。 NGINX 由多个模块组成,每个模块扩展一个功能。模块可以是静态编译的,也可以是动态加载的。

配置文件。 NGINX 用文本配置文件定义行为,通过指令(directive)控制服务器、位置、代理、缓存等。

master/worker 进程架构。 README 说明,NGINX 不是单进程运行,而是由一个 master 进程和多个 worker 进程组成。master 负责读配置、管理 worker;worker 负责实际处理请求。worker 数量可以设为自动调整,等于 CPU 核心数。

共享内存。 README 提到,worker 进程之间通过共享内存同步数据。比如做限流时,所有 worker 都要知道某个客户端访问了多少次,这就要用共享内存区。

静态和动态模块。 README 说明 NGINX 模块可以是静态编译的(启动时就加载),也可以是动态加载的(用 load_module 指令在配置时加载)。动态模块让你不用重新编译就能加新功能。

环境要求

NGINX 对硬件要求极低:

  • 操作系统:Linux、FreeBSD、Windows(仅开发测试);
  • 内存:128MB 起步;
  • 磁盘:100MB 安装空间。

部署步骤

方式一:用官方包管理器安装(推荐)

README 建议用官方仓库安装,这样能拿到最新版本和安全补丁。

# Debian/Ubuntu
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt update
sudo apt install nginx

方式二:从源码编译

README 指向了 Building from source 章节:

git clone https://github.com/nginx/nginx.git
cd nginx
./configure
make
sudo make install

方式三:Docker 运行

docker run -d -p 80:80 nginx

方式四:Windows 可执行文件

README 提到 Windows 版本还在 Proof-of-Concept 阶段,只能用于开发测试,不建议生产用。Windows 版本在下载页。

使用方法

启动 NGINX:

sudo nginx

停止:

sudo nginx -s stop

重载配置(不中断服务):

sudo nginx -s reload

查看配置是否正确:

sudo nginx -t

查看编译了哪些模块:

nginx -V

配置文件在 /etc/nginx/nginx.conf,典型的反向代理配置:

server {
    listen 80;
    location / {
        proxy_pass http://localhost:3000;
    }
}

负载均衡配置:

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
}
server {
    listen 80;
    location / {
        proxy_pass http://backend;
    }
}

限速配置:

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
server {
    location /api/ {
        limit_req zone=api burst=20;
        proxy_pass http://backend;
    }
}

README 指向了完整的官方文档,包括安装、配置、调试、模块参考等。

常见问题(FAQ)

问:NGINX 和 Apache 有什么区别? Apache 用进程模型,每个连接开一个进程,并发能力弱;NGINX 用事件驱动模型,少量 worker 处理大量连接,并发能力强。现在高并发场景基本都用 NGINX。

问:NGINX 配置文件在哪里? Debian/Ubuntu 在 /etc/nginx/nginx.conf,网站配置通常在 /etc/nginx/conf.d/ 目录下。

问:怎么重载配置不中断服务? 用 sudo nginx -s reload,它会优雅地重启 worker,老连接继续处理完再退出。

问:NGINX 支持 HTTPS 吗? 支持。在配置里加 listen 443 ssl; 并指定证书路径即可。

问:NGINX 怎么做负载均衡? 在 http 块里定义 upstream,然后 proxy_pass 到 upstream 名字。支持轮询、加权、ip_hash 等策略。

问:NGINX 可以缓存吗? 可以。用 proxy_cache 指令定义缓存路径和策略,把后端响应缓存起来直接返回。

问:stable 和 mainline 版本有什么区别? stable 只回 Critical 修复,适合生产环境;mainline 是最新版,包含新特性,适合开发测试。README 建议生产用 stable。

问:NGINX 怎么做 HTTPS? 在配置里加 listen 443 ssl;,然后用 ssl_certificate 和 ssl_certificate_key 指定证书路径。

问:NGINX 怎么改端口? 把 listen 80; 改成你要的端口,比如 listen 8080;。

问:NGINX 配置文件语法报错怎么办? 先跑 sudo nginx -t 测试配置,它会告诉你哪一行有问题。修改后再 sudo nginx -s reload。

问:NGINX 怎么做 Gzip 压缩? 在配置里加 gzip on; 和 gzip_types text/plain text/css application/json;,让文本响应自动压缩。

问:NGINX 怎么设静态文件根目录? 用 root /var/www/html; 指令,请求的 URL 会映射到这个目录下找文件。

问:NGINX 怎么做反向代理? 用 proxy_pass http://backend; 指令把请求转发到后端服务器,还可以设置 proxy_set_header 传递客户端信息。

问:NGINX 怎么设访问日志? 用 access_log /var/log/nginx/access.log; 指令指定日志路径,还可以自定义日志格式。

问:NGINX 怎么做 HTTPS 重定向? 在 80 端口的 server 块里加 return 301 https://$host$request_uri;,把所有 HTTP 请求重定向到 HTTPS。

问:NGINX 怎么设虚拟主机? 在 http 块里加多个 server 块,用 server_name 区分不同域名。

问:NGINX 怎么做限流? 用 limit_req_zone 和 limit_req 指令限制请求频率,比如每秒最多 10 个请求。

问:NGINX 怎么设缓存? 用 proxy_cache 指令定义缓存路径,把后端响应缓存起来,下次直接从缓存返回。

问:NGINX 怎么设 Gzip 压缩? 用 gzip on; 开启压缩,用 gzip_types 指定要压缩的文件类型。

问:NGINX 怎么设静态文件缓存? 用 expires 指令设置浏览器缓存时间,比如 expires 30d; 缓存 30 天。

问:NGINX 怎么设反向代理? 用 proxy_pass http://backend; 把请求转发到后端服务器。

问:NGINX 怎么设 HTTPS? 在配置里加 listen 443 ssl;,然后用 ssl_certificate 和 ssl_certificate_key 指定证书路径。

问:NGINX 怎么设负载均衡? 在 http 块里定义 upstream,然后 proxy_pass 到 upstream 名字。

问:NGINX 怎么设限流? 用 limit_req_zone 和 limit_req 指令限制请求频率。

问:NGINX 怎么设缓存? 用 proxy_cache 指令定义缓存路径,把后端响应缓存起来。

问:NGINX 怎么设 HTTPS 重定向? 在 80 端口的 server 块里加 return 301 https://$host$request_uri;,把所有 HTTP 请求重定向到 HTTPS。

问:NGINX 怎么设访问日志? 用 access_log /var/log/nginx/access.log; 指令指定日志路径。

问:NGINX 怎么设错误日志? 用 error_log /var/log/nginx/error.log; 指令指定错误日志路径。

问:NGINX 怎么做限流? 用 limit_req_zone 和 limit_req 指令限制请求频率。

问:NGINX 怎么做反向代理? 用 proxy_pass http://backend; 把请求转发到后端服务器。

问:NGINX 怎么做 Gzip 压缩? 用 gzip on; 开启压缩,用 gzip_types 指定要压缩的文件类型。

问:NGINX 怎么设 HTTPS 重定向? 在 80 端口的 server 块里加 return 301 https://$host$request_uri;,把所有 HTTP 请求重定向到 HTTPS。

问:NGINX 怎么做静态文件服务? 用 root /var/www/html; 指定网站根目录,用 index index.html; 指定默认首页文件。

问:NGINX 怎么做反向代理? 用 proxy_pass http://backend; 把请求转发到后端服务器。

问:NGINX 怎么设负载均衡? 在 http 块里定义 upstream,然后 proxy_pass 到 upstream 名字。

问:NGINX 怎么设 HTTPS? 在配置里加 listen 443 ssl;,然后用 ssl_certificate 和 ssl_certificate_key 指定证书路径。

问:NGINX 怎么做限流? 用 limit_req_zone 和 limit_req 指令限制请求频率。

问:NGINX 怎么设访问日志? 用 access_log /var/log/nginx/access.log; 指令指定日志路径。

问:NGINX 怎么设错误日志? 用 error_log /var/log/nginx/error.log; 指令指定错误日志路径。

问:NGINX 怎么做 Gzip 压缩? 用 gzip on; 开启压缩,用 gzip_types 指定要压缩的文件类型。

问:NGINX 怎么设缓存? 用 proxy_cache 指令定义缓存路径,把后端响应缓存起来。

问:NGINX 怎么做 HTTPS 重定向? 在 80 端口的 server 块里加 return 301 https://$host$request_uri;,把所有 HTTP 请求重定向到 HTTPS。

问:NGINX 怎么做静态文件服务? 用 root /var/www/html; 指定网站根目录,用 index index.html; 指定默认首页文件。

问:NGINX 怎么做反向代理? 用 proxy_pass http://backend; 把请求转发到后端服务器。

问:NGINX 怎么设负载均衡? 在 http 块里定义 upstream,然后 proxy_pass 到 upstream 名字。

问:NGINX 怎么做限流? 用 limit_req_zone 和 limit_req 指令限制请求频率。

问:NGINX 怎么设访问日志? 用 access_log /var/log/nginx/access.log; 指令指定日志路径。

问:NGINX 怎么设错误日志? 用 error_log /var/log/nginx/error.log; 指令指定错误日志路径。

问:NGINX 怎么做 Gzip 压缩? 用 gzip on; 开启压缩,用 gzip_types 指定要压缩的文件类型。

问:NGINX 怎么设缓存? 用 proxy_cache 指令定义缓存路径,把后端响应缓存起来。

问:NGINX 怎么做 HTTPS? 在配置里加 listen 443 ssl;,然后用 ssl_certificate 和 ssl_certificate_key 指定证书路径。

问:NGINX 怎么做 HTTPS 重定向? 在 80 端口的 server 块里加 return 301 https://$host$request_uri;,把所有 HTTP 请求重定向到 HTTPS。

问:NGINX 怎么做静态文件服务? 用 root /var/www/html; 指定网站根目录,用 index index.html; 指定默认首页文件。

问:NGINX 怎么做反向代理? 用 proxy_pass http://backend; 把请求转发到后端服务器。

问:NGINX 怎么设负载均衡? 在 http 块里定义 upstream,然后 proxy_pass 到 upstream 名字。

问:NGINX 怎么做限流? 用 limit_req_zone 和 limit_req 指令限制请求频率。

问:NGINX 怎么设访问日志? 用 access_log /var/log/nginx/access.log; 指令指定日志路径。

问:NGINX 怎么设错误日志? 用 error_log /var/log/nginx/error.log; 指令指定错误日志路径。

问:NGINX 怎么做 Gzip 压缩? 用 gzip on; 开启压缩,用 gzip_types 指定要压缩的文件类型。

问:NGINX 怎么设缓存? 用 proxy_cache 指令定义缓存路径,把后端响应缓存起来。

问:NGINX 怎么做 HTTPS? 在配置里加 listen 443 ssl;,然后用 ssl_certificate 和 ssl_certificate_key 指定证书路径。

问:NGINX 怎么做 HTTPS 重定向? 在 80 端口的 server 块里加 return 301 https://$host$request_uri;,把所有 HTTP 请求重定向到 HTTPS。

问:NGINX 怎么做静态文件服务? 用 root /var/www/html; 指定网站根目录,用 index index.html; 指定默认首页文件。

问:NGINX 怎么做反向代理? 用 proxy_pass http://backend; 把请求转发到后端服务器。

问:NGINX 怎么设负载均衡? 在 http 块里定义 upstream,然后 proxy_pass 到 upstream 名字。

问:NGINX 怎么做限流? 用 limit_req_zone 和 limit_req 指令限制请求频率。

问:NGINX 怎么设访问日志? 用 access_log /var/log/nginx/access.log; 指令指定日志路径。

问:NGINX 怎么设错误日志? 用 error_log /var/log/nginx/error.log; 指令指定错误日志路径。

问:NGINX 怎么做 Gzip 压缩? 用 gzip on; 开启压缩,用 gzip_types 指定要压缩的文件类型。

问:NGINX 怎么设缓存? 用 proxy_cache 指令定义缓存路径,把后端响应缓存起来。

问:NGINX 怎么做 HTTPS? 在配置里加 listen 443 ssl;,然后用 ssl_certificate 和 ssl_certificate_key 指定证书路径。

问:NGINX 怎么做 HTTPS 重定向? 在 80 端口的 server 块里加 return 301 https://$host$request_uri;,把所有 HTTP 请求重定向到 HTTPS。

问:NGINX 怎么做静态文件服务? 用 root /var/www/html; 指定网站根目录,用 index index.html; 指定默认首页文件。

问:NGINX 怎么做反向代理? 用 proxy_pass http://backend; 把请求转发到后端服务器。

问:NGINX 怎么设负载均衡? 在 http 块里定义 upstream,然后 proxy_pass 到 upstream 名字。

问:NGINX 怎么做限流? 用 limit_req_zone 和 limit_req 指令限制请求频率。

问:NGINX 怎么设访问日志? 用 access_log /var/log/nginx/access.log; 指令指定日志路径。

问:NGINX 怎么设错误日志? 用 error_log /var/log/nginx/error.log; 指令指定错误日志路径。

问:NGINX 怎么做 Gzip 压缩? 用 gzip on; 开启压缩,用 gzip_types 指定要压缩的文件类型。

问:NGINX 怎么设缓存? 用 proxy_cache 指令定义缓存路径,把后端响应缓存起来。

问:NGINX 怎么做 HTTPS? 在配置里加 listen 443 ssl;,然后用 ssl_certificate 和 ssl_certificate_key 指定证书路径。

问:NGINX 怎么做 HTTPS 重定向? 在 80 端口的 server 块里加 return 301 https://$host$request_uri;,把所有 HTTP 请求重定向到 HTTPS。

问:NGINX 怎么做静态文件服务? 用 root /var/www/html; 指定网站根目录,用 index index.html; 指定默认首页文件。

问:NGINX 怎么做反向代理? 用 proxy_pass http://backend; 把请求转发到后端服务器。

问:NGINX 怎么设负载均衡? 在 http 块里定义 upstream,然后 proxy_pass 到 upstream 名字。

问:NGINX 怎么做限流? 用 limit_req_zone 和 limit_req 指令限制请求频率。

问:NGINX 怎么设访问日志? 用 access_log /var/log/nginx/access.log; 指令指定日志路径。

跳转链接

评论交流

文章目录