一、什么是Nginx

  Nginx (engine x) 是一个高性能的HTTP反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
  其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
                 ————百度百科

二、关于高性能网站分析

  对于高性能网站,请求量大,如何支撑?
   主要是减少请求
   1、对于开发人员–合并css,背景图片,减少mysql查询等
   2、对于运维,nginx的expires,利用浏览器缓存等,减少查询
   3、利用cdn来响应请求
   4、最终剩下的,不可避免的请求–服务器集群+负载均衡来支撑

四、Nginx优点

   1、工作在网络的7层之上,可以针对http应用做一些分流的策略
   2、Nginx对网络稳定性的依赖非常小,理论上ping通就就能进行负载功能
   3、可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS相对小些
   4、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器
 

五、Nginx安装

   1、下载相对应jar包:wget  http://nginx.org/download/nginx-1.14.0.tar.gz(目前为最新的稳定版本)
   2、安装:tar -zxvf nginx-1.14.0.tar.gz
   3、下载相对应的依赖:yum install pcre 、yum instatll pcre-devel 、 yum install zlib 、yum install zlib-devel
   4、进行configure配置:cd nginx-1.14.0 && ./configure –prefix=/usr/local/nginx
   5、编译安装:make && make install
   6、启动:默认安装到了/usr/local目录下,利用/nginx/sbin/nginx启动
  相关命令:
./nginx -s reload (重启)
./nginx-s stop (关闭)
./nginx-s reopen (重新打开日志文件)
./nginx -c filename (为nginx指定一个配置文件,来代替缺省的)
./nginx -t (不运行,仅仅测试配置文件语法正确性)
./nginx -v (显示nginx版本号)
   7、检验:利用ps -ef | grep nginx查看进程;通过浏览器输入http://localhost:80是否能进入nginx默认欢迎界面
  其中:localhost根据自己虚拟机IP设定;80端口为nginx默认端口号

 五、关于nginx配置文件

#user nobody;

#开启进程数 <=CPU数
worker_processes 1;

#错误日志保存位置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#进程号保存文件
#pid logs/nginx.pid;

#每个进程最大连接数(最大连接=连接数x进程数)每个worker允许同时产生多少个链接,默认1024
events {
worker_connections 1024;
}

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压缩
#gzip on;

server {
#监听端口,默认是80端口
listen 80;
#监听域名
server_name localhost;

#charset koi8-r;

#nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式)
#access_log logs/host.access.log main;

#如果没有location更明确的匹配访问路径的话,访问请求都会被该location处理。
location / {
#root指定nginx的根目录为/usr/local/nginx/html
root html;
#默认访问文件,欢迎页先去html目录下找index.html,如果找不到再去找index.htm
index index.html index.htm;
}

#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#

#错误页面及其返回地址,错误码为500、502、503、504都会返回50.html错误页面。
error_page 500 502 503 504 /50x.html;
#location后面是”=”的话,说明是精确匹配
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;
# }
#}

}

六、实战

 1、自定义域名跳转

   1) 在nginx.conf中配置server模块

#自定义
     server {
        listen      520 ;     #监听端口号
        server_name  yiling.com;  #自定义服务器域名
        location / {
            root   yiling.com;  #指定跳转资源所在目录,此目录相对于nginx根目录
            index  index.html index.htm;  #指定访问的默认资源,当没有指定资源时,就访问默认页面
        }
}

   2) 在nginx目录中新建一个文件夹命名为yiling.com文件夹,并新建一个index.html文件,自定义内容    

  3) 此时如果在window环境中访问域名yiling.com:520,会访问不到,因为window主机无法识别域名,需要在C:\Windows\System32\drivers\etc\目录下编辑hosts文件配置域名

192.168.174.128 yiling.com

  4) 访问域名,如果成功跳转指定页面显示内容,说明配置成功

 2、关于nginx日志文件

    在nginx配置文件中有记录日志的配置,默认情况下是屏蔽的,如果需要打印日志可以将它打开,日志文件是用来记录每次访问域名时记录访问的状态

  1) vim nginx.conf,将log_format注释去掉,此是记录日志的格式

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

  其中:main是指该日志全局配置名,当需要时只要引用其名即可;remote_addr 是指客户端地址;remote_user是指客户端用户名称;time_local是指访问时间和时区;request是指请求的URI和http协议;status是指http状态;body_bytes_sent是指发送客户端的内容;http_referer是指url跳转来源;http_user_agent是指用户终端浏览器等信息

  2) 引用日志

     server {
        listen      520 ;
        server_name  yiling.com;
        location / {
            root   yiling.com;
            index  index.html index.htm;
        }
           access_log  logs/yiling.access.log  main;//这里引用了main,每次访问指定域名时会在logs文件下自动生成yiling.access.log文件,文件名可以自定义
}

   3) 重启nginx

ps -ef | grep nginx -s reload

   4) 此时查看nginx/logs文件中会生成yiling.access.log文件

 tail -n 100 -f nginx/logs/yiling.access.log
#显示filename最后20行。把某个档案文件的最后几行显示到终端上

 3、nginx日志文件切割

    分析:每次访问nginx,都会生成日志,不定时清理会越来越大,此时需要配置日志文件切割

  1) nginx/sbin下新建一个log.sh文件,编写脚本文件

#/bin/sh
BASE_DIR=/usr/local/nginx      #脚本所在文件
BASE_FILE_NAME=yiling.com.access.log  #日志打印指定文件

CURRENT_PATH=$BASE_DIR/logs   #日志所在目录
BAK_PATH=$BASE_DIR/datalogs   #拷贝日志所在目录

CURRENT_FILE=$CURRENT_PATH/$BASE_FILE_NAME
BAK_TIME=`/bin/date -d yesterday +%Y%m%d%H%M`    //手动将昨天的日志进行备份
BAK_FILE=$BAK_PATH/$BAK_TIME-$BASE_FILE_NAME
echo $BAK_FILE
#备份之前先把nginx关闭
$BASE_DIR/sbin/nginx -s stop
#将生成的日志文件移动到usr/local/nginx/datalogs/时间-yiling.com.access.log
mv $CURRENT_FILE $BAK_FILE   #删除原来文件

 #重启nginx

 $BASE_DIR/sbin/nginx

 

  2) 给log.sh赋予权限

chmod 777 log.sh

  3) 写一个脚本定时执行脚本文件

#每天凌晨两点备份前一天的日志  
#* 2 * * * sh /usr/local/nginx/sbin/log.sh  
#为了测试方便,我们暂且设置成每分钟执行一次备份  
*/1 * * * * sh /usr/local/nginx/sbin/log.sh 

  4) 此时查看datalogs文件,会新备份的日志

 4、nginx_location配置

 1) 通过正则表达模糊匹配指定访问资源

  注意:/表示精确匹配;~表示正则匹配

 #自定义
     server {
        listen      520 ;
        server_name  yiling.com;
       #location / {
        location ~ test {     #~与test之间有空格
            root   yiling.com;
            index  index.html index.htm;   #注意当域名中指定访问文件,默认访问的资源将不被访问
        }
           access_log  logs/yiling.access.log  main;
}

  2) 在yiling.com文件夹下新建一个html文件,用于指定访问的资源,命名以test开头,如testfile.html

  3) 访问 http://yiling.com:520/testfile.html,即可访问到testfile.html文件内容

 5、模仿添加黑名单:当window主机访问指定资源时,跳转到401 

  1) 配置server模块 

#自定义
     server {
        listen      520 ;
        server_name  yiling.com;
       #location / {
        location ~ test {
           ##重写语法 if return(条件),这里是模仿添加黑名单
          if ($remote_addr = 192.168.174.1) { #这是nginx远程地址,非真实ip
                return 401;
            }
            root   yiling.com;
            index  index.html index.htm;
        }
           access_log  logs/yiling.access.log  main;
}

  2) 此时访问http://yiling.com:520/test123.html,因为匹配到的请求域名为指定黑名单域名,会报401

 6、重写URI请求

  可以通过使用rewrite指令在请求处理期间多次修改请求URI,该指令具有一个可选参数和两个必需参数。 第一个(必需)参数是请求URI必须匹配的正则表达式。 第二个参数是用于替换匹配URI的URI。 可选的第三个参数是可以停止进一步重写指令的处理或发送重定向(代码301302)的标志。

  模拟域名分析,通过指定的请求前缀跳转到指定的页面

  1) 配置server模块

#前缀名为goods
location /goods {
                ##进一步分析请求域名goods后面为1-5为数字,rewrite是对url进行重写,即重定向
                rewrite "goods-(\d{1,5})\.html" /goods-ctrl.html;
                root yiling.com;
                index index.html;
        }
           access_log  logs/yiling.access.log  main;
}

  2) 在yiling.com文件下创建goods-ctr.html,自定义内容

  3) 访问 http://yiling.com:520/goods-9110.html

 7、nginx反向代理

  相关知识点:

    nginx反向代理proxy与负载均衡upstream

    配置反向代理proxy:proxy_pass url地址

    配置负载均衡upstream :upstream

    注意:反向代理之后获取客户端IP地址为nginx服务器地址,这里需要nginx进行forward,设置真实IP地址

proxy_set_header X-real-ip $remote_addr;

  1) 配置nginx反向代理

   

  1.1) 配置反向代理,实现动静分离

  环境分析:当请求域名以.jsp结尾时,自动跳转到tomcat下指定的jsp中

  1.1.1)配置server模块

server {
        listen       80;
        server_name  localhost;
       #配置反向代理tomcat服务器;拦截.jsp结尾的请求转向到tomcat
       location ~ \.jsp$ {
            proxy_pass http://192.168.174.128:8080;
        }
           }

  1.1.2) tomcattomcat/webapps/ROOT目录下建立一个test.jsp

  <body>
            <h1>TestPage!!</h1>
              Nginx server ip: <%=request.getRemoteAddr()%>
          </body>
</html>

  1.1.3) 启动tomcat

  1.1.4) 此时访问域名:http://192.168.174.128:80/test.jsp,如果成功跳转到tomcat下的test.jsp,说明配置成功

      此时是先进入nginx服务器,通过正则匹配跳转到tomcat下 的test.jsp,返回的地址是nginx转发的地址

      若想返回请求地址,需要配置

     对于nginx.conf下server模块

 location ~ \.jsp$ {
       #设置客户端真实ip地址
        proxy_set_header x-real-ip $remote_addr;
        proxy_pass http://192.168.174.128:8080;
    }

     对于tomcat下的jsp

<h1>反向代理!</h1>
  Remote  ip: <%=request.getHeader("X-real-ip")%></br>
  Nginx server ip: <%=request.getRemoteAddr()%>
  </body>

  2) nginx负载均衡

    2.1) 配置nginx.conf下server模块

 #配置nginx负载均衡
    #weight分配权重(进入概率) max_fails:最大失败连接数:超过2次失效;fail_timeout:超时时间
    upstream myapp {
        server 192.168.174.130:8080 weight=1 max_fails=2 fail_timeout=30s;
        server 192.168.174.133:8080 weight=1 max_fails=2 fail_timeout=30s;
     }
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

       #access_log  logs/host.access.log  main;

        location / {
            proxy_set_header x-real-ip $remote_addr;
            proxy_pass http://myapp;
            root   html;
            index  index.html index.htm;
        }
}

    2.2) tomcat下的test.jsp拷贝到另一台linux centos环境中,利用scp命令

    [root@bogon ROOT]# scp test.jsp 192.168.174.133:/usr/java

    2.3) 开启两台tomcat

    2.4) 访问域名http://192.168.174.128/test.jsp ,如果每刷新一次,分别显示的两个不同的jsp,说明配置成功

七、关于nginx高可用值keepalived

  1、什么是高可用:

  通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。通俗的讲,就是当一台机器挂失后,会有一台后备机替代它运作,不影响整个系统工作。而nginx+keepalived+tomcat可实现负载均衡高可用。

  2、为什么要用keepalived

  

  环境分析:此时模拟用户请求经过nginx反向代理后选择指定的tomcat调用数据库抽取数据,确实实现负载均衡,降低了只有一台服务器时的压力,但是如果当这台唯一的nginx服务器挂失时,整个系统则会进入瘫痪状态。此时需要keepalived配置虚拟IP配合主备nginx实现高可用集群。

                       

  3、关于keepalived

    1、基于VRRP协议,路由器和操作系统层面上的协议,虚拟路由器动态转移IP

    2、需要配置:有主备(master/backup)两个角色,可以配置多种定期监控实现应用的高可用

    3、启动:keepalived命令直接自定配置文件启动,生产环境设置为自启动

  4、keepalived下载安装

     1) 下载相关组件  

     yum -y install openssl-devel 
     yum -y install libnl libnl-devel
     yum install -y libnfnetlink-devel

    2) 下载keepalived    

    [root@bogon java]#wget http://www.keepalived.org/software/keepalived-1.4.5.tar.gz

    3) 解压并安装

    [root@bogon java]#tar -xvf keepalived-1.4.4.tar.gz
    [root@bogon java]#cd keepalived-1.4.4  
    [root@bogon java]#./configure --prefix=/usr/local/keepalived --sysconf=/etc
    [root@bogon java]#make && make install

  5、实战  

   要实现nginx+keepalived+tomcat高可用负载均衡,需要以下环境需求

   两台tomcat、启动两台nginx、启动两台keepalived

   1)更改tomcat默认欢迎页,最好能够标识两台标识tomcat服务器所在网段

    2) 配置Master节点和BackUp的upstream和server模块,他们内容是一致的

http {
 upstream tomcat {
    server 192.168.174.133:8080 weight=1;
    server 192.168.43.128:8080 weight=1;
    }
 server {
        listen 80;
        location / {
              proxy_pass http://tomcat;

          proxy_set_header x-real-ip $remote_addr;

        }   
    }

    3) 配置keepalived脚本信息

     在Master节点和slave节点的/etc/keepalived目录下

    [root@localhost keepalived]# pwd
    /usr/local/keepalived/etc/keepalived

   1、新建监控脚本nginx_monitor,此脚本文件用来监控nginx状态,当nginx挂失,输出日志

    #!/bin/bash

    # shell脚本 如果nginx进程存在,则认为没有问题
    if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
      then
        # 输出日志
        echo "dongnao.tony#############no nginx" >> /var/log/messages
        exit 1
      else
        # 一切正常
        exit 0
    fi 

   2、分别在master和backup当前/usr/local/keepalived/etc/keepalived目录下建立keepalived主机配置和keepalived备机配置

       配置master与backup两个角色承当主与从,从的角色就是当主挂失后用来代替主的配置

            主机:keepalived-nginx-master.conf

      主要配置点为网卡接口配置和虚拟IP设置,其中网卡根据ifconfig进行查看,虚拟IP虽然自己设定,但是需要和自己网段保持一致

  # 定义一个名为nginx_monitor的脚本
  vrrp_script nginx_monitor {
       # 监控nginx的脚本存放地址
       script "/etc/keepalived/nginx_monitor.sh"
       # 每隔1秒执行一次
       interval 1
  }

  # 定义一个vrrp示例
  vrrp_instance VI_1 {
    state MASTER    #(主机为MASTER,备用机为BACKUP)
    interface enp0  #(HA监测网卡接口)

    virtual_router_id 61 #(主、备机的virtual_router_id必须相同)
    priority 90 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
    advert_int 1 #(VRRP Multicast广播周期秒数)

    track_script {
        nginx_monitor #(监控脚本名称)
    }
    virtual_ipaddress {
            192.168.174.127 #(VRRP HA虚拟IP)
    }
}

   备机:keepalived-nginx-backup.conf

  # 定义一个名为nginx_monitor的脚本
  vrrp_script nginx_monitor {
     # 监控nginx的脚本存放地址
     script "/etc/keepalived/nginx_monitor.sh"
     # 每隔1秒执行一次
     interval 1
  }

  # 定义一个vrrp示例
  vrrp_instance VI_1 {
    state MASTER    #(主机为MASTER,备用机为BACKUP)
    interface enp0  #(HA监测网卡接口)

    virtual_router_id 61 #(主、备机的virtual_router_id必须相同)
    priority 80 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
    advert_int 1 #(VRRP Multicast广播周期秒数)

    track_script {
        nginx_monitor #(监控脚本名称)
    }
    virtual_ipaddress {
            192.168.174.132 #(VRRP HA虚拟IP)
      }
  }

   3、执行监控脚本 

    [root@localhost keepalived]#./nginx_monitor.sh

   此时分别另外启动一台终端用来查看打印的日志信息

    tail -f /var/log/message   #-f是不断的输出message内的内容,类似于while(true)循环

   如果此时关闭nginx,便会打印出日志信息“dongnao.tony#############no nginx”

    4、启动keepalived

    # 启动master主机
    /usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived-nginx-master.conf
    # 启动backup备机
    /usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived-nginx-backup.conf

  5、检验

     此时可以通过虚拟IP分别访问到当对应的tomcat,如果主机挂失,并不会影响到访问,因为此时访问到的是备机

八、关于nginx优化

  关于优化问题,除了对于硬件上的要求,其他就是开发者对软件合理应用调配了,nginx优化无非就是对其配置文件nginx.conf进行配置。

      1、worker_process

   其定义了nginx对外提供了web服务时的worder进程数,将其设置为可用的CPU内核数可达到优化的目的

   2、worker_connect

   其是events模块的,其设置是可由有一个worker进程同时打开的最大连接数,其设置视情况而定,可偏高,但是不建议设置的过高

  3、sendfile

  可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效

  4、tcp_nopush 

  默认情况下是关闭的。此设置是指定一个数据 包里所有发送头文件,而不是一个个发送

 5、error_log

 设置nginx是否将存储访问日志。关闭可让读取磁盘IO操作更快

 6、keepalive_timeout

  给客户端分配keep-alive连接超时时间。默认是关闭的。如果使用它最好设置低点

 7、gzip

  告诉nginx采用gzip压缩形式发送。默认关闭。开启能减少发送的数据量

 

  

 

  

 

 

 

  

       

 

 

   

 

 

 

 

  

 

 

版权声明:本文为cailijia52o原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cailijia52o/p/9115716.html