WD
Classnote Docs课程课件
17

Nginx 详解

01 / Section

一、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 最核心的两个功能:

  1. 高性能的静态 Web 服务器
  2. 反向代理

正向代理 vs 反向代理

正向代理与反向代理示意图
正向代理与反向代理示意图
正向代理与反向代理补充示意图
正向代理与反向代理补充示意图
text
上面的示意中,上边是正向代理,下边是反向代理。
正向代理:代理服务器代表客户端去访问后端服务器,代理的对象是前面的用户。
反向代理:代理服务器代表后端服务器对外提供服务,对于前面的用户来说是无感知的,代理的对象是后面的服务器。

1.3 Nginx 的优势

  1. 高并发、高性能
  2. 扩展性好(模块化设计)
  3. 异步非阻塞的事件驱动模型
  4. 高可靠性(支持热部署,可长时间稳定运行)
02 / Section

二、Nginx 安装

2.1 Ubuntu 安装

Ubuntu 安装 Nginx 比较方便,可以直接使用 apt 源安装:

bash
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get install nginx

执行以上命令后,即可完成安装。

执行下面命令查看是否安装成功:

bash
nginx -v

2.2 安装后的目录结构

diagram
/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.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

shell
# 程序的路径
/usr/sbin/nginx

# 配置文件的路径
/etc/nginx/nginx.conf

# 日志文件的路径
/var/log/nginx
03 / Section

三、Nginx 常用命令

下面以 Ubuntu 18.04 为例:

bash
# 启动命令
sudo nginx

# 关闭命令
sudo nginx -s stop

# 重载命令
sudo nginx -s reload
04 / Section

四、Nginx 配置文件

  • 核心配置文件就是 nginx.conf
  • 配置文件中有很多以 # 开头的注释内容,去掉这些注释后,主体结构会更清晰

4.1 配置文件结构

diagram
nginx.conf 全局块(Global) events 块 http 块 http 全局块 server 块(虚拟主机) server 全局块 location 块(URL 路由)
nginx.conf
├── 全局块(Global)
├── events 块
└── http 块
    ├── http 全局块
    └── server 块(虚拟主机)
        ├── server 全局块
        └── location 块(URL 路由)

下面结合截图来看这几个部分在实际配置文件中的位置:

nginx.conf 示例截图
nginx.conf 示例截图

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

nginx 配置文件结构图
nginx 配置文件结构图

4.2 全局配置

从配置文件开始到 events 块之间的内容,主要设置一些影响 Nginx 服务器整体运行的配置指令,例如:

  • 运行 Nginx 服务的用户(组)
  • 允许生成的 worker process 数量
  • PID 文件存放路径
  • 日志路径
  • 其他配置文件的引入

例如:

nginx
user www-data;                    # 运行 worker 子进程的用户
worker_processes auto;           # 子进程数量
pid /run/nginx.pid;              # 运行 master 的 pid 文件存放路径
include /etc/nginx/modules-enabled/*.conf;  # 引入其他配置文件

其中,worker_processes 是 Nginx 并发处理能力的重要配置项,值越大,可支持的并发处理量通常也越大,但会受到硬件条件限制。

worker_processes 设置建议

  • 开发环境:1auto
  • 生产环境:等于 CPU 核心数或 auto
  • 高并发场景:CPU核心数 × 2

4.3 events 配置

例如:

nginx
events {
    worker_connections 768;
}

events 块主要影响 Nginx 服务器与用户的网络连接处理,例如每个 worker process 可同时支持的最大连接数等。上面的例子表示每个 worker process 支持的最大连接数是 768

最大并发连接数计算

text
最大并发连接数 = worker_processes × worker_connections

4.4 http 配置

http 块是 Nginx 配置中最常见的部分,代理、缓存以及日志等大量功能都在这里配置。http 块中还可以继续包含:

  • http 全局块
  • server

http 全局块

http 全局块中常见配置包括:

  • 文件引入
  • MIME-TYPE 定义
  • 日志定义
  • 连接超时时间
  • 单连接请求数上限

server 块

  • server 块和虚拟主机关系密切
  • 一个 http 块中可以包含多个 server
  • 每个 server 块相当于一个虚拟主机

示例

nginx
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           
        } 
    }
}
05 / Section

五、Nginx 核心功能

5.1 反向代理

反向代理配置示例:

nginx
http{
	...
	...
  #这部分是nginx作为反向代理服务器的配置
  server{
  		#nginx监听的端口
      listen  80;
      #虚拟服务器的识别标记,一般配置为本机ip
      server_name 192.168.45.151;
			#代理设置地址
      location / {
          proxy_pass http://192.168.45.151:8080;
      }
  }
}

5.2 负载均衡

常见负载均衡策略:

text
1. 轮询(默认)
2. weight
3. ip_hash
4. least_conn
5. fair(第三方)
6. url_hash(第三方)

weight

weight 代表权重,默认是 1,权重越高,被分配的请求越多。

nginx
...
	upstream cskaoyan{
		server 192.168.45.151:8080 weight=2;
		server 192.168.45.151:8081 weight=1;
	}
...

ip_hash

每个请求按照访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 共享问题。

nginx
upstream cskaoyan {
    ip_hash;
    server 192.168.45.151:8080;
    server 192.168.45.151:8081;
}

注意,为了避免浏览器自动发起获取网站图标的请求影响测试结果,可以给 server 增加如下 location 映射:

nginx
location /favicon.ico {
}