如何高效的配置Nginx

nginx配置文件的目录

cat /etc/nginx/nginx.conf

Nginx高性能WEB服务器系列

 

 

目  录

1. Nginx入门简介 1

2. Nginx工作原理及安装配置 3

3. Nginx常用命令管理及升级 6

4. Nginx配置文件精讲一 9

5. Nginx配置文件精讲二 13

6. 实战线上Nginx多站点配置 17

7. 企业实战Nginx+Tomcat动静分离架构 18

8. 企业实战Nginx+PHP(FastCGI)高性能服务器 25

9. Nginx与Tomcat/PHP架构优化 25

10. Nginx配置优化及深入讲解 30

11. Nginx Rewrite规则详解一 35

12. 构建Nginx均衡LAMP高性能服务器 36

13. Nginx日志分析及脚本编写 45

14. Nginx日志切割案例讲解 47

15. Nginx防盗链配置案例配置 49

16. Nginx运维日常故障解决方案 52

17. Nginx均衡TCP协议服务器案例 52

18. 构建企业级Nginx+Keepalived集群架构 54

19. 企业Nginx+Keepalived双主架构案例实战 61

 

1. Nginx入门简介

WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 WWW 是 Internet的多媒体信息查询工具,是 Internet 上近年才发展起来的服务,也是发展最快和目前用的最广泛的服务。正是因为有了WWW工具,才使得近年来 Internet 迅速发展,且用户数量飞速增长。

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

它已经在众多流量很大的俄罗斯网站上使用了很长时间,这些网站包括YandexMail.RuVKontakte,以及Rambler。据Netcraft统计,在2012年8月份,世界上最繁忙的网站中有11.48%使用Nginx作为其服务器或者代理服务器。目前互联网主流公司360、百度、新浪、腾讯、阿里等,目前中国互联网企业70%以上公司都在使用nginx作为自己的web服务器。

Nginx特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

Nginx相对于Apache优点:

1) 高并发响应性能非常好,官方Nginx处理静态文件并发5w/s

2) 反向代理性能非常强。(可用于负载均衡)

3) 内存和cpu占用率低。(为Apache的1/5-1/10)

4) 对后端服务有健康检查功能。

5) 支持PHP cgi方式和fastcgi方式。

6) 配置代码简洁且容易上手。

2. Nginx工作原理及安装配置

Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

Nginx的模块从结构上分为核心模块、基础模块和第三方模块:

核心模块:HTTP模块、EVENT模块和MAIL模块

基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,

第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

Nginx的高并发得益于其采用了epoll模型,与传统的服务器程序架构不同,epoll是linux内核2.6以后才出现的。Nginx采用epoll模型,异步非阻塞,而apache采用的是select模型:

Select特点:select 选择句柄的时候,是遍历所有句柄,也就是说句柄有事件响应时,select需要遍历所有句柄才能获取到哪些句柄有事件通知,因此效率是非常低。

epoll的特点:epoll对于句柄事件的选择不是遍历的,是事件响应的,就是句柄上事件来就马上选择出来,不需要遍历整个句柄链表,因此效率非常高。

接下来正式安装Nginx,首先需要安装pcre库。

#安装pcre支持rewrite库,也可以安装源码,注*安装源码时,指定pcre路径为解压

源码的路径,而不是编译后的路径,否则会报错

(make[1]: *** [/usr/local/pcre/Makefile] Error 127 错误)

yum install pcre-devel pcre -y

#下载Nginx源码包

cd /usr/src

wget -c http://nginx.org/download/nginx-1.6.2.tar.gz 

#解压Nginx源码包

tar -xzf nginx-1.6.2.tar.gz

#进入解压目录,然后sed修改Nginx版本信息为WS

cd nginx-1.6.2 ; sed -i -e 's/1.6.2//g' -e 's/nginx\//WS/g' -e

's/"NGINX"/"WS"/g' src/core/nginx.h

#预编译Nginx

useradd www ;./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

#.configure预编译成功后,执行make命令进行编译

make

#make执行成功后,执行make install 正式安装

make install

#自此Nginx安装完毕

/usr/local/nginx/sbin/nginx  -t  检查nginx配置文件是否正确,返回OK即正确。

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@localhost ~]#

然后启动nginx,/usr/local/nginx/sbin/nginx 回车即可。查看进程是否已启动:

[root@localhost ~]# ps -ef |grep nginx

nobody    5381 30285  0 May16 ?        00:04:31 nginx: worker process         

root     30285     1  0  2014 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx

root     32260 32220  0 12:34 pts/0    00:00:00 grep nginx

[root@localhost ~]#

3. Nginx常用命令管理及升级

查看nginx进程

ps -ef|grep nginx

说明:nginx的进程由主进程和工作进程组成。

启动nginx

nginx

启动结果显示nginx的主线程和工作线程,工作线程的数量跟nginx.conf中的配置参数worker_processes有关。

平滑启动nginx

kill -HUP  `cat /var/run/nginx.pid`

或者

nginx -s reload

其中进程文件路径在配置文件nginx.conf中可以找到。

平滑启动的意思是在不停止nginx的情况下,重启nginx,重新加载配置文件,启动新的工作线程,完美停止旧的工作线程。

完美停止nginx

kill -QUIT `cat /var/run/nginx.pid`

快速停止nginx

kill -TERM `cat /var/run/nginx.pid`

或者

kill -INT `cat /var/run/nginx.pid`

完美停止工作进程(主要用于平滑升级)

kill -WINCH `cat /var/run/nginx.pid`

强制停止nginx

pkill -9 nginx

检查对nginx.conf文件的修改是否正确

nginx -t -c /etc/nginx/nginx.conf 或者 nginx -t

停止nginx的命令

nginx -s stop或者pkill nginx

查看nginx的版本信息

nginx -v

查看完整的nginx的配置信息

nginx -V

Nginx升级方法:

下载所需版本的Nginx

wget http://www.nginx.org/download/nginx-1.4.2.tar.gz  

获取旧版本nginx的configure选项

/usr/local/nginx/sbin/nginx -V

编译新版本的nginx

tar  -xvf  nginx-1.4.2.tar.gz

cd nginx-1.4.2

./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module

make

备份旧版本的nginx可执行文件,复制新版本的nginx这行文件

mv /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin/nginx.old

cp objs/nginx /usr/local/nginx/sbin/

测试新版本nginx是否正常

/usr/local/nginx/sbin/nginx -t

平滑重启升级nginx

kill –USR2  `cat /usr/local/nginx/log/nginx.pid`

旧版本Nginx的pid变为oldbin,这是旧版本和新版本的nginx同时运行,过一段时间等就nginx处理完用户请求后,执行下面操作

从容关闭旧版本的Nginx进程

kill -WINCH `cat /usr/local/nginx/log/nginx.oldbin`

决定是否升级到新版的nginx

kill –HUP `cat /usr/local/nginx/log/nginx.oldbin` ##nginx在不重载配置文件启动工作进程

kill –QUIT `cat /usr/local/nginx/log/nginx.oldbin` ##关闭旧版nginx

验证nginx是否升级成功

/usr/local/nginx/sbin/nginx –V ###显示下图则升级成功

 

4. Nginx配置文件精讲一

#定义Nginx运行的用户和用户组

user  www www;

#启动进程,通常设置成和cpu的数量相等

worker_processes  8;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

#为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。

worker_rlimit_nofile 102400;

#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打

#开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀

#,所以最好与ulimit -n的值保持一致。

#全局错误日志及PID文件

error_log  /usr/local/nginx/logs/error.log;

#错误日志定义等级,[ debug | info | notice | warn | error | crit ]

pid        /usr/local/nginx/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀.

#所以建议与ulimit -n的值保持一致。

worker_rlimit_nofile 65535;

#工作模式及连接数上限

events {

    use   epoll;              #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能

    worker_connections  102400; #单个后台worker process进程的最大并发链接数 (最大连接数=连接数*进程数)

    multi_accept  on; #尽可能多的接受请求

}

#设定http服务器,利用它的反向代理功能提供负载均衡支持

http {

    #设定mime类型,类型由mime.type文件定义

    include       mime.types;

    default_type  application/octet-stream;

    #设定日志格式

    access_log    /usr/local/nginx/log/nginx/access.log;

 sendfile      on;

    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用必须设为 on

#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.

#autoindex  on;  #开启目录列表访问,合适下载服务器,默认关闭。

tcp_nopush on; #防止网络阻塞

keepalive_timeout  60;

#keepalive超时时间,客户端到服务器端的连接持续有效时间,当出现对服务器的后,继请求时,keepalive-timeout功能可避免建立或重新建立连接。

    tcp_nodelay   on; #提高数据的实时响应性

   #开启gzip压缩

   gzip on;

gzip_min_length  1k;

gzip_buffers     4 16k;

gzip_http_version 1.1;

gzip_comp_level  4; #压缩级别大小,最大为9,值越小,压缩后比例越小,CPU处理更快。

#值越大,消耗CPU比较高。

gzip_types       text/plain application/x-javascript text/css application/xml;

gzip_vary on;

client_max_body_size 10m;      #允许客户端请求的最大单文件字节数

    client_body_buffer_size 128k;  #缓冲区代理缓冲用户端请求的最大字节数,

    proxy_connect_timeout 120;      #nginx跟后端服务器连接超时时间(代理连接超时)

    proxy_send_timeout 120;         #后端服务器数据回传时间(代理发送超时)

    proxy_read_timeout 120;         #连接成功后,后端服务器响应时间(代理接收超时)

    proxy_buffer_size 4k;          #设置代理服务器(nginx)保存用户头信息的缓冲区大小

    proxy_buffers 4 32k;           #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置

    proxy_busy_buffers_size 64k;   #高负荷下缓冲大小(proxy_buffers*2)

 

    #设定请求缓冲

    large_client_header_buffers  4 4k;

client_header_buffer_size 4k;

#客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k

#不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。

open_file_cache max=102400 inactive=20s;

#这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

open_file_cache_valid 30s;

#这个是指多长时间检查一次缓存的有效信息。

open_file_cache_min_uses 1;

#open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive

    #包含其它配置文件,如自定义的虚拟主机

    include  vhosts.conf;

5. Nginx配置文件精讲二

#这里为后端服务器wugk应用集群配置,根据后端实际情况修改即可,tdt_wugk为负载均衡名称,可以任意指定

#但必须跟vhosts.conf虚拟主机的pass段一致,否则不能转发后端的请求。weight配置权重,在fail_timeout内检查max_fails次数,失败则剔除均衡。

upstream tdt_wugk {

server   127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;

server   127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;

}

   #虚拟主机配置

server {

#侦听80端口

        listen       80;

        #定义使用www.wuguangke.cn访问

        server_name  www.wuguangke.cn;

        #设定本虚拟主机的访问日志

        access_log  logs/access.log  main;

root   /data/webapps/wugk;  #定义服务器的默认网站根目录位置

        index index.php index.html index.htm;   #定义首页索引文件的名称

        #默认请求

        location ~ /{

          root   /data/www/wugk;      #定义服务器的默认网站根目录位置

          index index.php index.html index.htm;   #定义首页索引文件的名称

          #以下是一些反向代理的配置.

  proxy_next_upstream http_502 http_504 error timeout invalid_header;

  #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。

          proxy_redirect off;

          #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

          proxy_set_header Host $host;

          proxy_set_header X-Real-IP $remote_addr;

          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

   proxy_pass  http://tdt_wugk;     #请求转向后端定义的均衡模块

       }

#配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。

location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$

{

root /data/www/wugk;

#expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力。

expires      30d;

}

        #PHP脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.

        location ~ \.php$ {

            root /root;

            fastcgi_pass 127.0.0.1:9000;

            fastcgi_index index.php;

            fastcgi_param SCRIPT_FILENAME /data/www/wugk$fastcgi_script_name;

            include fastcgi_params;

        }

        #设定查看Nginx状态的地址

        location /NginxStatus {

            stub_status  on;

        }

     }

}

6. 实战线上Nginx多站点配置

在真实的服务器环境,为了充分利用服务器资源,一台nginx web服务器同时会配置N个虚拟域名主机,即多个域名对于同样一个80端口。然后服务器IP数量很多,也可以配置基于多个IP对应同一个端口。

vi修改nginx.conf server段配置内容如下:

#virtual hosts config 2014/5/18

server {

        listen       80;

        server_name  www.a.com;

        #access_log  logs/host.access.log  main;

        location / {

            root   html/a;

            index  index.html index.htm;

        }

 

server {

        listen       80;

        server_name  www.b.com;

        #access_log  logs/host.access.log  main;

        location / {

            root   html/b;

            index  index.html index.htm;

        }

创建两个不同的目录mkdir –p /usr/local/nginx/html/{a,b},然后分别在两个目录创建两个不同的index.html网站页面即可。通过客户端配置hosts指向两个域名,然后在IE浏览器访问测试效果。

7. 企业实战Nginx+Tomcat动静分离架构

Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat、Resin出来动态页面。

动静分离从目前实现角度来讲大致分为两种:

一种是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案.

另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。这样也是本次课程要讲解的,具体怎么来实现呢,如下图,通过location指定不同的后缀名实现不同的请求转发。

通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。

此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。

线上Nginx动静分离完整配置(实际环境中可以使用,如下为nginx.conf文件内容)

user www www;

worker_processes 8;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

pid /usr/local/nginx/nginx.pid;

worker_rlimit_nofile 102400;

events

{

use epoll;

worker_connections 102400;

}

http

{

  include       mime.types;

  default_type  application/octet-stream;

  fastcgi_intercept_errors on;

  charset  utf-8;

  server_names_hash_bucket_size 128;

  client_header_buffer_size 4k;

  large_client_header_buffers 4 32k;

  client_max_body_size 300m;

  sendfile on;

  tcp_nopush     on;

  keepalive_timeout 60;

  tcp_nodelay on;

  client_body_buffer_size  512k;

  proxy_connect_timeout    5;

  proxy_read_timeout       60;

  proxy_send_timeout       5;

  proxy_buffer_size        16k;

  proxy_buffers            4 64k;

  proxy_busy_buffers_size 128k;

  proxy_temp_file_write_size 128k;

  gzip on;

  gzip_min_length  1k;

  gzip_buffers     4 16k;

  gzip_http_version 1.1;

  gzip_comp_level 2;

  gzip_types       text/plain application/x-javascript text/css application/xml;

  gzip_vary on;

 

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

              '$status $body_bytes_sent "$http_referer" '

              '"$http_user_agent"  $request_time';

 

upstream  jvm_web1 {

    server   127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;

server   127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;

80+

}

 

upstream  jvm_web2 {

    server   127.0.0.1:8082 weight=1 max_fails=2 fail_timeout=30s;

    server   127.0.0.1:8083 weight=1 max_fails=2 fail_timeout=30s;

}

include vhosts.conf;

}

如下为vhosts.conf内容:

server

  {

    listen       80;

    server_name www.wugk1.com wugk1.com;

    index  index.jsp index.html index.htm;

    root  /data/webapps/wugk1;

    location /

    {

         proxy_next_upstream http_502 http_504 error timeout invalid_header;

         proxy_set_header Host  $host;

         proxy_set_header X-Real-IP $remote_addr;

         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

         proxy_pass http://jvm_web1;

    }

    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$

    {

root  /data/webapps/wugk1;

expires      30d;

    }

access_log  /data/logs/jvm_web1/access.log main;

error_log   /data/logs/jvm_web1/error.log  crit;

 

   }

 

server

  {

    listen       80;

    server_name www.wugk2.com wugk2.com;

    index  index.jsp index.html index.htm;

    root  /data/webapps/wugk2;

    location /

    {

         proxy_next_upstream http_502 http_504 error timeout invalid_header;

         proxy_set_header Host  $host;

         proxy_set_header X-Real-IP $remote_addr;

         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

         proxy_pass http://jvm_web2;

    }

    location ~ .*\.(php|jsp|cgi|shtml)?$

    {

         proxy_set_header Host  $host;

         proxy_set_header X-Real-IP $remote_addr;

         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

         proxy_pass http://jvm_web2;

    }

    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$

    {

root /data/webapps/wugk2;

expires      30d;

    }

access_log  /data/logs/jvm_web2/access.log main;

error_log   /data/logs/jvm_web2/error.log  crit;

 

   }

然后在创建如下目录:

mkdir -p  /data/logs/{jvm_web1,jvm_web2}  /data/webapps/{wugk1,wugk2}

 

配置后端Tomcat服务器,这里省略哦,分别启动4个tomcat或者2个tomcat对应不同的均衡模块ip和端口即可。

最后检查Nginx配置是否正确即可,然后测试动静分离是否成功,之需要删除后端tomcat服务器上的某个静态文件,查看是否能访问,如果可以访问说明静态资源nginx直接返回了,不走后端tomcat服务器。

8. 企业实战Nginx+PHP(FastCGI)高性能服务器

 

9. Nginx与Tomcat/PHP架构优化

PHP性能优化

一般我们是在/usr/local/php5/etc/php-fpm.conf这个文件里面进行相应的配置。

1) 如果设置成static,php-fpm进程数自始至终都是pm.max_children指定的数量,不再增加或减少。

2) 如果设置成dynamic,则php-fpm进程数是动态的,最开始是pm.start_servers指定的数量,如果请求较多,则会自动增加,保证空闲的进程数不小于pm.min_spare_servers,如果进程数较多,也会进行相应清理,保证多余的进程数不多于pm.max_spare_servers。

这两种不同的进程管理方式,可以根据服务器的实际需求来进行调整。

这里先说一下涉及到这个的几个参数,他们分别是pm、pm.max_children、pm.start_servers、pm.min_spare_servers和pm.max_spare_servers。

Pm 表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。在更老一些的版本中,dynamic被称作apache-like。这个要注意看配置文件的说明。

下面4个参数的含义:

pm.max_children:静态方式下开启的php-fpm进程数量。

pm.start_servers:动态方式下的起始php-fpm进程数量。

pm.min_spare_servers:动态方式下的最小php-fpm进程数量。

pm.max_spare_servers:动态方式下的最大php-fpm进程数量。

如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。

如果dm设置为dynamic,那么pm.max_children参数失效,后面3个参数生效。系统会在php-fpm运行开始的时候启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。

其他优化方法:

1. Compile PHP’s modules as less as possible, the simple the best (fast);

尽量少安装PHP模块,最简单是最好(快)的

2. Increas PHP FastCGI child number to 100 and even more. Sometime, 200 is OK! ( On 4GB memory server);

2G把你的PHP FastCGI子进程数调到100或以上,在4G内存的服务器上200就可以(建议压力测试来得出自己服务器合理的值)

3. Using SOCKET PHP FastCGI, and put into /dev/shm on Linux;

socket连接FastCGI,/dev/shm是内存文件系统,socket放在内存中肯定会快些

4. Increase Linux “max open files”, using the following command (must be root):

Linux下增加文件打开数,命令如下:

cat >> /etc/security/limits.conf <<EOF

* soft nproc 65535

* hard nproc 65535

* soft nofile 65535

* hard nofile 65535

EOF

5. Increase PHP-FPM open file description rlimit:

增加 PHP-FPM 打开文件描述符的限制:

# vi $php_install_dir/etc/php-fpm.conf

rlimit_files = 51200

6. Using PHP code accelerator, e.g eAccelerator, XCache. And set “cache_dir” to /dev/shm on Linux.

使用php代码加速器,例如 eAccelerator, XCache、APC在Linux平台上可以把`cache_dir`指向 /dev/shm

/usr/local/php/etc/php-fpm.conf重要优化参数详解:

pm = dynamic

pm参数指定了进程管理方式,有两种可供选择:static或dynamic,从字面意思不难理解,为静态或动态方式。如果是静态方式,那么在php-fpm启动的时候就创建了指定数目的进程,在运行过程中不会再有变化(并不是真的就永远不变);

而动态的则在运行过程中动态调整,当然并不是无限制的创建新进程,受pm.max_spare_servers参数影响;动态适合小内存机器,灵活分配进程,省内存。静态适用于大内存机器,动态创建回收进程对服务器资源也是一种消耗。

一般php-fpm进程占用20~30m左右的内存就按30m算。如果单独跑php-fpm,动态方式起始值可设置物理内存Mem/30M,由于大家一般Nginx、MySQL都在一台机器上,于是预留一半给它们,即php-fpm进程数为$Mem/2/30。

给一个理论值:

pm = dynamic

pm.max_children =80

pm.start_servers = 12

pm.min_spare_servers = 4

pm.max_spare_servers = 20

rlimit_files = 65535

pm.max_requests = 102400

Tomcat性能优化

线上环境使用默认tomcat配置文件,性能很一般,为了满足大量用户的访问,需要对tomcat进行参数性能优化,具体优化的地方如下:

Ø Linux内核的优化

Ø 服务器资源配置的优化

Ø Tomcat参数优化

Ø 配置负载集群优化

这里着重讲解tomcat参数的优化:server.xml文件,关闭DNS查询、配置最大并发等参数。

maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200

acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100

当然这些值都不是越大越好,需要根据实际情况来设定。可以基于测试的基础上来不断的调优分析。

<Connector port="8080"   

protocol="org.apache.coyote.http11.Http11NioProtocol"  

           connectionTimeout="20000"  

           redirectPort="8443"   

           maxThreads="5000"   

           minSpareThreads="20"  

           acceptCount="1000"

           disableUploadTimeout="true"

           enableLookups="false"   

           URIEncoding="UTF-8" />

catalina.sh JVM参数优化,添加如下内容:

CATALINA_OPTS="$CATALINA_OPTS -Xms4000M -Xmx4000M -Xmn1000M -XX:SurvivorRatio=4 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=82 -DLOCALE=UTF-16LE  -DRAMDISK=/ -DUSE_RAM_DISK=ture -DRAM_DISK=true"

配置多个tomcat实例,方法也很简单,只需要在服务器上cp多个tomcat,然后修改三个端口和发布目录即可,然后分别启动即可。

为了提升整个网站的性能,还需要在tomcat前面架设nginx web反向代理服务器,用以提高用户高速访问。

10. Nginx配置优化及深入讲解

随着访问量的不断增加,需要对Nginx和内核做相应的优化来满足高并发用户的访问,那下面在单台Nginx服务器来优化相关参数。

1) Nginx.conf配置优化:

worker_processes 8;

nginx进程数,建议按照cpu数目来指定,一般为它的倍数。

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000

00100000 01000000 10000000;

为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一

个进程分配到多个cpu。

worker_rlimit_nofile 102400;

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打

开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀

,所以最好与ulimit -n的值保持一致。

use epoll;

使用epoll的I/O模型。epoll是Linux内核为处理大批量文件描述符而作了改进的

poll,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用

率。

worker_connections 102400;

每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为

worker_processes*worker_connections。

keepalive_timeout 60;

keepalive超时时间,客户端到服务器端的连接持续有效时间,当出现对服务器的后

继请求时,keepalive-timeout功能可避免建立或重新建立连接。

client_header_buffer_size 4k;

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个

请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为

分页大小。分页大小可以用命令getconf PAGESIZE取得。

open_file_cache max=102400 inactive=20s;

这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开

文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

open_file_cache_valid 30s;

这个是指多长时间检查一次缓存的有效信息。

open_file_cache_min_uses 1;

open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这

个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive

时间内一次没被使用,它将被移除。

2) Linux内核参数优化:

net.ipv4.tcp_max_tw_buckets = 10000

timewait的数量,默认是180000。

net.ipv4.ip_local_port_range = 1024 65000

允许系统打开的端口范围。

net.ipv4.tcp_tw_recycle = 1

启用timewait快速回收。

net.ipv4.tcp_tw_reuse = 1

开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。

net.ipv4.tcp_syncookies = 1

开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。

Nginx常用配置参数有upstream,主要用于均衡后端多个实例:

Nginx 的upstream目前支持5种算法分配方式:

1) 轮询(默认rr)

每个请求按时间顺序逐一分配到后端不同的服务器,如果后端某台服务器down掉,自动剔除,待恢复自动添加上。

2) Weight权重

指定轮询权重,权重越高,处理的请求就越多,weight和访问比率成正比,用于后端服务器性能不均的情况。

3) ip_hash

每个请求根据访问的IP的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,一般用于登录会话。

4) fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。  

5) url_hash(第三方)

upstream的 fail_timeout和max_fails参数是用来判断负载均衡upstream中的某个server是否失效。

在fail_timeout的时间内,nignx与upstream中某个server的连接尝试失败了max_fails次,则nginx会认为该server已经失效。在接下来的 fail_timeout时间内,nginx不再将请求分发给失效的server。

例如在nginx.conf里面配置如下的tdt_app均衡:

upstream tdt_app {

    server   10.10.1.11:8080 weight=1 max_fails=2 fail_timeout=30s;

    server   10.10.1.12:8080 weight=1 max_fails=2 fail_timeout=30s;

}

Tdt_app均衡两台后端JAVA服务,在30秒内nginx会与后端的某个server通信检测,如果检测连接失败2次,则Nginx会认为该server已经失效,然后踢出转发列表,然后在接下来的30s内,nginx不再讲请求转发给失效的server。

另外,fail_timeout设置的时间对响应时间没影响,这个响应时间是用proxy_connect_timeout和proxy_read_timeout来控制的。

proxy_connect_timeout : Nginx与后端服务器连接的超时时间,发起握手等候响应超时时间。

proxy_read_timeout:连接成功后_等候后端服务器响应时间,其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)。

proxy_send_timeout :后端服务器数据回传时间,在规定时间之内后端服务器必须传完所有的数据。

keepalive_timout:一个http产生的tcp连接在传送完最后一个响应后,还需要等待多少秒后,才关闭这个连接。

11. Nginx Rewrite规则详解一

Rewrite规则含义就是某个URL重写成特定的URL,从某种意义上说为了美观或者对搜索引擎友好,提高收录量及排名等。

Rewrite规则的最后一项参数为flag标记,支持的flag标记主要有以下几种:  

1) last :相当于Apache里的(L)标记,表示完成rewrite;

2) break;本条规则匹配完成后,终止匹配,不再匹配后面的规则  

3) redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址  

4) permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址  

5) last和break用来实现URL重写,浏览器地址栏URL地址不变。  

 

a) 例如用户访问www.test.com,想直接跳转到网站下面的某个页面,www.test.com/new.index.html如何来实现呢?

我们可以使用Nginx Rewrite 来实现这个需求,具体如下:

在server中加入如下语句即可:

rewrite  ^/$  http://www.test.com/index01.html  permanent;

*代表前面0或更多个字符

+代表前面1或更多个字符

?代表前面0或1个字符

^代表字符串的开始位置

$代表字符串结束的位置

。为通配符,代表任何字符

b) 例如多个域名跳转到同一个域名,nginx rewrite规则写法如下:

server

{

listen 80;

server_name www.wugk.com wugk.com;

if ($host != ‘www.wugk.com’ ) {

rewrite ^/(.*)$  http://www.wugk.com/$1  permanent;

}

更多深入的rewrite可以继续学习。

12. 构建Nginx均衡LAMP高性能服务器

LNAMP(Linux+Nginx+Apache+Mysql+PHP)架构受到很多IT企业的青睐,取代了原来认为很好的LNMP(Linux+Nginx+Mysql+PHP)架构,那我们说LNAMP到底有什么优点呢,还得从Nginx和apache的优缺点说起。

Nginx处理静态文件能力很强,Apache处理动态文件很强而且很稳定,把二者综合在一块,性能提升很多倍。可能很多Linux SA在从事LNMP运维中,会发现PHP(FastCGI)模式会出现一些502错误的现象,这是因为Nginx+PHP(FastCGI)组合不稳定的原因造成的。

Ø 源码安装LNAMP之Nginx

yum install prce-devel –y ;cd  /usr/src ;wget http://nginx.org/download/nginx-1.6.0.tar.gz  ;cd nginx-1.6.0 ;./configure –prefix=/usr/local/nginx && make &&make install

Ø 源码安装LNAMP之Apache

yum install apr-devel apr-util-devel –y;

cd  /usr/src ; wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.27.tar.gz ;tar xzf  httpd-2.2.27.tar.gz ;cd httpd-2.2.27 ;./configure --prefix=/usr/local/apache --enable-so --enable-rewrite &&make &&make install

Ø 源码安装LNAMP之MySQL

cd /usr/src ;wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.63.tar.gz ;tar xzf mysql-5.1.63.tar.gz ;cd mysql-5.1.63 ;./configure  --prefix=/usr/local/mysql --enable-assembler &&make &&make install

配置Mysql服务为系统服务:

cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf

cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld

chkconfig --add mysqld 
chkconfig --level 345 mysqld on

 

cd /usr/local/mysql

useradd mysql
chown -R  mysql.mysql /usr/local/mysql 
/usr/local/mysql/bin/mysql_install_db --user=mysql  
chown -R mysql  var 
/usr/local/mysql/bin/mysqld_safe --user=mysql &

Ø 源码安装LNAMP之PHP

cd /usr/src ;wget http://mirrors.sohu.com/php/php-5.3.28.tar.bz2 ;tar jxf  php-5.3.28.tar.bz2 ;cd php-5.3.28 ;./configure --prefix=/usr/local/php5 --with-config-file-path=/usr/local/php/etc   --with-apxs2=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql/

 

Ø 源码安装Apache+PHP整合

整合apache+php环境,修改httpd.conf配置文件,然后加入如下语句:

LoadModule     php5_module modules/libphp5.so (默认已存在)

AddType     application/x-httpd-php .php

DirectoryIndex  index.php index.html (把index.php加入index.html之前)

然后在/usr/local/apache/htdocs目录下创建index.php测试页面,执行如下命令:

cat >>/usr/local/apache/htdocs/index.php <<EOF

<?php

phpinfo();

?>

EOF

重新启动apache服务,通过IP访问界面如下图,即代表LAMP环境搭建成功。

 

Ø 源码安装DISCUZ论坛

下载discuz源码包文件,然后解压:

cd  /usr/src ;wget http://download.comsenz.com/DiscuzX/3.1/Discuz_X3.1_SC_UTF8.zip 

解压discuz程序包:unzip Discuz_X3.1_SC_UTF8.zip -d /usr/local/apache/htdocs/

重命名程序文件:cd /usr/local/apache/htdocs/ ;mv upload/* .

赋予discuz目录完全访问权限:cd /usr/local/apache/htdocs/ ;chmod 777 -R data/ uc_server/ config/ uc_client/

然后访问IP安装discuz论坛,如下图,选择“我同意”

 

 进入如下界面,数据库安装,如果不存在则需要新建数据库并授权。

 

数据库创建及授权命令如下:

create database discuz charset=utf8;

grant all on discuz.* to root@'localhost' identified by "123456";

 

点击下一步,直至安装完成,进入等待已久的论坛画面:

 

自此LAMP环境整合并搭建成功,那如何使用Nginx来整合LAMP呢?

Ø 源码安装Nginx+LAMP整合

先修改apache访问端口为8080,Nginx端口为80。

然后修改nginx配置文件: vi /usr/local/nginx/conf/nginx.conf,server配置段内容如下:

(定义upstream均衡模块,配置动静分离,动态转发至apache,静态文件直接本地响应)

upstream app_lamp {

    server   127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;

    }

    server {

        listen       80;

        server_name  localhost;

 

        location / {

            root   /usr/local/apache/htdocs;

            index  index.php index.html index.htm;

        }

        location ~ .*\.(php|jsp|cgi)?$

    {

         proxy_set_header Host  $host;

         proxy_set_header X-Real-IP $remote_addr;

         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

         proxy_pass http://app_lamp;

    }

        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$

       {

        root  /usr/local/apache/htdocs;

        expires      3d;

      }

    }

测试,访问nginx ip+port如下图所示:

 

 查看系统启动的端口及进程如下图:

 

自此,LNAMP全部整合完毕,接下来就是对系统内核、各个服务、架构进行优化,同样优化是一项长期的任务。

13. Nginx日志分析及脚本编写

在我们日常的运维中,当Nginx服务器正常运行后,我们会经常密切关注Nginx访问日志的相关情况,发现有异常的日志信息需要进行及时处理。

那今天我将跟大家一起来研究和分析Nginx日志,nginx默认日志路径为:/usr/local/nginx/logs/access.log 和error.log文件。如下图查看nginx日志:cat access.log |more

 

Nginx日志的格式一般在nginx.conf里面配置,常见的格式配置如下:

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;

格式说明:

$remote_addr, $http_x_forwarded_for 记录客户端IP地址

$remote_user 记录客户端用户名称

$request 记录请求的URL和HTTP协议

$status 记录请求状态

$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。

$bytes_sent 发送给客户端的总字节数。

$connection_requests 当前通过一个连接获得的请求数量。

$http_referer 记录从哪个页面链接访问过来的

$http_user_agent 记录客户端浏览器相关信息

$request_length 请求的长度(包括请求行,请求头和请求正文)。

$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。

Nginx日志分析需求:

1) 分析截止目前为止访问量最高的IP排行。

awk '{print $1}' /usr/local/nginx/logs/access.log|sort |uniq -c |sort -nr |head -20

2) 分析从早上9点至中午12点总的访问量。

 

3) 分析上一秒的访问请求数。

 

4) 找到当前日志中502或者404错误的页面并统计。

awk '{print $0}' /usr/local/nginx/logs/access.log|egrep "404|502"|awk '{print $1,$7,$9}'|more

通过编写脚本实现自动分析Nginx异常访问并加入防火墙:

1) 首先要判断什么是恶意访问呢?

我们可以定义为每秒请求一个URL超过20次的IP都可以封掉哦。

#!/bin/sh

 

14. Nginx日志切割案例讲解

Nginx 是一个非常轻量的 Web 服务器,体积小、性能高、速度快等诸多优点。但不足的是也存在缺点,比如在产生的访问日志文件一直就是一个,不会自动地进行切割,如果访问量很大的话,将会导致日志文件容量非常大,不便于管理。当然了,我们也不希望看到这么庞大的一个访问日志文件,那需要手动对这个文件进行切割。

如果访问日志非常大,不便于我们每天查看相关的网站异常日志。

在 Linux 平台上 Shell 脚本丰富,使用 Shell 脚本加 crontab 命令能非常方便地进行切割。

今天我将跟大家一起来写一个企业环境中使用的Nginx自动切换脚本。

脚本的功能,就是定时切割日志,这里切割的方法我们直接使用mv即可。

直接上脚本内容如下:

#!/bin/bash

#auto mv nginx log shell

#by author wugk

S_LOG=/usr/local/nginx/logs/access.log

D_LOG=/data/backup/`date +%Y%m%d`

echo -e "\033[32mPlease wait start cut shell scripts...\033[1m"

sleep 2

if [ ! -d $D_LOG ];then

 

        mkdir -p  $D_LOG

fi

 

mv $S_LOG  $D_LOG

 

kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

 

echo "-------------------------------------------"

echo "The Nginx log Cutting Successfully!"

echo "You can access backup nginx log $D_LOG/access.log files."

执行如下图:

 

最后在crontab中添加如下代码即可,每天晚上自动去切割日志:

0 0  * * *

/bin/sh /data/sh/auto_nginx_log.sh  >>/tmp/nginx_cut.log 2>&1

15. Nginx防盗链配置案例配置

防盗链的含义:网站内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。

这样的话,我们会看到每天访问量很大,占用很多不必要的带宽,浪费资源,所以我们需要做一些限制。

防盗链其实就是采用服务器端编程,通过url过滤技术实现的防止盗链的软件。

比如http://chinaapp.wugk2.com/download/keepalived.conf 这个下载地址,如果没有装防盗链,别人就能轻而易举的在他的网站上引用这个地址。

防盗链的定义此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的

小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。

Nginx server+防盗链配置如下:

server {

        listen       80;

        server_name  localhost  www.wugk2.com;

        location / {

            root   html/b;

            index  index.html index.htm;

        }

        location ~* \.(gif|jpg|png|swf|flv)$ {

                valid_referers none blocked  *.wugk2.com;

                root   html/b;

        if ($invalid_referer) {

                #rewrite ^/ http://www.wugk2.com/403.html;

                return 403;

                }

        }

 

    }

第一行:gif|jpg|png|swf|flv表示对gif、jpg、png、swf、flv后缀的文件实行防盗链

第二行:wugk2.com  表示对wugk2.com这个来路进行判断

if{}里面内容的意思是,如果来路不是指定来路就跳转到错误页面,当然直接返回403也是可以。

或者如下设置也可以:

location ~* \.(gif|jpg|png|swf|flv)$

 

if ($host !=’*.wugk2.com’) {

return 403;

}

防盗链测试:

找一台测试机器,新建如下html页面,代码如下:

<html>

<h1>TEST Nginx PNG</h1>

<img src="http://www.wugk2.com/test.png">

</html>

然后在本地配置hosts 指向182.92.188.163 www.wugk2.com 即可。

然后访问如下图即代表Nginx防盗链配置成功:

 

16. Nginx运维日常故障解决方案

 

17. Nginx均衡TCP协议服务器案例

Nginx在企业运维中通常用来均衡HTTP协议,例如我们熟知的80、8080、8081等服务。因为大部分的服务都是http请求访问协议,那有时候需要用到TCP协议,如果来实现均衡呢?

默认nginx不支持tcp的负载均衡,需要打补丁,(连接方式:从客户端收到一个连接,将从本地新建一个连接发起到后端服务器。)

接下来正式配置Nginx均衡TCP:

wget http://nginx.org/download/nginx-1.6.2.tar.gz 

wget https://github.com/yaoweibin/nginx_tcp_proxy_module/archive/master.zip 

源码主页: https://github.com/yaoweibin/nginx_tcp_proxy_module

分别下载两个软件包,然后unzip master.zip解压后如下图:

 

tar xvf nginx-1.6.2.tar.gz

cd nginx-1.6.2

patch -p1 </root/nginx_tcp_proxy_module-master/tcp.patch

./configure  --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/nginx_tcp_proxy_module-master

 make

 make install

编译完成后,如下图:(有TCP模块参数)

 

在nginx.conf配置http段之前添加:

tcp {

        upstream cluster {

            #simple round-robin

            server 192.168.33.10:1234;

            server 192.168.33.10:2345;

            check  interval=3000  rise=2  fall=5  timeout=1000;

        }

        server {

            listen 8888;

            proxy_pass cluster;

        }

    }

如上配置之后,访问nginx 8888端口,默认会将请求转发到后端1234 和2345请求。

18. 构建企业级Nginx+Keepalived集群架构

随着Nginx在国内的发展潮流,越来越多的互联网公司都在使用Nginx。

Nginx高性能、稳定性成为IT人士青睐的http和反向代理服务器,今天我们来实战构建Nginx+Keepalived高可用架构配置,如下为网络架构图:

 

 

 

一、环境准备:

 

系统环境:CentOS 6.5 x86_64

Nginx版本:nginx v1.6.2

Keepalived版本:keepalived v1.2.1

Nginx-1:192.168.33.8 (Master)

Nginx-2:192.168.33.10 (Backup)

 

二、Nginx安装配置:

分别在两台服务器安装Nginx、keepalived,如下:

yum install -y pcre-devel   安装perl 兼容的正规表达式库

tar -xzf nginx-1.6.2.tar.gz && cd nginx-1.6.2 ; sed -i -e 's/1.6.2//g' -e 's/nginx\//TDTWS/g' -e 's/"NGINX"/"TDTWS"/g' src/core/nginx.h &&./configure --prefix=/usr/local/nginx --user=www --group=www  --with-http_stub_status_module --with-http_ssl_module

 

三、Keepalived安装配置:

 

tar -xzvf keepalived-1.2.1.tar.gz &&cd keepalived-1.2.1 && ./configure && make && make install

DIR=/usr/local/ ;cp $DIR/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/ ; cp $DIR/etc/sysconfig/keepalived /etc/sysconfig/

mkdir -p /etc/keepalived ; cp $DIR/sbin/keepalived /usr/sbin/

 

Nginx、Keepalived软件安装完毕,接下来进行详细配置。

 

四、配置Keepalived:

 

两台服务器端keepalived.conf内容都为如下,都设置为backup,不抢占,注意修改备用机优先级不同:

! Configuration File for keepalived

 

 global_defs {

 

  notification_email {

 

      wgkgood@163.com

 

 }

 

    notification_email_from wgkgood@163.com

 

    smtp_server 127.0.0.1

 

    smtp_connect_timeout 30

 

    router_id LVS_DEVEL

 

 }

 

 vrrp_script chk_nginx {

 

    script "/data/sh/check_nginx.sh"

 

    interval 2

 

    weight 2

 

 }

 

 # VIP1

 

 vrrp_instance VI_1 {

 

     state BACKUP

 

     interface eth0

 

     lvs_sync_daemon_inteface eth0

 

     virtual_router_id 151

 

     priority 100

 

     advert_int 5

 

     nopreempt

 

     authentication {

 

         auth_typePASS

 

         auth_pass  1111

 

     }

 

     virtual_ipaddress {

 

         192.168.33.188

 

     }

 

     track_script {

 

     chk_nginx

 

    }

 

 }

如上配置,我们需要自己建立check_nginx脚本,以方便检查本地Nginx是否存活更好的切换。Check_nginx.sh脚本内容如下:

#!/bin/bash

 

#auto check nginx  process

 

#2012-10-16 wugk

 

 killall  -0   nginx

 

 if

 

 [[ $? -ne 0 ]];then

 

 /etc/init.d/keepalived stop

 

 fi

五、Nginx 配置:

在两台Nginx服务器分别新建index.html测试页面,然后启动Nginx服务测试。

访问VIP http://192.168.33.188能出现界面即可。

19. 企业Nginx+Keepalived双主架构案例实战

通过上一次课程的学习,我们知道Nginx+keepalived主从配置,始终有一台服务器处于空余状态,那如何更好的利用起来呢,我们需要借助Nginx+keepalived双主架构来实现,如下图通过改装后的网络架构图;

 

直接master1上keepalived.conf配置文件内容:

! Configuration File for keepalived

 

 global_defs {

 

  notification_email {

 

      wgkgood@163.com

 

 }

 

    notification_email_from wgkgood@163.com

 

    smtp_server 127.0.0.1

 

    smtp_connect_timeout 30

 

    router_id LVS_DEVEL

 

 }

 

 vrrp_script chk_nginx {

 

    script "/data/sh/check_nginx.sh"

 

    interval 2

 

    weight 2

 

 }

 

 # VIP1

 

 vrrp_instance VI_1 {

 

     state MASTER

 

     interface eth0

 

     lvs_sync_daemon_inteface eth0

 

     virtual_router_id 151

 

     priority 100

 

     advert_int 5

 

     nopreempt

 

     authentication {

 

         auth_typePASS

 

         auth_pass  1111

 

     }

 

     virtual_ipaddress {

 

         192.168.33.188

 

     }

 

     track_script {

 

     chk_nginx

 

    }

 

 }

# VIP2

 

 vrrp_instance VI_2 {

 

     state BACKUP

 

     interface eth0

 

     lvs_sync_daemon_inteface eth0

 

     virtual_router_id 152

 

     priority  90

 

     advert_int 5

 

     nopreempt

 

     authentication {

 

         auth_typePASS

 

         auth_pass  2222

 

     }

 

     virtual_ipaddress {

 

         192.168.33.199

 

     }

 

     track_script {

 

     chk_nginx

 

    }

 

 }

在另外一台服务器33.10上同样配置,只需要把相应的state对改就OK,把原先的master改成backup,把backup改成master即可,然后在两台服务器分别启动keepalived服务即可,然后访问两个VIP即可。如下粘贴一下master2配置文件内容:

! Configuration File for keepalived

 

 global_defs {

 

  notification_email {

 

      wgkgood@163.com

 

 }

 

    notification_email_from wgkgood@163.com

 

    smtp_server 127.0.0.1

 

    smtp_connect_timeout 30

 

    router_id LVS_DEVEL

 

 }

 

 vrrp_script chk_nginx {

 

    script "/data/sh/check_nginx.sh"

 

    interval 2

 

    weight 2

 

 }

 

 # VIP1

 

 vrrp_instance VI_1 {

 

     state BACKUP

 

     interface eth0

 

     lvs_sync_daemon_inteface eth0

 

     virtual_router_id 151

 

     priority 90

 

     advert_int 5

 

     nopreempt

 

     authentication {

 

         auth_typePASS

 

         auth_pass  1111

 

     }

 

     virtual_ipaddress {

 

         192.168.33.188

 

     }

 

     track_script {

 

     chk_nginx

 

    }

 

 }

# VIP2

 

 vrrp_instance VI_2 {

 

     state MASTER

 

     interface eth0

 

     lvs_sync_daemon_inteface eth0

 

     virtual_router_id 152

 

     priority  100

 

     advert_int 5

 

     nopreempt

 

     authentication {

 

         auth_typePASS

 

         auth_pass  2222

 

     }

 

     virtual_ipaddress {

 

         192.168.33.199

 

     }

 

     track_script {

 

     chk_nginx

 

    }

 

 }

 

最后需要在两台Nginx主服务器上配置/data/sh/check_nginx.sh脚本,内容如下:

#!/bin/bash

#auto check nginx  process

killall  -0   nginx

if

[[ $? -ne 0 ]];then

 

/etc/init.d/keepalived stop

fi

如下图情况,两个VIP在一台服务器,是由于另外一台服务器down机,VIP都漂移到本机网卡下。

 

双主在企业实施中需要注意的地方:

1、配置文件必须设置不同的VRRP名称,同时优先级和VIP设置也同样需要注意。

2、网站总访问量为两台Nginx之和,可以写脚本实现。

3、两个VIP存在后,外网如果需要访问,需要做域名映射到两个VIP上即可。

4、这样就是基于DNS负载均衡模式。

5、需要配置监控实时监控VIP访问状态是否正常。

 

转载于:https://my.oschina.net/u/2281285/blog/758663

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值