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
刷新页面可以发现依然能访问到