Nginx配置-反向代理、负载均衡、动静分离、高可用配置
近期学习Nginx的学习笔记和配置
所有知识点来自bilibili的尚硅谷的Nginx课程。
一、基础命令
1.1 nginx常用命令[前提:nginx根目录下/sbin]
- 查看版本
[root@host-16f8f3e6391 sbin]# ./nginx -v
- 启动nginx
[root@host-16f8f3e6391 sbin]# ./nginx
- 关闭nginx
[root@host-16f8f3e6391 sbin]# ./nginx -s stop
- 重新加载nginx[不重启nginx,更新配置后,相当于热加载新配置]
[root@host-16f8f3e6391 sbin]# ./nginx -s reload
以上配置完成后,ngnix已完成基本配置,以下是nginx配置(包括反向代理、负载均衡、动静分离、高可用)
二、配置
2.1 /usr/nginx/conf/nginx.conf配置文件
第一部分 全局块【文件中events之前的部分,主要设置影响nginx整体运行的配置指令】
worker_processes 1; #worker_processes值越大,可以支持的并发处理量越多
第二部分 events块【涉及的指令主要影响Nginx服务器与用户的网络连接】
worker_connections 1024; #worker_connections,可以支持的最大连接数,在项目中需要灵活变化的部分
第三部分 http块【Nginx服务器中配置最频繁部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置在这里】
- http的全局块【文件引入、MIME—TYPE定义、日志自定义、连接超时时间、单链接请求数上限等】
- http的server块
2.2 反向代理-配置实例
Nginx配置实例-反向代理
- 需求1:浏览器中输入:www.123.com,跳转到服务器上部署并已经启动了的tomcat欢迎页
# windows访问Internet资源,先在本地host(一般在C:/Windows/System32/drivers/etc/)文件中找访问的域名对应的ip,找不到就去查网络中DNS服务器上的域名对应的ip
# 在nginx配置文件中:
# 修改http块中的server块中的server_name ip(Nginx所在ip)
server{
listen 80;
server_name 192.168.0.1
...
location / {
root html;
#加上下面这行,访问192.168.0.1时,就会自动转发到tomcat的http://127.0.0.1:8080
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
...
}
#开放用到的端口
- 需求2:Nginx监听9001端口,根据相同顶级域名下访问不同的路径转发到不同的tomcat中去
#例如访问http://192.168.0.1:9001/edu转发到127.0.0.1:8080
#例如访问http://192.168.0.1:9001/pro转发到127.0.0.1:8001
server{
listen 9001;
server_name 192.168.0.1
...
location ~ /edu/ {
#加上下面这行,访问192.168.0.1:9001/edu/时,就会自动转发到tomcat的http://127.0.0.1:8080
proxy_pass http://127.0.0.1:8080;
}
location ~ /pro/ {
#加上下面这行,访问192.168.0.1:9001/pro/时,就会自动转发到tomcat的http://127.0.0.1:8081
proxy_pass http://127.0.0.1:8081;
}
...
}
#开放用到的端口
- 【说明】:location中的~ ~* ~~ = 四种参数说明:
- ~用于表示url中包含区分大小写正则表达式。
- ~*用于表示url中包含不区分大小写正则表达式。
- ~~用于不含正则表达式的url前,要求Nginx服务器找到标识url和请求字符串匹配度最高的location后,立即使用location处理请求,而不再使用location块中的正则url和请求字符串做匹配。
- =用于不含正则表达式的url前,要求请求字符串与url严格匹配。
2.3负载均衡-配置实例
- 需求1:客户端请求http://192.168.0.1/edu/a.html,所有请求均匀分到127.0.0.1:8080和127.0.0.1:8081
#例如访问http://192.168.0.1/edu/a.html均匀转发到127.0.0.1:8080和127.0.0.1:8001
在http块中,和server平级加入upstream块,表示【负载均衡】,其中myserver时服务名称,相当于用myserver来代替了两个真实域名
http{
...
upstream myserver{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server{
listen 80;
server_name 192.168.0.1
...
location / {
#加上下面这行,访问192.168.0.1:9001/edu/a.html时,就会自动转发到tomcat的http://127.0.0.1:8080和127.0.0.1:8001
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
}
...
}
#开放用到的端口
- 【注意】:负载均衡的几种分配服务的策略
- 轮询【默认】:每个请求按时间顺序逐一分配到不同的后端服务器中,如果后端服务器宕机,能自动剔除。【简单来讲:平均分配】
- weight:权重,默认为1,权重越高,被分配客户端越多。【直接指定权重高的被访问几率更大】upstream myserver{server 127.0.0.1:8080 weight=1;server 127.0.0.1:8081 weight=9;}
- ip_hash:每个请求访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题。【相当于固定了,变相不用考虑分布式条件下session一致性问题】upstream myserver{ip_hash; server 127.0.0.1:8080; server 127.0.0.1:8081;}
- fair(第三方):按后端服务器响应时间来分配请求,响应时间短的优先分配。【类似于实例中,8080和8081哪个先访问到,就请求哪一个】upstream myserver{server 127.0.0.1:8080; server 127.0.0.1:8081;fair;}
2.4 动静分离
- 需求:根据访问后缀名的不同,将动态请求和静态请求分发到不同的服务器中
#location 后面/www/和/image/分别代表动态请求资源和静态请求资源,达到动静分离的效果
http{
...
server{
listen 80;
server_name 192.168.0.1
...
location /www/ {
#请求示例:192.168.0.1/www/a.html
proxy_pass http://myserver;
root /data/;
index index.html index.htm;
}
location /image/ {
#autoindex on;的作用,访问的时候列出文件的目录结构
#请求示例:192.168.0.1/image/a.jpg
proxy_pass http://myserver;
root /data/;
autoindex on;
}
}
...
}
#开放用到的端口
三、Nginx的高可用配置(需要keepalived,正在学习,暂不参考)
- 3.1 问题:当Nginx宕机后,整个服务将不可用,这个时候解决办法是:一台Nginx当主服务器,配置一台Nginx从服务器,使用keepalived来达成。
#keepalived 会给nginx一个供外部访问的虚拟ip
- 3.2 两台Nginx服务器(ip:192.168.0.1 192.168.0.2),在两台服务器上安装keepalived。
#需要连接网络,安装后默认在/etc/keepalived/里
yum install keepalived -y
#修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
#可以网上拷贝
#编写检测Nginx是否还活着的脚本文件
vim check.sh
#! /bin/bash
A=`ps -C nginx -no-header |wc -l`
if [ $A -eq 0 ];then
/usr/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
#保存退出
- 3.3启动nginx和keepalived
./nginx
systemctl start keepalived.service