Nginx 基础回顾
- Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,核心特点是占有内存少,并发能力强
- Nginx 应用场景
- Http 服务器(Web服务器)
- 反向代理服务器
- 正向代理
- 在浏览器中配置代理服务器的相关信息,通过代理服务器访问目标网站,代理服务器收到目标网站的响应之后,会把响应信息返回给我们自己的浏览器客户端
- 反向代理
- 浏览器客户端发送请求到反向代理服务器(比如 Nginx ),由反向代理服务器选择原始服务器提供服务获取结果响应,最终再返回给客户端浏览器
- 正向代理
- 负载均衡服务器
- 动静分离
- Nginx 的特点
- 跨平台
- Nginx 的上手非常容易,配置也比较简单
- 高并发,性能好
- 稳定性也特别好,宕机概率很低
- Nginx 主要命令
./nginx
启动 nginx./nginx -s stop
终止 nginx (当然也可以找到 nginx 进程号,然后使用 kill -9 杀掉 nginx 进程)./nginx -s reload
(重新加载nginx.conf
配置文件)
安装 Nginx
-
下载 Nginx
下载页面 ,选择 Stable version
-
安装 Nginx 依赖, pcre 、 openssl 、 gcc 、 zlib (推荐使用 yum 源自动安装)
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
-
将 Nginx 压缩包解压
tar -zxvf nginx-1.18.0.tar.gz
-
编译安装 Nginx
cd nginx-1.18.0 ./configure make make install
-
完毕之后在
/usr/local/
下会产生一个 nginx 目录,包含目录- conf
- html
- logs
- sbin
Nginx 核心配置文件解读
- Nginx 的核心配置文件
conf/nginx.conf
包含三块内容: - 全局块
- 从配置文件开始到 events 块之间的内容,此处的配置影响 nginx 服务器整体的运行,比如 worker 进程的数量、错误日志的位置等
- events 块
- events 块主要影响 nginx 服务器与用户的网络连接,比如 worker_connections 1024 ,标识每个 workderprocess 支持的最大连接数为 1024
- http 块
- http 块是配置最频繁的部分,虚拟主机的配置,监听端口的配置,请求转发、反向代理、负载均衡等
Nginx 应用场景之反向代理
-
启动 Linux 内的 tomcat
-
修改 Nginx 配置
location / { proxy_pass http://localhost:8080; # root html; # index index.html index.htm; }
-
重新加载 Nginx 配置
./nginx -s reload
-
访问 http://192.168.181.130/ ,出现 Tomcat 页面
location 语法如下:
location [=|~|~*|^~] /uri/ { … }
在 nginx 配置文件中, location 主要有这几种形式:
-
精确匹配
location = /lagou { }
-
匹配路径的前缀
location ^~ /lagou { }
-
不区分大小写的正则匹配
location ~* /lagou { }
-
正则匹配
location ~ /lagou { }
-
普通路径前缀匹配
location /lagou { }
Nginx 应用场景之负载均衡
负载均衡:
upstream lagouServer {
server localhost:8080;
server localhost:8090;
}
设置权重:
upstream lagouServer {
server localhost:8080 weight=1;
server localhost:8090 weight=3;
}
ip_hash:
upstream lagouServer {
ip_hash;
server localhost:8080;
server localhost:8090;
}
Nginx 应用场景之动静分离
- 动静分离就是讲动态资源和静态资源的请求处理分配到不同的服务器上,比较经典的组合就是 Nginx+Tomcat 架构( Nginx 处理静态资源请求, Tomcat 处理动态资源请求)
location /static {
root staticData;
}
http://192.168.181.130/static/1.html
对应/usr/local/nginx/staticData/static/1.html
Nginx 底层进程机制剖析
- Nginx 启动后,以 daemon 多进程方式在后台运行,包括一个 Master 进程和多个 Worker 进程
- master 进程
- 主要是管理 worker 进程,比如:接收外界信号向各 worker 进程发送信号(singal)
./nginx -s reload
- 监控 worker 进程的运行状态,当 worker 进程异常退出后 Master 进程会自动重新启动新的 worker 进程等
- 主要是管理 worker 进程,比如:接收外界信号向各 worker 进程发送信号(singal)
- worker 进程
- worker 进程具体处理网络请求。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求, 各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。 worker 进程的个数是可以设置的,一般设置与机器 cpu 核数一致。
以 ./nginx -s reload
来说明 nginx 信号处理这部分
- master 进程对配置文件进行语法检查
- 尝试配置(比如修改了监听端口,那就尝试分配新的监听端口)
- 尝试成功则使用新的配置,新建 worker 进程
- 新建成功,给旧的 worker 进程发送关闭消息
- 旧的 worker 进程收到信号会继续服务,直到把当前进程接收到的请求处理完毕后关闭
所以 reload 之后 worker 进程 pid 是发生了变化的
worker 进程处理请求部分的说明:
- 例如,我们监听 9003 端口,一个请求到来时,如果有多个 worker 进程,那么每个 worker 进程都有可能处理这个链接。
- master 进程创建之后,会建立好需要监听的的 socket ,然后从 master 进程再 fork 出多个 worker 进程。所以,所有 worker 进程的监听描述符 listenfd 在新连接到来时都变得可读。
- nginx 使用互斥锁来保证只有一个 workder 进程能够处理请求,拿到互斥锁的那个进程注册 listenfd 读事件,在读事件里调用 accept 接受该连接,然后解析、处理、返回客户端
Nginx 多进程模型好处:
- 每个 worker 进程都是独立的,不需要加锁,节省开销
- 每个 worker 进程都是独立的,互不影响,一个异常终止,其他的照样能提供服务
- 多进程模型为 reload 热部署机制提供了支撑