Nginx
Nginx?
是一个高性能的HTTP和反向代理web服务器,特点是占有内存少,并发能力强,专为优化性能而开发
反向代理
正向代理
通过代理服务器来上网的这种代理服务正向代理(在客户端浏览器配置代理服务器,通过代理服务器进行互联网访问)
反向代理
反向代理只需要客户端将请求发送给反向代理服务器,由反向代理服务器去选择目标服务器获取数据后返回给客户端,此时的反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的ip地址
负载均衡
初始版本:客户端发送多个请求到服务器,服务器处理请求,有一些可能要和数据库进行交互,服务器处理完毕后,再将结果返回客户端;
上述的情况是在并发请求相对较少的情况下,那出现较多并发我们可以考虑单个服务器解决不了我们可以增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中在单个服务器上的情况改为将请求分发到多个服务器上,负载分发这就是负载均衡
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同服务器来解析,加快解析的速度,降低原来单个服务器的压力
安装过程
# 1、安装pcre(关于为什么要安装pcre还有相关依赖,可以看https://www.jianshu.com/p/14c81fbcb401)
tar -zxvf pcre-8.37.tar.gz
cd pcre-8.37
./configure
make && make install
# 2、安装相关的依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
# 3、安装nginx
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure
make && make install
# 4、发现/usr/local目录下出现nginx文件夹
# 5、登录机器的80端口发现nginx服务,如果80没有出现nginx页面,注意关防火墙
查看开放的端口号
firewall-cmd --list-all
设置开放的端口号
firewall-cmd --add-service=http –permanent
sudo firewall-cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd –reload
常用命令
进入/usr/local/nginx/sbin目录下
# 查看版本
./nginx -v
# 启动nginx
./nginx
# 关闭nginx
./nginx -s stop
# 重新加载nginx:当改变nginx.conf内容时,不会直接加载生效,可以使用重加载生效
./nginx -s reload # 热部署
nginx.conf
该文件是nginx配置文件
分为三块:
1、全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令
#user nobody;
worker_processes 1; # worker_processes越大,可支持并发处理量越多
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
2、events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接
# work process 支持的最大连接数为 1024.
events {
worker_connections 1024;
}
3、
http块
http 块也可以包括 http 全局块、server 块
案例
反向代理实例1
# 最终实现效果:在windows浏览器上访问某个网址通过nginx代理返回虚拟机tomcat的8080首页
# 1、在windows的C:\Windows\System32\drivers\etc\hosts里面配置网址和虚拟机ip映射关系
192.168.18.141 www.xiaoyoupei.com
# 2、修改nginx.conf如下
server {
listen 80;
server_name 192.168.18.141;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
# 3、浏览器直接输入www.xiaoyoupei.com,直接显示tomcat页面(没有显示注意防火墙是否开放80、8080端口)
windows通过域名+nginx服务访问,nginx将该访问转换为虚拟机内部8080端口服务
反向代理实例2
# 1、虚拟机上准备两个tomcat8080、8081
# 2、在tomcat8080/webapps目录下新建vod目录,在vod目录下新建a.html
<h1>8080</h1>
# 在tomcat8081/webapps目录下新建edu目录,在vod目录下新建a.html
<h1>8081</h1>
# 3、windows访问两个页面发现都是有结果的http://192.168.18.141:8080/vod/a.html http://192.168.18.141:8081/edu/a.html
# 4、nginx.conf配置
server {
listen 9001;
server_name 192.168.18.141;
# ~ 表示正则表达式,proxy_pass表示转向
location ~ /edu/ {
proxy_pass http://127.0.0.1:8081;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8080;
}
}
# 5、windows浏览器查看结果
http://192.168.18.141:9001/edu/a.html
http://192.168.18.141:9001/vod/a.html
关于nginx.conf文件中location的配置有如下说明
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
负载均衡实例
# 最终实现效果:浏览器输入http://192.168.18.141/edu/a.html,nginx会自动选择tomcat8080、8081其中一台进行展示
# 1、tomcat8080、8081的webapps下都需要有edu文件夹,并且都有html文件方便展示
# 2、nginx.conf配置
upstream myserver{
server 192.168.18.141:8080;
server 192.168.18.141:8081;
}
server {
listen 80;
server_name 192.168.18.141;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
}
# 3、重加载nginx,浏览器访问http://192.168.18.141/edu/a.html
其实上述的做法是默认的行为轮询
,还有另外一些常用的负载均衡手法
1、
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。2、
weight
代表权重,默认为 1,权重越高被分配的客户端越多 指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:upstream server_pool{ server 192.168.5.21 weight=10; server 192.168.5.22 weight=10; }
3、
ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。 例如:upstream server_pool{ ip_hash; server 192.168.5.21:80; server 192.168.5.22:80; }
4、
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。upstream server_pool{ server 192.168.5.21:80; server 192.168.5.22:80; fair; }
动静分离实例
# 1、新建两个目录,一个放一个html,另一个放图片
mkdir test_data
cd test_data
mkdir www
mkdir image
# 2、nginx.conf配置
server {
listen 80;
server_name 192.168.18.141;
#charset koi8-r;
#access_log logs/host.access.log main;
location /www/ {
root /usr/local/nginx/test_data/;
index index.html index.htm;
}
location /image/ {
root /usr/local/nginx/test_data/;
autoindex on;
}
}
# 3、浏览器测试
http://192.168.18.141/www/a.html
http://192.168.18.141/image/psc.png
在location中配置了autoindex on,会列出文件内容
原理说明
# 查看进程发现有两个进程master、worker
[root@node1 sbin]# ps -ef | grep nginx
root 8676 1 0 09:19 ? 00:00:00 nginx: master process ./nginx
nobody 11908 8676 0 13:53 ? 00:00:00 nginx: worker process
root 12111 1793 0 15:26 pts/0 00:00:00 grep nginx
请求过来先到nginx的master,master将任务给worker,但会有多个worker,注意这里不是均分也不是轮询,而是worker主动性的争抢,当修改nginx.conf后重加载nginx服务后(热部署
),有任务的worker还会执行他本来的任务,没有任务的worker会去争抢来的任务
master-worker
1、每个worker进程独立,有一个出现问题退出后,其他还在进行争抢,不会造成服务中断
2、nginx类似redis使用了io多路复用
(可以借鉴https://blog.csdn.net/XueyinGuo/article/details/113096163)的机制,worker设置的数目最好和cpu核数匹配
3、连接数 worker_connection表示每个 worker 进程所能建立连接的最大值
4、普通的静态访问最大并发数是: worker_connections * worker_processes /2,而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4(这要怎么理解?,静态的每个客户端和nginx建立服务是双向的需要2个;反向代理比如之前的举例到tomcat,需要建立双向,再加上客户端建立,那就是4个)