Nginx 是一个高性能的http 和反向代理服务器,用于把客户端请求分发给后台的web 容器。下载安装的话,可以到官网去下载 安装。
一、配置文件
#工作进程,一般设置为CPU的核数
woker_processes 2
#在高并发情况下,通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗。
worker_cpu_affinity 0001 0010 0100 1000; #(四核)。
#写在main部分。默认是没有设置,可以限制为操作系统最大的限制65535 > 2^16 -1
worker_rlimit_nofile 10240
events {
#nginx默认使用epoll事件模型,nginx在Linux操作系统下效率相当高
use epoll;# epoll [事件模型] > kqueue [类似于epoll的高效事件模型] > select [不支持高效事件模型]
#每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)
worker_connections 2048;
#最大连接数 = worker_processes * worker_connections/4,所以这里客户端最大连接数是1024,这个可以增到到8192都没关系
}
upstream tomcatserver {
server 192.168.72.49:8081;
server 192.168.72.49:8082;
server 192.168.72.49:8080 weight=2;# 分担2/5的请求
server 192.168.72.49:6060;
server 192.168.72.49:9090 down;# 暂时不参与负载
server 192.168.72.49:7070 backup;# 其他主机都宕机时,此服务器启用
}
server {
#监听端口,此处监听为访问Nginx的端口,与tomcat端口无关
listen 80;
#监听地址,此处应该在hosts文件中做映射(或者是既定域名),否则无法解析
server_name 8081.max.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# 请求转向tomcatserver 定义的服务器列表
proxy_pass http://tomcatserver;
index index.html index.htm;
}
# 动静分离 , 可作静态资源服务器
location /Downloads {
root /Users/xuqinxiang/;
#index index.html index.htm;
#以下配置为 允许定义的两个IP访问,其他的都不允许【无特殊要求 不配置】
allow 192.168.10.100;
allow 172.29.73.0/24;
deny all;
}
# 浏览器访问: http://localhost:8080/Downloads/111.jpg 即可访问/Users/###/Downloads/下的 111.jpg 【Mac中测试通过】
}
二、流程
- 浏览器访问8081.max.com,通过本地的 host文件 或者 域名解析,找到 192.168.72.49服务器(这个就是安装并配置Nginx的那台服务器)
- nginx反向代理接受客户机请求,找到server_name为8081.max.com的server节点,根据proxy_pass对应的http路径,将请求转发到 upstream tomcatserver 上,即端口号为8081的tomcat服务器。
- 总体就是 请求8081.max.com , tomcat1 接收返回首页(tomcat首页)
三、负载均衡策略
upstream tomcatserver{
ip_hash; # 负载策略为 ip_hash
server 127.0.0.1:9090 down; (down 表示当前的server暂时不参与负载)
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
}
- 轮询 :默认
- ip_hash :同一IP每次请求路由到同一台服务器
- weight :权重,按比例分配请求,数字越大,所占请求比例越大
- fair : 第三方负载算法,响应时间短的优先分配
- url_hash :第三方负载算法,相同请求路由到同一台服务器
四、信号量控制
一般我们在使用Nginx时,常用的命令为:
-
启动:start nginx 或 nginx
-
停止: nginx -s stop 或 nginx -s quit
-
重启:nginx -s reload
我们也可以使用nginx提供的信号量进行控制,使用信号量控制,首先要知道(获取)nginx的进程号[ 包括主进程和工作进程,信号量控制基于主进程 ]。
- 获取进程号的命令如下:
ps aux|grep nginx
假设获取的进程号为26633,(logs/nginx.pid 文件中为进程号,后面会说明如何基于此文件进行信号量的控制)
- 立即退出nginx(两种方式)
kill -INT 26633
kill -TERM 26633
- 优雅的退出(进程空闲时退出)
kill -QUIT 26633
- 软重启,并加载最新的配置文件
kill -HUB 26633
- 先重命名原来的日志,并新建日志名(未改之前的名字),使用此命令可以将日志写入新建的日志文件中
kill -USER1 26633
- USER2 与 WINCH 用于平滑升级的时候使用(这里不做解释)
- 如果不想每次都要先查看进程号,可以使用如下命令,以退出为例
kill -QUIT 'cat logs/nginx.pid'
五、日志按日期分割
有时候我们的日志记录的数据比较多,一天的日志可能就非常大,如果不进行日志分割的话,排查问题会很困难。我们可以使用以下方式,自动进行日志的切割。
- 编写shell脚本 -runlog.sh
#日志路径
LOGPATH=/usr/local/nginx/logs/logName.log
#备份日志路径
BASEPATH=/usr/local/nginx/data
bak=BASEPATH/$(date -d yesterday +%Y%m%d).logName.log #20190730
#echo $bak
mv $LOGPATH $bak
touch $LOGPATH
kill -USER1 cat /usr/local/nginx/logs/nginx.pid
- 定时器设定
crontab -e
*/1 * * * * sh /usr/local/nginx/runlog.sh #cron定时+ 脚本文件
- 执行shell脚本,即可每分钟执行一次。根据日志情况,我们可以设置每天、每周、每月 进行分割
六、location 定位
语法规则:location = [ =|~|~*|^~ ] /uri/{...}
- =开头表示精准匹配
- ^~开头表示uri以某个常规字符串开头,理解为匹配的URL路径即可。nginx不对URL做编码,因此请求为/static/20%/aa,可以被规则 ^~/static/ /aa匹配到(注意,/ /中间是空格)
- ~开头表示区分大小写的正则匹配
- ~*开头表示不区分大小写的正则匹配
- !~ 和 !~* 分别为 区分大小写不匹配 及 不区分大小写不匹配 的正则
- / 通用匹配,任何请求都会被匹配到