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

项目背景
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; 指令指定日志路径。
跳转链接
- 官方代码仓库:nginx/nginx
- 官方网站:nginx.org
- 官方文档:nginx.org/en/docs
- 新手指南:Beginners Guide
- 安装文档:nginx.org/en/docs/install.html
- 编译文档:nginx.org/en/docs/configure.html
- 指令参考:dirindex.html
- 社区论坛:community.nginx.org
- 企业版:F5 NGINX