Nginx 负载均衡

Nginx与Apache的区别
Apache:扩展模块众多,功能强大,并发性能表现一般
Nginx:功能相对于Apache较少,但并发性能特别好。异步非阻塞方式

环境搭建

Linux网络配置

1
2
3
4
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.34.102
NETMASK=255.255.255.0

yum源软件安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# mkdir /mnt/cdrom
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak
[root@localhost yum.repos.d]# vi CentOS-Media.repo
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
file:///mnt/cdrom/
file:///media/cdrecorder/
gpgcheck=1
enabled=1
[root@localhost yum.repos.d]# yum install -y vim
[root@localhost yum.repos.d]# yum -y install make gcc gcc-c++ openssl openssl-devel pcre-devel zlib-devel libxml2 libxml2-devel

安装nginx

  1. 解压
    [root@localhost LNMP]# tar -zxvf nginx-1.8.0.tar.gz
  2. 编译
    [root@localhost nginx-1.8.0]# ./configure --prefix=/usr/local/nginx
  3. 安装
    [root@localhost nginx-1.8.0]# make && make install
  4. 启动
    [root@localhost nginx-1.8.0]# /usr/local/nginx/sbin/nginx
  5. 检查
    1
    2
    [root@localhost nginx-1.8.0]# netstat -tunple|grep 80
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 24507 5148/nginx

图示:

安装PHP服务

  1. 解压
    [root@localhost LNMP]# tar -zxvf php-5.3.28.tar.gz
  2. 编译(服务)
    [root@localhost php-5.3.28]# ./configure --prefix=/usr/local/php --enable-fpm
  3. 安装
    [root@localhost php-5.3.28]# make && make install
  4. 配置文件
    [root@localhost php-5.3.28]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
    [root@localhost conf]# cp /home/LNMP/php-5.3.28/php.ini-development /usr/local/php/lib/php.ini
  5. 启动/重启
    [root@localhost php-5.3.28]# /usr/local/php/sbin/php-fpm

    1
    2
    3
    4
    5
    6
    7
    [root@localhost conf]# ps -aux|grep php
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
    root 4749 0.0 0.2 16256 2052 ? Ss 22:46 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
    nobody 4750 0.0 0.2 16256 1724 ? S 22:46 0:00 php-fpm: pool www
    nobody 4751 0.0 0.2 16256 1724 ? S 22:46 0:00 php-fpm: pool www
    root 4759 0.0 0.0 5980 740 pts/0 S+ 22:53 0:00 grep php
    [root@localhost conf]# kill -USR2 4749
  6. 检查

    1
    2
    [root@localhost php-5.3.28]# netstat -tunple|grep 9000
    tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 0 86848 4749/php-fpm

nginx关联php

1
2
3
4
5
6
7
8
9
10
[root@localhost php-5.3.28]# cd /usr/local/nginx/conf/
[root@localhost conf]# vim nginx.conf
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
[root@localhost conf]# /usr/local/nginx/sbin/nginx -s reload

nginx配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#运行的用户
#user nobody;

#工作进程数量,建议工作进程数等于cpu个数
worker_processes 1;


#错误日志
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#记录nginx的主进程号的文件位置
#pid logs/nginx.pid;


#网络事件及连接数
events {
#每个工作进程最大的并发连接数,
worker_connections 1024;
}

#web相关的配置项
http {
#nginx能够识别的文件类型
include mime.types;

#默认的文件类型
default_type application/octet-stream;


#日志文件格式
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#访问日志
#access_log logs/access.log main;

#是否使用系统的sendfile函数输出
sendfile on;
#tcp_nopush on;


#超时时间
#keepalive_timeout 0;
keepalive_timeout 65;

#开启gzip压缩
#gzip on;

#虚拟主机配置,每一个sever就是一个虚拟主机
server {
#监听80端口
listen 80;
#域名
server_name abc.com;

#charset koi8-r;

#access_log logs/host.access.log main;
#默认的匹配规则
location / {
root html; #web项目的根目录
index index.html index.htm;
}
...

配置虚拟主机

  1. 修改主配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [root@localhost conf]# pwd
    /usr/local/nginx/conf
    [root@localhost conf]# vim nginx.conf
    http {
    include mime.types;
    default_type application/octet-stream;

    #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    # '$status $body_bytes_sent "$http_referer" '
    # '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log logs/access.log main;

    sendfile on;
    #tcp_nopush on;

    #keepalive_timeout 0;
    keepalive_timeout 65;

    #gzip on;
    include /usr/local/nginx/conf/vhost/*.conf;
    }
  2. 创建vhost目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [root@localhost vhost]# vim uiste.conf
    server {
    #监听80端口
    listen 80;
    server_name www.uiste.com;
    root /usr/local/nginx/html/uiste; #虚拟主机站点根目录
    #默认的匹配规则
    location / {
    index index.html index.htm;
    }
    location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi.conf;
    }
    }
    [root@localhost vhost]# mkdir /usr/local/nginx/html/uiste
    [root@localhost vhost]# /usr/local/nginx/sbin/nginx -s reload

访问日志

nginx下访问日志是由配置项中的log_format跟access_log两个参数控制

  1. log_format
    作用:申明一个日志文件格式
    语法:log_format 别名 具体的信息

    1
    2
    3
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
  2. access_log
    作用:使用某种日志格式记录信息
    语法:access_log 存储地址 使用的别名
    access_log logs/access.log main;

  3. 访问日志中的参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $remote_addr:客户端的IP地址
    $remote_user:客户端的用户信息 通过权限验证之后的用户信息
    $time_local:时间及时区信息
    $request:请求类型及协议请求的URL地址
    $status:状态码
    $body_bytes_sent:返回数据大小
    $http_referer:请求的来源
    $http_user_agent:客户的信息
    $http_x_forwarded_for:真实客户端的IP地址,使用透传才能获取到真实客户端的IP地址

访问日志的申明只能写在http与sever之间,不能写在server配置中。访问日志可以申明多个。相对于server,http是全局设置,在虚拟主机设置使用访问日志,优先使用虚拟主机设置的格式,如果在虚拟主机中没有设置,但是在全局http中有开启使用访问日志,就会使用全局的格式记录

日志分割

crontab

1
2
3
4
5
6
7
8
基本格式 : 
* * * * * command 表示(分 时 日 月 周 命令)
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

思路

  1. 一个脚本
  2. 一个容器能够定时执行脚本

定时分割

  1. 创建cat_access.sh脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@localhost uiste]# vim cat_access.sh
    # /bin/bash
    logs_path="/usr/local/nginx/logs/"
    #以前的日志文件
    log_name="access.log"
    #指定nginx主进程号存储位置
    pid_path="/usr/local/nginx/logs/nginx.pid"
    mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
    mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log

    #重新加载配置文件
    kill -USR1 `cat ${pid_path}`
  2. 修改cat_access.sh脚本为可执行文件
    [root@localhost uiste]# chmod -R 777 cat_access.sh

  3. 测试cat_access.sh脚本运行情况
    [root@localhost uiste]# ./cat_access.sh
  4. 将脚本放入crontab中定时执行

    1
    2
    [root@localhost uiste]# crontab -e
    * * * * * /usr/local/nginx/html/uiste/cat_access.sh
  5. 查看结果
    [root@localhost uiste]# tail -f /var/log/cron

反向代理

  1. 建立测试文件(略)
  2. 修改主服务器配置文件实现反向代理
    将其他的locatin都删除掉只留下一个 /的location

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [root@localhost uiste]# cd /usr/local/nginx/conf/vhost
    [root@localhost vhost]# vim uiste.conf
    server {
    #监听80端口
    listen 80;
    server_name www.uiste.com;
    root /usr/local/nginx/html/uiste; #虚拟主机站点根目录
    #默认的匹配规则
    location / {
    proxy_pass http://192.168.34.101;
    index index.html index.htm;
    }
    }

    [root@localhost vhost]# /usr/local/nginx/sbin/nginx -s reload
  3. 测试
    截图

负载均衡

192.168.34.105作为反向代理服务器
192.168.34.101真实处理请求的服务器
192.168.34.102真实处理请求的服务器

  1. 配置nginx主配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    [root@localhost uiste]# vim /usr/local/nginx/conf/nginx.conf

    http {
    include mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log logs/access.log main;
    # 配置代理服务器
    upstream web{
    server 192.168.34.101;
    server 192.168.34.102;
    }
    sendfile on;
    #tcp_nopush on;

    #keepalive_timeout 0;
    keepalive_timeout 65;

    #gzip on;
    include /usr/local/nginx/conf/vhost/*.conf;
    }

    [root@localhost uiste]# vim /usr/local/nginx/conf/vhost/uiste.conf
    server {
    #监听80端口
    listen 80;
    server_name www.uiste.com;
    root /usr/local/nginx/html/uiste; #虚拟主机站点根目录
    #默认的匹配规则
    location / {
    proxy_pass http://web; #反向代理一组服务器
    index index.html index.htm;
    }
    }

    [root@localhost vhost]# /usr/local/nginx/sbin/nginx -s reload
  2. 测试效果

upstream语法说明
语法:

1
2
3
Upstream 别名{
Server IP地址/域名 参数;
}

参数:

1
2
3
4
5
1、down标注服务器为关闭状态,不参与负载均衡
2、weight=number:权重按照轮循的方式依据权重实现不同的负载
3、max_fails=number:最大失败次数
4、fail_timeout=number:超时时间
5、backup :表示为备用服务器。

负载均衡算法:

  1. 轮循
  2. 权重
  3. 最小连接
  4. ip_hash

    nginx重启报错

    1
    2
    3
    4
    [root@localhost vhost]# /usr/local/nginx/sbin/nginx -s reload
    nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
    #解决方法:
    `[root@localhost logs]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf`

使用nginx-c的参数指定nginx.conf文件的位置