高性能高可用(3)NGINX

1.安装

1.1准备依赖包

1.1.1pcre
--下载
cd /usr/local/src
wget https://ftp.pcre.org/pub/pcre/pcre-8.32.tar.gz

--解压
tar -zxvf pcre-8.32.tar.gz
cd pcre-8.32
./configure
make
make install
--链接nginx所需的so
cd /lib64
ln -s libpcre.so.0.0.1 libpcre.so.1

1.2安装

下载安装包

cd /usr/local/src
wget http://nginx.org/download/nginx-1.10.3.tar.gz

解压

tar -zxvf nginx-1.10.3.tar.gz

配置并检查,设置安装位置为/usr/local/nginx,不指定prefix,则可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc

./configure --prefix=/usr/local/nginx

如提示安装依赖包如PCRE,见上一节

安装

make && make install

1.3服务设置

创建服务文件

touch /etc/rc.d/init.d/nginx

将以下内容写入到该文件,文件需要在linux环境下编辑

#!/bin/sh  
# chkconfig: 2345 85 15  
# Startup script for the nginx Web Server  
# description: nginx is a World Wide Web server.   
# It is used to serve HTML files and CGI.  
# processname: nginx  
# pidfile: /usr/local/nginx/logs/nginx.pid  
# config: /usr/local/nginx/conf/nginx.conf  

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin  
DESC="nginx deamon"  
NAME=nginx  
DAEMON=/usr/local/nginx/sbin/$NAME  
SCRIPTNAME=/etc/init.d/$NAME  

test -x $DAEMON || exit 0  

d_start(){  
  $DAEMON || echo -n "already running"  
}  

d_stop(){  
  $DAEMON -s quit || echo -n "not running"  
}  


d_reload(){  
  $DAEMON -s reload || echo -n "can not reload"  
}  

case "$1" in  
start)  
  echo -n "Starting $DESC: $NAME"  
  d_start  
  echo "."  
;;  
stop)  
  echo -n "Stopping $DESC: $NAME"  
  d_stop  
  echo "."  
;;  
reload)  
  echo -n "Reloading $DESC conf..."  
  d_reload  
  echo "reload ."  
;;  
restart)  
  echo -n "Restarting $DESC: $NAME"  
  d_stop  
  sleep 2  
  d_start  
  echo "."  
;;  
*)  
  echo "Usage: $ScRIPTNAME {start|stop|reload|restart}" >&2  
  exit 3  
;;  
esac  

exit 0

设置执行权限

chmod +x /etc/init.d/nginx

添加系统服务

chkconfig --add nginx

设置为开机启动

chkconfig nginx on

1.4运行

service nginx start  #启动服务
service nginx stop    #停止服务
service nginx restart  #重启服务
service nginx reload  #重新读取配置文件

nginx正常运行后,会启动N个进程,其中一个是父进程,负责监控其子进程。其他的是工作进程

默认日志存放在系统日志:/usr/local/nginx/logs下

2、配置

配置文件位于/usr/local/nginx/conf/nginx.conf

2.1进程配置

worker_processes
  • 配置工作进程数量,一般不超过CPU数量
  • 示例:

    worker_processes 2
error_log
  • 配置错误日志位置及日志级别(debug|info|notice|warn|error|crit)
  • 示例: error_log logs/error.log info;
pid
  • 配置主进程的进程ID记录文件位置
  • 示例:

    pid logs/nginx.pid;
worker_connections
  • 配置每个工作进程的最大并发连接数
  • Nginx总的最大并发连接数为worker_processes* worker_connections。如果Nginx作为反向代理将动态请求转发给Tomcat等,这部分的最大并发连接数为 worker_processes* worker_connections/4
  • 示例:

    worker_connections 2048

2.2日志配置

access_log
  • 作用:设置日志文件位置及输出方式
  • 语法:
    • 普通日志:access_log path [format [buffer=size [flush=time]] [if=condition]];
    • Gzip压缩日志:access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
    • 关闭日志:access_log off;
  • 示例:

    access_log logs/access.log  main buffer=5k flush=1m

    表示日志文件输出在logs/access.log,使用main格式,日志输出缓存为5k,最大输出时间为1分钟

log_format
  • 作用:配置日志格式
  • 语法:log_format name string …;
  • 示例:

    log_format  main  '$request_time,"$request",$body_bytes_sent';

    日志格式名为main,输出请求处理时间、请求地址、响应数据量
    格式参数包括

参数含义
remoteaddr, http_x_forwarded_for记录客户端IP地址
$remote_user记录客户端用户名称
$request记录请求的URL和HTTP协议
$status记录请求状态
$body_bytes_sent发送给客户端的字节数,不包括响应头的大小;
$bytes_sent发送给客户端的总字节数。
$connection连接的序列号。
$connection_requests当前通过一个连接获得的请求数量。
$msec日志写入时间。单位为秒,精度是毫秒。
$pipe如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer记录从哪个页面链接访问过来的
$http_user_agent记录客户端浏览器相关信息
$request_length请求的长度(包括请求行,请求头和请求正文)。
$request_time请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601ISO8601标准格式下的本地时间。
$time_local通用日志格式下的本地时间。
性能监控技巧
  1. 性能测试时,可以将log作如下配置

    log_format  main  '$request_time,"$request",$body_bytes_sent';
             access_log logs/access.log  main;

    以上配置将处理时间、请求url等信息记录到logs/access.log文件中,并按照csv格式以“,”分割。

  2. 可在MySQL中建立一张表,表字段对应记录的字段,使用Navicat for MySQL的导入向导使用csv格式将数据导入到表中
  3. 使用SQL预计统计分析,找出处理时间长需要优化的请求

2.3文件传输配置

sendfile
  • 作用:配置是否启用sendfile,sendfile一般能够提升文件读性能
  • 语法:sendfile on|off
  • 示例:

    sendfile on
gzip
  • 作用:配置是否启用压缩
  • 语法: gzip on|off
gzip_min_length
  • 作用:配置启用gzip的最小文件大小
gzip_types
  • 作用:配置gzip的MIME类型
  • 示例:
gzip  on;
gzip_min_length 1024;
gzip_types text/plain text/css application/x-javascript application/javascript;

2.4服务器配置

#语法规则: location [=|~|~|^~] /uri/ { … }
#= 开头表示精确匹配
#^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
#~ 开头表示区分大小写的正则匹配
#~*开头表示不区分大小写的正则匹配
#!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
#/ 通用匹配,任何请求都会匹配到。

server {
         #监听80端口
          listen       80;
location = / {
    #A: 只匹配 / 查询。
    root "../tomcat1/webapps/";
}
location / {
    #B: 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
    [ configuration B ]
}
location ^~ /images/ {
    #C: 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
    [ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
    #D: 匹配任何已 gif、jpg 或 jpeg 结尾的请求。
    [ configuration D ]
}
}

示例:

/ #请求匹配A
/documents/document.html #匹配B
/images/1.gif #匹配C
/documents/1.jpg #匹配D

2.5反向代理

upstream

定义后台处理服务器tomcat ,支持集群服务器

server

定义nginx的http服务,并指定使用定义的tomcat作为代理转发目的地

注:需要在tomcat的server.xml文件中配置Connector属性proxyPort=“80”(nginx监听端口),防止redirect操作出现问题

定义服务器,支持集群

upstream tomcat{
    server 127.0.0.1:81;
    server 127.0.0.1:82;
} 
server {
        listen       80;
        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #使用upstream定义的服务器处理
            proxy_pass  http://tomcat/;
        }
}

或者

upstream tomcat{
    least_conn;
    server 10.0.0.1:80 weight=3 max_fails=1 fail_timeout=10s;
    server 10.0.0.2:80 max_fails=1 fail_timeout=10s;
    server 10.0.0.3:80 backup; server 10.0.0.4:80 down;
}
集群调度机制参数方式特点
轮询默认将请求轮流发送到各台服务器
IP Haship_hash将同一IP一直发送到一台服务器避免了集群Session问题
最少连接机制least_conn将请求发送到连接最少的服务器最优的集群性能
weight 比重

以上文配置为例,每4次请求,平均有3次访问服务器1,1次访问服务器2(受IP Hash、最少连接机制影响略有不同)

健康检测
  • 出现了max_fails次失败后,在fail_timeout时间内,不访问该后端服务器,超过该时间可再次进行健康检测;
  • 当服务器1、2全部宕机时,标记为backup的第三台机器开始接收请求;
  • 标记为down的服务器表示服务器不可用于处理请求。

2.6WebSocket支持

默认后端服务器60s内未发送数据Nginx将会关闭连接,可通过proxy_read_timeout增大时间或者后端服务器使用心跳机制

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
    server {
        ...
        location /chat/ {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }
}

2.7完整配置示例

#user  nobody;
worker_processes  2;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    #使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue,window下不指定
    #use epoll;  

    #允许最大连接数  
    worker_connections  2048;
}


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

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

    #access_log  logs/access.log  main;
    access_log logs/access.log  main;


    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    gzip  on;
    gzip_min_length      1024;
    gzip_types         text/plain text/css application/x-javascript application/javascript;

    #定义服务器,支持集群
    upstream tomcat {
        #在fail_timeout时间内出现了max_fails次失败后,不访问该后端服务器,超过该时间可再次访闿
        #server 127.0.0.1:81 max_fails=1 fail_timeout=10s;
        #server 127.0.0.1:82 max_fails=1 fail_timeout=10s;
        server 127.0.0.1:81;
    } 

    server {
        listen       80;
        server_name  tomcat;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #语法规则_location [=|~|~|^~] /uri/ { ?}
        #= 开头表示精确匹酿
        #^~ 开头表示uri以某个常规字符串开头,理解为匹酿url路径即可。nginx不对url做编码,因此请求丿static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)?
        #~ 开头表示区分大小写的正则匹酿
        #~ 开头表示不区分大小写的正则匹配
        #!~咿~*分别为区分大小写不匹配及不区分大小写不匹酿的正刿
        #/ 通用匹配,任何请求都会匹配到?

        #处理静态文仿
        location ~ \.(js|css|png|jpg|jpeg|gif|ico|xml|swz|swf|svg)$ {  
            root "../Tomcat/webapps/";  
        }

        #处理所有非静态文仿
        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #确定在何种情况下请求将转发到下一个服务器,值包括[error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off] 
            proxy_next_upstream error timeout invalid_header;
            proxy_connect_timeout 40s;
            proxy_read_timeout 40s;
            proxy_send_timeout 40s;
            #使用upstream定义的服务器处理
            proxy_pass  http://tomcat/;
            #使用upstream服务器时,必须添加proxy_set_header设置请求主机地址,否则请求地址将变丿http://tomcat/1.jpg而不是http://192.168.1.22/1.jpg
            #root   html;
            #index  index.html index.htm;
        }

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #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_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值