1、Nginx基础回顾
1.1 Nginx是什么
Nginx是一个高性能的HTTP和反向代理web服务器,核心特点是占有内存少,并发能力强
1.2 Nginx的应用场景
1.2.1 Http服务器(Web服务器)
- 性能非常好,非常注重效率,能够经受高负载的考验
- 支持50000个并发连接数,不仅如此,CPU和内存的占用也非常的低,10000个没有活动的连接才占用2.5M的内存
1.2.2 反向代理服务器
正向代理
在浏览器中配置代理服务器的相关信息,通过代理服务器访问目标网站,代理服务器收到目标网站的响应之后,会把响应信息返回给我们的浏览器客户端
反向代理
浏览器客户端发送请求到反向代理服务器(如Nginx),由反向代理服务器选择原始服务器提供服务获取结果响应,最终再返回给客户端浏览器
- 浏览器不需要做任何配置
- 对于客户端浏览器来说,提供服务的原始服务器是不可见的
- nginx+tomcat,算是一个整体(服务端)
1.2.3 负载均衡服务器
- 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性
- 负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器
- 负载均衡就是为了解决⾼负载的问题
1.2.4 动静分离
动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性
1.3 Nginx的特点
- 跨平台:Nginx可以在大多数类unix操作系统上编译运行,而且也有windows版本
- Nginx使用容易,配置也比较简单
- 高并发,性能好
- 稳定性好,宕机概率很低
1.4 Nginx的安装
- 上传nginx安装包到linux服务器,nginx安装包(.tar文件)下载地址:http://nginx.org,版本:1.17.8版本
- 安装Nginx依赖,pcre、openssl、gcc、zlib(推荐使用yum源自动安装),命令:
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
- 解包Nginx软件包,命令:
tar -xvf nginx-1.17.8.tar
- 进入解压之后的目录nginx-1.17.8,命令:
cd nginx-1.17.8
- 执行命令:
./configure
- 执行命令:
make
- 执行命令:
make install
,完毕之后在/usr/local/下会产生一个nginx目录 - 进入/usr/local/nginx/sbin目录中,执行启动nginx命令:
./nginx
注意:阿里云安全组的内外入规则中加上80端口
1.5 Nginx的主要命令
- 启动nginx:
./nginx
- 终止nginx:
./nginx -s stop
或者kill -9
杀掉nginx进程 - 重新加载nginx.conf配置文件:
./nginx -s reload
2、Nginx核心配置文件解读
Nginx的核心配置文件conf/nginx.conf
包含三块内容:全局块、events块、http块
2.1 全局块
从配置文件开始到events块之间的内容,此处的配置影响nginx服务器整体的运行,比如worker进程的数量、错误日志的位置等
# ==============================全局代码块 start====================
# 运行用户
#user nobody;
# worker进程数量,通知设置为何cpu数量相等
worker_processes 1;
# 全局错误日志及pid文件位置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
# ===============================全局代码块 end======================
2.2 events块
events块主要影响nginx服务器与用户的网络连接,比如worker_connections 1024,标识每个workderprocess支持的最大连接数为1024
#===============================events块 start======================
events {
# 单个worker进行的最大并发数
worker_connections 1024;
}
#================================events块 end=======================
2.3 http块
#===============================http块 start======================
http {
# 引入mime类型定义文件
include mime.types;
default_type application/octet-stream;
# 设定日志格式
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
# 连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
# 开启gzip压缩
#gzip on;
server {
listen 80; # 监听的端口
server_name localhost; # 定义使用localhost访问
#charset koi8-r;
#access_log logs/host.access.log main;
# 默认请求
location / {
root html; # 默认的网站根目录位置
index index.html index.htm; # 索引页,欢迎页
}
# error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
# error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
#================================http块 end=======================
3、Nginx应用场景之反向代理
- 部署tomcat,保持默认监听8080端口
- 修改nginx配置
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://127.0.0.1:8080;
# root html;
# index index.html index.htm;
}
}
- 重新加载nginx配置,执行命令:
./nginx -s reload
4、Nginx应用场景之负载均衡
- 轮询
默认策略,每个请求按时间顺序逐一分配到不同的服务器,如果某一个服务器下线,能自动剔除
upstream myServer{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://myServer;
}
}
- 权重weight
weight代表权重,默认每一个负载的服务器都为1,权重越多那么被分配的请求越多(用于服务器性能不均衡的场景)
upstream myServer{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://myServer;
}
}
- ip_hash
每个请求按照ip的hash结果分配,每一个客户端的请求会固定分配到同一个目标服务器处理,可以解决session问题
upstream myServer{
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://myServer;
}
}
5、Nginx应用场景之动静分离
- 动静分离就是讲动态资源和静态资源的请求处理分配到不同的服务器上
- 比较经典的组合就是Nginx+Tomcat架构(Nginx处理静态资源请求,Tomcat处理动态资源请求)
# 静态资源处理,直接去nginx服务器目录中加载
location /static/ {
root staticData;
}
6、Nginx底层进程机制剖析
6.1 master进程和worker进程
Nginx启动后,以daemon多进程方式在后台运行,包括多个Master进程和多个Worker进程,Master进程是领导,Worker进程是干活的小弟
master进程
- 主要是管理worker进程
- 接收外界信号向各worker进程发送信号(./nginx -s reload)
- 监控worker进程的运行状态,当worker进程异常退出后master进程会自动重新启动新的worker进程
worker进程
- worker进程具体处理网络请求
- 多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的
- 一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求
- worker进程的个数是可以设置的,一般设置与机器cpu核数一致
6.2 Nginx进程模型
以./nginx -s reload 来说明nginx信号处理
- master进程对配置文件进行语法检查
- 尝试配置(比如修改了监听端口,那就尝试分配新的监听端口)
- 尝试成功则使用新的配置,新建worker进程
- 新建成功,给旧的worker进程发送关闭消息
- 旧的worker进程收到信号会继续服务,直到把当前进程接收到的请求处理完毕后关闭
所以reload之后worker进程pid是发生了变化的
以./nginx -s reload 来说明nginx信号处理
- 一个请求到来时,如果有多个worker进程,那么每个worker进程都有可能处理这个链接
- master进程创建之后,会建立好需要监听的的socket,然后从master进程再fork出多个worker进程
- 所以,所有worker进程的监听描述符listenfd在新连接到来时都变得可读
- nginx使用互斥锁来保证只有一个workder进程能够处理请求,拿到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接,然后解析、处理、返回客户端
6.3 Nginx进程模型的好处
- 每个worker进程都是独立的,不需要加锁,节省开销
- 每个worker进程都是独立的,互不影响,一个异常结束,其他的照样能提供服务
- 多进程模型为reload热部署机制提供了支撑