一、Nginx 简介
1.1 什么是 Nginx
Nginx(发音同 "engine x")是一款高性能的 HTTP 服务器、反向代理服务器 及 邮件代理服务器(IMAP/POP3/SMTP)。
| 项目 | 说明 |
|---|---|
| 作者 | 伊戈尔·赛索耶夫(Igor Sysoev) |
| 开发背景 | 为俄罗斯访问量第二的 Rambler.ru 站点开发 |
| 首次发布 | 2004年10月4日(版本 0.1.0) |
| 开源协议 | BSD-like 许可证 |
| 官方网站 | https://nginx.org |
使用 Nginx 的知名企业:百度、京东、新浪、网易、腾讯、淘宝等。
1.2 核心功能
Nginx 最核心的两个功能:
- 高性能的静态 Web 服务器
- 反向代理
正向代理 vs 反向代理


上面的示意中,上边是正向代理,下边是反向代理。
正向代理:代理服务器代表客户端去访问后端服务器,代理的对象是前面的用户。
反向代理:代理服务器代表后端服务器对外提供服务,对于前面的用户来说是无感知的,代理的对象是后面的服务器。1.3 Nginx 的优势
- 高并发、高性能
- 扩展性好(模块化设计)
- 异步非阻塞的事件驱动模型
- 高可靠性(支持热部署,可长时间稳定运行)
二、Nginx 安装
2.1 Ubuntu 安装
Ubuntu 安装 Nginx 比较方便,可以直接使用 apt 源安装:
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get install nginx执行以上命令后,即可完成安装。
执行下面命令查看是否安装成功:
nginx -v2.2 安装后的目录结构
/etc/nginx/ # 配置文件主目录 ├── nginx.conf # 主配置文件 ├── sites-available/ # 可用站点配置 ├── sites-enabled/ # 启用站点配置(软链接) ├── conf.d/ # 额外配置目录 ├── mime.types # MIME 类型映射 └── modules-available/ # 可用模块 /usr/sbin/nginx # 可执行文件 /var/log/nginx/ # 日志目录 ├── access.log # 访问日志 └── error.log # 错误日志 /var/www/html/ # 默认网站根目录 /run/nginx.pid # PID 文件
下面再看几个最常接触到的核心路径:
在 /etc/nginx 目录下可以看到 Nginx 的配置文件 nginx.conf。
主配置文件是 nginx.conf,Nginx 的可执行文件位于 /usr/sbin/nginx,日志文件位于 /var/log/nginx。
# 程序的路径
/usr/sbin/nginx
# 配置文件的路径
/etc/nginx/nginx.conf
# 日志文件的路径
/var/log/nginx三、Nginx 常用命令
下面以 Ubuntu 18.04 为例:
# 启动命令
sudo nginx
# 关闭命令
sudo nginx -s stop
# 重载命令
sudo nginx -s reload四、Nginx 配置文件
- 核心配置文件就是
nginx.conf - 配置文件中有很多以
#开头的注释内容,去掉这些注释后,主体结构会更清晰
4.1 配置文件结构
nginx.conf
├── 全局块(Global)
├── events 块
└── http 块
├── http 全局块
└── server 块(虚拟主机)
├── server 全局块
└── location 块(URL 路由)下面结合截图来看这几个部分在实际配置文件中的位置:

根据该文件,可以很明显地把 nginx.conf 分为三部分:

4.2 全局配置
从配置文件开始到 events 块之间的内容,主要设置一些影响 Nginx 服务器整体运行的配置指令,例如:
- 运行 Nginx 服务的用户(组)
- 允许生成的 worker process 数量
- PID 文件存放路径
- 日志路径
- 其他配置文件的引入
例如:
user www-data; # 运行 worker 子进程的用户
worker_processes auto; # 子进程数量
pid /run/nginx.pid; # 运行 master 的 pid 文件存放路径
include /etc/nginx/modules-enabled/*.conf; # 引入其他配置文件其中,worker_processes 是 Nginx 并发处理能力的重要配置项,值越大,可支持的并发处理量通常也越大,但会受到硬件条件限制。
worker_processes 设置建议:
- 开发环境:
1或auto - 生产环境:等于 CPU 核心数或
auto - 高并发场景:
CPU核心数 × 2
4.3 events 配置
例如:
events {
worker_connections 768;
}events 块主要影响 Nginx 服务器与用户的网络连接处理,例如每个 worker process 可同时支持的最大连接数等。上面的例子表示每个 worker process 支持的最大连接数是 768。
最大并发连接数计算:
最大并发连接数 = worker_processes × worker_connections4.4 http 配置
http 块是 Nginx 配置中最常见的部分,代理、缓存以及日志等大量功能都在这里配置。http 块中还可以继续包含:
http全局块server块
http 全局块
http 全局块中常见配置包括:
- 文件引入
- MIME-TYPE 定义
- 日志定义
- 连接超时时间
- 单连接请求数上限
server 块
server块和虚拟主机关系密切- 一个
http块中可以包含多个server块 - 每个
server块相当于一个虚拟主机
示例
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为on,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}五、Nginx 核心功能
5.1 反向代理
反向代理配置示例:
http{
...
...
#这部分是nginx作为反向代理服务器的配置
server{
#nginx监听的端口
listen 80;
#虚拟服务器的识别标记,一般配置为本机ip
server_name 192.168.45.151;
#代理设置地址
location / {
proxy_pass http://192.168.45.151:8080;
}
}
}5.2 负载均衡
常见负载均衡策略:
1. 轮询(默认)
2. weight
3. ip_hash
4. least_conn
5. fair(第三方)
6. url_hash(第三方)weight
weight 代表权重,默认是 1,权重越高,被分配的请求越多。
...
upstream cskaoyan{
server 192.168.45.151:8080 weight=2;
server 192.168.45.151:8081 weight=1;
}
...ip_hash
每个请求按照访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 共享问题。
upstream cskaoyan {
ip_hash;
server 192.168.45.151:8080;
server 192.168.45.151:8081;
}注意,为了避免浏览器自动发起获取网站图标的请求影响测试结果,可以给 server 增加如下 location 映射:
location /favicon.ico {
}