Nginx是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,BSD-like协议下发行.其特点是占用内存少,并发能力强,事实上nginx的并发能力在同类的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
客户端通过配置代理服务器,通过代理服务器进行访问互联网。
客户端请求发给暴露IP的反向代理服务器,由反向代理服务器选择目标服务器数据后,在返回给客户端。隐藏了真实的服务器IP
大量客户端请求访问服务器,由Nginx进行流量分发,nginx会根据后台服务器的负载情况进行分发流量。
Nginx安装
Ubuntu系列使用apt命令安装
deepin的软件源不是最新版本的、如果要安装更新版本的查看:deepin安装最新版本的nginx
sudo apt update #更新源 sudo apt install nginx #安装nginx
systemctl status nginx#查看nginx状态
Centos系列用yum安装
添加源
sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装
yum install nginx #安装nginx
查看进程 ps -ef | grep nginx
启动:nginx -c/usr/local/nginx/conf/nginx.conf
关闭:nginx -s stop或者 killpid或者lsof -i:pid
重载:nginx -s reload不会重启,而是重载直接生效
我使用的是Linux操作系统所以直接将nginx服务器安装在了本机上了
然后在两台虚拟机上分别安装tomcat,并且在防火墙添加了8080端口
配置反向代理(一)、配置文件末尾要有;结束!!!
直接转发 的
找到配置文件,如果是源码安装的路径可能不同
vim /etc/nginx/nginx.conf
添加反向代理配置,在http块中添加
server{ listen 80; #监听80端口 server_name localhost;#本机的ip或者域名 location / { #root指定主机目录作为服务器根目录 #例如 root /opt/tomcat 在真实机上 proxy_pass http://localhost:8080; #这是转发到localhost的8080端口 index index.html index.htm; } }
如图:
反向代理(二)、
通过不同路径转发到不同服务器上
增加如下代码
修改了配置记得重启服务service nginx restart
或者 重载nginx -s reload
修改对应的服务器,并且启动tomcat服务器
在两台tomcat服务器的webapp/Root目录下
分别 新建8080文件夹 和 8081 文件夹。
为了表示区分分别在对应文件夹下添加index.html 文件,为了区别自己添加内容。
比如
8080文件夹
this is 8080 server,ip192.168.1.100
8081文件夹
this is 8081 server,ip192.168.1.200
然后通过 http://localhost:81/8080/或者http://localhost:81/8081/访问
结果:展示
配置负载均衡
实现输入一个网址,能访问到两台服务器。
#myserver负载均衡配置的后台服务器ip upstream myserver{ server 192.168.1.100:8080; server 192.168.1.200:8080; } #监听本地nginx的80端口,负载均衡的服务器在代理配置中输入上面的名称 server{ listen 80; server_name localhost; location / { proxy_pass http://myserver; index index.html index.htm; } }
截图:
为了方便我直接将上面的例子中的两个文件夹(8080、8081)重命名为 test
然后如下访问进行测试,可以发现已经实现了交替访问
讲解负载均衡的常用策略
- 轮询策略(默认方式):每个请求按照时间顺序、逐一分配到不同服务器,如果某一个服务器下线了,能自动剔除。
- 权重策略(weight=?):权重默认值为1,权重越高被分配的客户端越多。在upstream中的server 末尾加weight=1;(默认为1)
- ip_hash策略:让用户固定访问一台服务器,即按照第一次访问的那台服务器,后面的访问都是同一台服务器。(解决session共享问题)
- 响应时间策略(fair):根据响应时间的长短进行分配,响应短的优先分配。
nginx实现动静分离策略(即静态页面和动态页面)
概念:
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。
具体 Expires 定义:
是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存)。
我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304;
如果有修改,则直接从服务器重新下载,返回状态码 200。
两种实现方式
- 静态文件存放在nginx,动态文件放tomcat实现。目前主流推崇的方案。
- 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开
方式一:
将静态页面放在nginx服务器上。通过location的root指定静态文件的位置。
修改配置文件如下,前面就已经用到过了。记忆 root 的使用
重载服务器 service nginx restart
然后在对应目录创建响应的文件即可,访问即http://localhost:82/即可访问想要静态文件
效果图:
Nginx高可用,主从Nginx服务器
在两台服务器上都安装上nginx、keepalived
由于我之前按过,直接使用192.168.1.100(主服务器) 和 192.168.1.200(备服务器) 两台服务器
安装keepalived
ubuntu
sudo apt install keepalived -y
centos
sudo yum install keepalived -y
配置文件
一、新建脚本check_alive.sh文件
sudo vim /etc/keepalived/check_alive.sh
添加内容:
#!/bin/bash status=$(ss -lnp | grep -c 'nginx') if [ ${status} == 0 ]; then systemctl nginx restart sleep 2 status=$(ss -lnp | grep -c 'nginx') if [ ${status} == 0 ]; then systemctl stop keepalived fi fi
授予执行权限
sudo chmod +x /etc/keepalived/check_alive.sh
二、编辑keepalived.conf文件
主服务器
sudo vim /etc/keepalived/keepalived.conf
将下面的代码覆盖keepalived.conf文件,然后稍微修改一下,原因是默认的配置不能用
! Configuration File for keepalived global_defs{ notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.1.100 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_http_port{ script "/usr/local/src/nginx_check.sh" #脚本位置 interval 2 #(检测脚本执行的间隔) weight 2 } vrrp_instance VI_1{ state MASTER # 备份服务器上将MASTER改为BACKUP interface ens33 # 网卡注意和注意要一样,用ifconfig查询然后修改对应的名称 virtual_router_id 51 # 主、备服务器的virtual_router_id 值必须相同 priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 authentication{ auth_type PASS auth_pass 1111 } virtual_ipaddress{ 192.168.1.50 #VRRP H 虚拟地址 } }
备服务器
! Configuration File for keepalived global_defs{ notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.1.100 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_http_port{ script "/usr/local/src/nginx_check.sh" #脚本位置 interval 2 #(检测脚本执行的间隔) weight 2 } vrrp_instance VI_1{ state BACKUP # 备份服务器上将MASTER改为BACKUP interface ens33 # 网卡注意和注意要一样,用ifconfig查询然后修改对应的名称 virtual_router_id 51 # 主、备服务器的virtual_router_id 值必须相同 priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 authentication{ auth_type PASS auth_pass 1111 } virtual_ipaddress{ 192.168.1.50 // VRRP H 虚拟地址 } }
最后两台服务器的nginx和keepalived进行重启
systemctl restart nginx.service
systemctl restart keepalived.service
验证结果:
输入http://192.168.1.50 即可访问到nginx页面
然后将主服务器(192.168.1.100)关闭nginx服务器nginx -s stop(或者虚拟机直接点击保持状态关机都可以)
主服务器192.168.1.100
刷新页面可以发现依然能访问到