中间件

Nginx负载均衡

2019-10-16  本文已影响0人  吃可爱长大鸭

Nginx一般用来做什么

反向/正向 代理
负载均衡
HTTP服务器(动静分离)

常用的Wev服务器

Apache

1)是世界上用的最多的Web服务器,它的优势在开源代码开放,功能完善,历史悠久,模块支持非常丰富,跨平台;缺点在于比其他web服务器内存占用高;
2)适用于动态网站。

Nginx

1)是一款轻量级的Web 服务器/反向代理服务器及电子邮件代理服务器,其特点是占有内存少,并发能力强,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等;
2)适用于反向代理服务器和静态资源服务器(注:线上公司都使用Linux安装)

IIS

是windows系统上的服务器产品(微软公司提供)。主要是给.net和asp语言使用的,经过扩展也是可以支持PHP语言

静态资源服务器

传统的web项目,一般都将静态资源放在项目public目录下,这样做很方便获取静态资源,但是如果说web项目很大,用户很多.静态资源很多时,服务器性能明显下降,这种情况下一般都会需要一个静态资源的服务器

解决

通过Nginx搭建一个服务器专门用来存放静态资源

大型项目分离的好处
1、便于维护使用(举例:一个项目图片可以方便所有项目使用,如:jq等)
2、动静分离有利于CDN加速 (注:动静分离指后端处理数据文件和静态文件分离)
3、便于缓存    (举例:请求的是同一文件,就不用再下载了)
4、静态资源的http请求中不会携带无用的cookie。
5、优化浏览器对同一域名进行请求的最大并发连接数限制(注:不同浏览器限制不同)

CDN服务器(大型项目加速使用)

CDN服务: 加快访问速度

用户请求网站 -> 检测用户所在城市是否有缓存 有直接响应 没有请求原服务器 并缓存到用户所在城市

大型项目架构
集群技术/冗余技术:多个服务实现相同的业务
负载均衡技术:将用户的请求按照指定的策略分配给不同的服务器处理
主从复制:当MySQL主服务器有insert/update/delete动作,MySQL从服务器自动同步
动静分离:将静态资源单独放一个服务器上,PHP代码在另一个服务器上
读写分离:项目insert/update/delete去操作主服务器,项目select去从服务器获取

nginx服务器

Nginx是一款轻量级、高性能的Web 服务器或反向代理服务器,因它的稳定性、丰富的功能集和低系统资源的消耗而闻名。
nginx的特点
占有内存少,并发能力强 支持同时并发50000

Tengine

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求添加了很多高级功能和特性。成功案例:淘宝网,天猫商城等。

官网:[http://tengine.taobao.org/faq_cn.html](http://tengine.taobao.org/faq_cn.html)

##### Apache与ngin服务器区别

Nginx相对 Apache的优点

轻量级,同样起web 服务,比apache 占用更少的内存及资源;
抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
高度模块化的设计,编写模块相对简单;
社区活跃,各种高性能模块出品迅速;

Apache相对Nginx的优点

rewrite ,比nginx 的rewrite 强大;
模块超多,基本想到的都可以找到;
少bug ,nginx 的bug 相对较多;
超稳定;

LNMP的安装与配置

NGINX的安装

依赖注意:

模块依赖性:Nginx的一些模块需要其他第三方库的支持,例如gzip模块需要zlib 库,rewrite模块需要pcre库,ssl功能需要openssl库等。

下载相关文件上传到服务器

依赖安装->pcre
shell>  cd /php/tools
shell>  tar -zxvf pcre-8.34.tar.gz              #解压
shell>  cd pcre-8.34                            #进入解压目录
shell>  ./configure && make && make install  #配置、编译和安装 
alib压缩库
shell>  cd /php/tools
shell>  tar -zxvf zlib-1.2.5.tar.gz
shell>  cd zlib-1.2.5  
shell>  ./configure                 # 这个配置编译命令不要加目录参数
shell>  make && make install
nginx的安装
shell> cd /php/tools
shell> tar -zxvf nginx-1.8.1.tar.gz
shell> cd nginx-1.8.1
shell> mkdir -p /php/server/nginx
shell> ./configure  --prefix=/php/server/nginx
shell> make && make install
shell> /php/server/nginx/sbin/nginx  #启动

注: 首次启动可能报错

shell> ln -s /lib64/libpcre.so.0.0.1 /lib64/libpcre.so.1  #创建软链接 如果是32位系统请将前面64去掉即可
shell> /php/server/nginx/sbin/nginx               #重新启动
shell> ps -A | grep nginx                             #验证是否启用成功

管理nginx

启动nginx

shell> ln -s /lib/libpcre.so.0.0.1 /lib/libpcre.so.1  #创建软连接
shell> /php/server/nginx/sbin/nginx  #启动
shell> /php/server/nginx/sbin/nginx -s stop #正常关闭
shell> /php/server/nginx/sbin/nginx -s quiet  #快速关闭
shell> /php/server/nginx/sbin/nginx -s reload  重启服务

配置文件(nginx.conf)

配置文件位置
/php/service/nginx/conf
user  用户  用户组;

#有1个工作子进程,可以自行修改,但太大无益,因为争夺CPU,一般设置为CPU数*核数
worker_processes 1; 

events {
#单个后台worker process进程的最大并发链接数
#最大连接数 = worker_processes * worker_connections
    worker_connections  1024; #这里指一个子进程最大允许连接1024
}

http { #这是配置http服务器的主要段

server { #虚拟主机段
location {  #定位,把特殊的文件再次定位,如image目录单独处理或php单独处理
}
}

server { #虚拟主机段
location {  #定位,把特殊的文件再次定位,如image目录单独处理或php单独处理
}
}
.......
}
#注:每新增一个server则添加一个虚拟主机(推荐:使用include方式引入外部虚拟主机配置文件)

配置虚拟主机

在nginx配置虚拟主机非常简单,只需在http{}中加个server即可新增一个虚拟主机

server {
    # 监听端口
    listen 80;
    # 绑定域名(多个之间用空格隔开)
    server_name 待绑定的域名;

    location / {
        # 项目根目录
        root /php/wwwroot/web1;
        # 默认首页
        index index.html index.htm;
   }
}

例如:

   server {
        # 监听端口
        listen 80;
        # 绑定域名(多个之间用空格隔开)
        server_name n1.com;

        location / {
            # 项目根目录
            root /php/wwwroot/web1;
            # 默认首页
            index index.html index.htm;
        }
    }

    server {
        # 监听端口
        listen 80;
        # 绑定域名(多个之间用空格隔开)
        server_name n2.com;

        location / {
            # 项目根目录
            root /php/wwwroot/web2;
            # 默认首页
            index index.html index.htm;
        }
    }

创建虚拟主机目录
shell> mkdir -p /php/wwwroot/web1 /php/wwwroot/web2
shell> echo 'this is n1.com' > /php/wwwroot/web1/index.html
shell> echo 'this is n2.com' > /php/wwwroot/web2/index.html
#重启服务即可
shell> /php/server/nginx/sbin/nginx -s reload

注: 要修改hosts文件

PHP与nginx整合(php-fpm)

php安装可以作为Apache模块存在,同时也可以单独的作为一个服务运行(端口是9000端口),这种单独运行的模式叫做php-fpm模式,在5.3.3+以后的版本都默认支持,以前的版本需要打补丁。

安装libxml2(否则php报错)
shell> cd /php/tools
shell> tar zxvf libxml2-2.7.2.tar.gz
shell> cd libxml2-2.7.2
shell> ./configure  或 ./configure --without-zlib --prefix=/usr/local/libxml2
shell> make && make install
安装PHP
shell> cd /php/tools
shell> tar -zxvf php-5.6.31.tar.gz
shell> cd php-5.6.31 
shell> ./configure --prefix=/php/server/php2  --enable-fpm
#注:--enable-fpm该选项是指,以独立进程的方式来安装PHP
shell> make && make install

\cp -rf  /php/tools/php-5.6.31/php.ini-development  /php/server/php2/lib/php.ini# 将php配置文件复制到指定目录 

cp \
/php/server/php2/etc/php-fpm.conf.default \
/php/server/php2/etc/php-fpm.conf  #复制配置文件

shell> /php/server/php2/sbin/php-fpm  # 启动服务

管理PHP服务
shell> /php/server/php2/sbin/php-fpm  # 启动服务
shell> killall php-fpm                      # 关闭服务
让nginx支持PHP

打开nginx.conf在server大括号里添加

location ~ \.php$ {  #检测到.php结尾的文件交给php处理
    root             虚拟主机路径;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  虚拟主机路径/$fastcgi_script_name;
    include        fastcgi_params;
}
shell> /php/server/nginx/sbin/nginx -s reload  #重启服务
shell> echo '<?php echo phpinfo();' > /php/wwwroot/web1/test1.php #测试

gzip压缩

开启gzip压缩的好处
开启后会将输出到用户浏览器的数据进行压缩处理,这样就会减小通过网络传输的数据量,提高网页浏览速度
#步骤1:将tools的bg.jpg和test.html复制到站点目录并访问
shell> cp -rf /php/tools/test.html /php/tools/bg.jpg  /php/wwwroot/web1
#步骤2:在虚拟主机server中增加下属代码即可
gzip on;                 #开启Gzip压缩
gzip_min_length 1k;  #不压缩临界值,大于1K的才压缩
gzip_comp_level 6;   #压缩级别(1-9)越大越慢,同时也最消耗CPU
#声明压缩文件(MIME类型)
gzip_types text/plain application/x-javascript text/css application/xml text/javascript image/jpeg;
gzip_disable "MSIE [1-6]\."; #禁用IE1-6
#步骤三: 重启nginx
/php/server/nginx/sbin/nginx -s reload

配置expires缓存功能

expires缓存功能概述

作用: 设置expires减少不必要的http请求

将静态资源(css.js.img..)等缓存到客户端,减轻服务器压力

配置
#步骤1:在虚拟主机server中增加下属代码即可
location ~ \.(gif|jpg|jpeg|png|bmp|ico|js|css)$ {
    root /php/wwwroot/web1;
    expires 1d;  #1d (天)  1h(时)  1m(分)  1s(秒)
}
#步骤2:重启nginx
/php/server/nginx/sbin/nginx -s reload
#步骤3:创建测试文件查看是否设置成功
echo 'alert(1)' > /php/wwwroot/web1/test2.js
echo  \
'<script src=./test2.js></script>' > \
/php/wwwroot/web1/test2.html
linux设置电脑时间
date -s '2018/7/13 15:11:25'
clock -w #将时间写到磁盘中
为什么开启expires速度快
为什么304比200快?
明确304和200都有发送http请求,但是304会进行检测,如果未修改则不响应数据,而是从浏览器返回
为什么expire比304快?
因为静态资源设置了expire直接从浏览器获取不发送http请求
image

日志管理

日志分析命令

tail命令: 常用于分析日志

tail -数字  路径及文件名    #查看后n行
tail -f     路径及文件名    #实时监控文件更新内容
日志类型

nginx里默认会有两种日志 access.log 访问日志 error.log错误日志

默认路径在nginx/logs/

访问日志
$remote_addr 客户端的ip地址(代理服务器,显示代理服务ip)
$remote_user 用于记录远程客户端的用户名称(一般为“-”)
$time_local 用于记录访问时间和时区
$request 用于记录请求的url以及请求方法
$status 响应状态码,例如:200成功、404页面找不到等。
$body_bytes_sent 给客户端发送的文件主体内容字节数
$http_user_agent 用户所使用的代理(一般为浏览器)
$http_x_forwarded_for 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_referer 可以记录用户是从哪个链接访问过来的
错误日志

记录配置启动错误信息(如:端口被占用,配置文件错误等)

基于域名日志分割

基于域名日志分割指: 多站点日志分开存放,便于后期分析

在nginx.conf配置文件中

复制log_format main 这行 并粘贴
后面记录数据.分别客户端ip,客户请求,浏览器信息
再在对应的server中添加
access_log logs/日志文件名   main;
重启后发现logs目录下多了对应日志文件名的文件即可;

配置虚拟主机(方法2)

在主配置文件中新增多个虚拟主机,导致配置文件越来越大,不便于管理.所以建议使用下述方案

一个虚拟主机对应一个配置文件

步骤1:打开Nginx主配置文件(nginx.conf)将刚新增的两个虚拟主机删除或注释

步骤2:打开Nginx主配置文件(nginx.conf)引入外部虚拟主机配置文件

vi /php/server/nginx/conf/nginx.conf #打开配置文件
 在http{}中加入:【include vhosts/*.conf;】
 #新建外部虚拟主机目录(vhosts)
 shell> mkdir -p /php/server/nginx/conf/vhosts 
 #新建虚拟主机
shell> cd /php/server/nginx/conf/vhosts
shell> vi nginx1.conf
server {
    # 监听端口
    listen 80;
    # 绑定域名(多个之间用空格隔开)
    server_name n1.com;

    location / {
        # 项目根目录
        root /php/wwwroot/web1;
        # 默认首页
        index index.html index.htm;
   }
}
shell> /php/server/nginx/sbin/nginx -s reload #重启服务器即可

注:后期需要增加虚拟主机,则在【/php/server/nginx/conf/vhosts】目录下新【xxx.conf】以conf结尾的文件然后填写server即可

image.png

反向代理结合负载均衡配置*重点

1.地址规划
web01 www.mysun.com blog.mysun.com bbs.mysun.com
web02 www.mysun.com blog.mysun.com bbs.mysun.com

lb01:

www.mysun.com       
blog.mysun.com      
bbs.mysun.com       

2.配置web服务器

cat >/etc/nginx/conf.d/www.conf <<EOF
server {
  listen 80;
  server_name www.mysun.com;
  location / {
     root /code;
     index www.html;
  }
}
EOF

cat >/etc/nginx/conf.d/bbs.conf <<EOF
server {
  listen 80;
  server_name bbs.mysun.com;
  location / {
     root /code;
     index bbs.html;
  }
}
EOF

cat >/etc/nginx/conf.d/blog.conf <<EOF
server {
  listen 80;
  server_name blog.mysun.com;
  location / {
     root /code;
     index blog.html;
  }
}
EOF
echo "$(hostname) bbs" > /code/bbs.html
echo "$(hostname) www" > /code/www.html
echo "$(hostname) blog" > /code/blog.html
nginx -t 
systemctl restart nginx 

3.配置lb服务器

[root@lb01 ~]# cat /etc/nginx/conf.d/proxy.conf 
upstream web_pools {
   server 172.16.1.7;
   server 172.16.1.8;
}

server {
   listen 80;
   server_name www.mysun.com bbs.mysun.com blog.mysun.com;
   location / {
      proxy_pass  http://web_pools;
      include proxy_params;
   }
}
nginx -t 
systemctl restart nginx 

4.windows操作:

10.0.0.5 www.mysun.com bbs.mysun.com blog.mysun.com

Nginx反向代理负载均衡算法

1.IP哈希
配置语法:

upstream www_pools {
   ip_hash;
   server 172.16.1.7 ;
   server 172.16.1.8 ;
}
2.URL哈希
配置语法:
upstream www_pools {
   server 172.16.1.7 ;
   server 172.16.1.8 ;
   hash   $request_uri;
}
3.加权轮询
upstream www_pools {
   server 172.16.1.7 weight=1;
   server 172.16.1.8 weight=2;
}
测试命令:
for i in {1..100};do curl -s -H "host:www.mysun.com" 127.0.0.1;done |grep web02|wc -l

负载均衡根据条件跳转

1.根据文件后缀名
需求:
访问.php结尾的网页,跳转到web01上
访问.jpg结尾的网页,跳转到web02上
2.nginx配置
upstream php_pools {
   server 172.16.1.7;
}

upstream jpg_pools {
   server 172.16.1.8;
}

server {
   listen 80;
   server_name  bbs.mysun.com ;
   location ~ \.php$ {
      proxy_pass  http://php_pools;
      include proxy_params;
   }
   location ~ \.jpg$ {
      proxy_pass  http://jpg_pools;
      include proxy_params;
   }
}

2.根据访问目录

[root@lb01 ~]# cat /etc/nginx/conf.d/proxy.conf 
upstream upload_pools {
   server 172.16.1.7;
}

upstream jpg_pools {
   server 172.16.1.8;
}

server {
   listen 80;
   server_name  bbs.mysun.com ;
   location ^~ /upload/ {
      proxy_pass  http://upload_pools;
      include proxy_params;
   }
   location ^~ /images/ {
      proxy_pass  http://jpg_pools;
      include proxy_params;
   }
}

3.根据UA类型

web服务器nginx配置:

[root@web01 ~]# cat /etc/nginx/conf.d/sj.conf 
server {
    listen 9090;
    location / {
        root /code/android;
        index index.html;
    }
}
server {
    listen 9091;
    location / {
        root /code/iphone;
        index index.html;
    }
}
server {
    listen 9092;
    location / {
        root /code/pc;
        index index.html;
    }
}

web服务器页面配置:

mkdir -p /code/{android,iphone,pc}
echo "PC $(hostname)" > /code/pc/index.html
echo "Iphone $(hostname)" > /code/iphone/index.html
echo "Android $(hostname)" > /code/android/index.html
systemctl restart nginx

lb服务器nginx配置:

cat /etc/nginx/conf.d/sj.conf 
upstream iphone_pools {
    server 172.16.1.7:9091;
}
upstream android_pools {
    server 172.16.1.8:9090;
}
upstream pc_pools {
    server 172.16.1.7:9092;
    server 172.16.1.8:9092;
}

server {
    listen 80;
    server_name sj.mysun.com;
    location / {
        #默认跳转至 pc 站点
        proxy_pass http://pc_pools;

        #如果客户端是 Iphone 则跳转到 iphone 的资源池
        if ($http_user_agent ~* "Iphone") {
            proxy_pass http://iphone_pools;
        } 

        #如果客户端是 Android 则跳转到 android 的资源池
        if ($http_user_agent ~* "Android"){
            proxy_pass http://android_pools;
        } 

        #如果客户端是 IE 浏览器,则返回 403 错误。
        if ($http_user_agent ~* "msie"){
            return 403;
        }
        include proxy_params;
    }
}

测试命令:

echo "10.0.0.5 sj.mysun.com" >>/etc/hosts
curl sj.mysun.com
curl -A "iphone" sj.mysun.com
curl -A "android" sj.mysun.com
curl -A "msie" sj.mysun.com
上一篇下一篇

猜你喜欢

热点阅读