Nginx负载均衡
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