Nginx 学习笔记
概述
Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占用内存少,并发能力强
1. 正向代理
如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,需要通过代理服务器来访问,这种访问就称为正向代理
2. 反向代理
客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址
3. 负载均衡
增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器
4. 动静分离
简单来说就是把动态请求跟静态请求分开,不能单纯地理解为动态页面和静态页面分类。一般使用 Nginx 处理静态页面,Tomcat 处理动态页面
动静分离有两种实现:
- 把静态文件独立成单独的域名,放在独立的服务器
- 静态文件和动态文件混在一起发布,通过 nginx 分开
Nginx 操作命令
# 必须先进入 nginx 目录
cd /usr/local/nginx/sbin
# 查看 nginx 版本号
./nginx -v
# 启动 nginx
./nginx -s start
# 关闭 nginx
./nginx -s stop
# 重新加载 nginx(修改了配置文件)
./nginx -s reload
Nginx 配置文件
Linux 下 Nginx 配置文件路径一般如下:
/usr/local/nginx/conf/nginx.conf
组成部分:
# 全局块
...
# events 块
events {
...
}
# http 块
http {
# http 全局块
...
# server 块
server {
# 全局 server 块
...
# location 块
location /uri-string {
...
}
}
...
}
- 全局块:从配置文件到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等
- events 块:主要影响 Nginx 服务器与用户之间的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等
- http 块:配置最频繁的部分,代理、缓存和日志定义等绝大多数和第三方模块配置都在这里,http 块也包括 http 全局块和 server 块
- http 全局块:配置指令包括文件引入、MINE-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
- server 块:和虚拟主机密切相关,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块
- 全局 server 块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置
- location 块:一个 server 块可以配置多个 location 块,这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如前面的 /uri-string)进行匹配,对特定的请求进行处理、地址定向、数据缓存和应答控制等功能,还有许多第三方模块也在这里配置
Nginx 配置实例
1. 反向代理
启动 Tomcat 并开发对外端口,配置 nginx.conf
server {
...
server_name [IP地址]
...
location / {
...
proxy_pass http://127.0.0.1:8080
...
}
}
启动两个 Tomcat 并分发不同的对外端口,根据访问路径跳转到不同端口的服务
server {
listen 9001 # 监听端口
server_name [IP地址]
location ~/edu/ { # 正则表达式写法,匹配符合条件的路径
...
proxy_pass http://127.0.0.1:8080
...
}
location ~/vod/ { # 正则表达式写法,匹配符合条件的路径
...
proxy_pass http://127.0.0.1:8081
...
}
}
2. 负载均衡
启动两个 Tomcat 并分发不同的对外端口,配置 nginx.conf
http {
...
upstream myserver {
# ip_hash
# fair
server 192.168.17.219:8080 # 第一个ip:port
# server 192.168.17.219:8080 weight=1 # 分配权重
server 192.168.17.219:8081 # 第二个ip:port
}
...
server {
listen 80 # 监听端口
server_name 192.168.17.219 # IP地址
location / {
...
proxy_pass http://myserver
...
}
}
}
分配方式:
- 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,能自动剔除宕机的服务器
- weight:代表权重,默认为 1,权重越高被分配的客户端越多
- ip_hash:每个请求按照 ip 的 hash 结果分配,这样每个 ip 固定访问一个后端服务器,可以解决 session 问题
- fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配
3. 分配方式
配置 nginx.conf
server {
listen 80 # 监听端口
server_name 192.168.17.219 # IP地址
location /www/ { # 正则表达式
...
root /data/; # 静态资源路径
index index.htm index.html
...
}
location /image/ {
root /data/;
autoindex on # 返回文件目录内容
}
}
Nginx 原理解析
1. master-workers
每个 worker 都是独立的进程,不需要加锁,不会影响其他 worker。每个 worker 都可以把 cpu 的性能发挥到极致,因此 worker 数量最好与 cpu 数相同
可以热部署,正在工作的 worker 完成工作后再加载,其他 worker 立即重新加载
2. 连接数 worker-connection
一个请求占用 worker 两个(一去一回)或四个连接数(需要访问 Tomcat)。每个 worker 支持最大的连接数是 1024,支持的最大并发数是 4*1024/2 或者 4*1024/4