Nginx web服务

一.  Nginx网站服务软件

1. Nginx的优势:高性能web和反向代理服务器

1)作为web服务器:消耗内存小,实现高并发

2)作为负载均衡器:在内部可以直接支持PHP和Rails,也可支持作为HTTP代理服务器对外进行服务,用C语言编写,不论是系统资源开销还是CPU使用率都快(C语言写的代码速度都快)

3)作为邮件代理服务器:最早也是实现该功能

2. 比较

相对于Apache:Nginx实现了异步非阻塞的epoll模型,Apache采用select多路复用(单个线程通过记录跟踪每个sock的状态来同时管理多个I/O流,来提高服务器的吞吐能力)

3. Nginx服务说明

① Nginx启动之后启动一个主进程master和多个工作worker进程,主进程是用来负责加载配置文件以及服务的开启和关机以及分配调度下面的工作进程,worker进程是用来处理来自客户端的请求及响应

② 每进来一个请求都会有一个工作进程去处理,但不是全程的处理,处理到可能发生阻塞的地方,向如向上游服务器转发请求,并等待请求返回,该worker进程不会一直等着,而回处理其他的请求,从而实现异步,一旦上游服务器返回响应数据则会触发这个事件,该worker进程继续转发,这就是异步回调。

③ Nginx是模块化设计,包括核心和功能性模块,核心模块负责维持一个运行循环,执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。而其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器。

二. 部署方式

1. yum-安装 使用官方源 

mainline version : 主线版,开发版

stable version :最新稳定版(建议使用)

legacy version:一流的老版本的稳定版

nginx -v :查看nginx的版本信息

nginx -V:查看nginx安装的模块详细信息

2. 编译安装

1. 安装编译环境 gcc gcc-c++

2. 安装pcre软件包(使nginx支持http rewrite模块)

 yum install -y pcre pcre-devel

3、安装openssl-devel(使nginx支持ssl)加密

 yum install -y openssl openssl-devel

4、安装zlib

 yum install -y zlib zlib-devel

 5. 创建nginx用户

6. 安装nginx

 ./configure --prefix=/usr/local/nginx --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --with-stream
[root@localhost nginx-1.16.0]# make && make install

编译安装的参数:

--with-cc-opt='-g -O2 -fPIE -fstack-protector    //设置额外的参数将被添加到CFLAGS变量。(FreeBSD或者ubuntu使用)
--param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' 
--with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' 

--prefix=/usr/local/nginx                        //指向安装目录
--conf-path=/etc/nginx/nginx.conf                //指定配置文件
--http-log-path=/var/log/nginx/access.log        //指定访问日志
--error-log-path=/var/log/nginx/error.log        //指定错误日志
--lock-path=/var/lock/nginx.lock                 //指定lock文件
--pid-path=/run/nginx.pid                        //指定pid文件

--http-client-body-temp-path=/var/lib/nginx/body    //设定http客户端请求临时文件路径
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi     //设定http fastcgi临时文件路径
--http-proxy-temp-path=/var/lib/nginx/proxy         //设定http代理临时文件路径
--http-scgi-temp-path=/var/lib/nginx/scgi           //设定http scgi临时文件路径
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi         //设定http uwsgi临时文件路径

--with-debug                                        //启用debug日志
--with-pcre-jit                                     //编译PCRE包含“just-in-time compilation”
--with-ipv6                                         //启用ipv6支持
--with-http_ssl_module                              //启用ssl支持
--with-http_stub_status_module                      //获取nginx自上次启动以来的状态
--with-http_realip_module                 //允许从请求标头更改客户端的IP地址值,默认为关
--with-http_auth_request_module           //实现基于一个子请求的结果的客户端授权。如果该子请求返回的2xx响应代码,所述接入是允许的。如果它返回401或403中,访问被拒绝与相应的错误代码。由子请求返回的任何其他响应代码被认为是一个错误。
--with-http_addition_module               //作为一个输出过滤器,支持不完全缓冲,分部分响应请求
--with-http_dav_module                    //增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法 默认关闭,需编译开启
--with-http_geoip_module                  //使用预编译的MaxMind数据库解析客户端IP地址,得到变量值
--with-http_gunzip_module                 //它为不支持“gzip”编码方法的客户端解压具有“Content-Encoding: gzip”头的响应。
--with-http_gzip_static_module            //在线实时压缩输出数据流
--with-http_image_filter_module           //传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用到)
--with-http_spdy_module                   //SPDY可以缩短网页的加载时间
--with-http_sub_module                    //允许用一些其他文本替换nginx响应中的一些文本
--with-http_xslt_module                   //过滤转换XML请求
--with-mail                               //启用POP3/IMAP4/SMTP代理模块支持
--with-mail_ssl_module                    //启用ngx_mail_ssl_module支持启用外部模块支持

--with-stream            // 负载均衡模块。nginx从1.9.0开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等。

--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --
param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' 
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'     // CPU优化参数

===================================================================

三. Nginx web服务目录结构说明

rpm -ql nginx :查看nginx软件的相应文件

1. /etc/logrotate.d/nginx    日志轮转

2. /etc/nginx/nginx.conf    主配置文件

3. /etc/nginx/conf.d     子配置文件夹

4. /etc/nginx/fastcgi_params 动态网站模块-python,php所需的相关变量

5. /etc/nginx/mime.types    文件关联程序  nginx可加载的文件类型

作用:若是在文件中有的扩展名信息的资源,进行访问时则会直接看到数据信息

若是没有的扩展名悉尼行资源,进行访问的时候会直接下载资源

6. /etc/nginx/modules    模块文件夹(第三方模块)

7. /usr/lib/systemd/system/nginx.service  --- systemctl   服务脚本

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"

[Install]
WantedBy=multi-user.target

8. /var/log/nginx        :日志文件

     vim /etc/logrotate.conf
       # rotate log files weekly
       weekly                     --- 定义默认日志切割的周期
       # keep 4 weeks worth of backlogs
       rotate 4                   --- 定义只保留几个切割后的文件
       # create new (empty) log files after rotating old ones
       create                     --- 创建出一个相同的源文件
       # use date as a suffix of the rotated file
       dateext                    --- 定义角标(扩展名称信息)
       # uncomment this if you want your log files compressed
       #compress                  --- 是否对切割后的文件进行压缩处理
       # RPM packages drop log rotation information into this directory
       include /etc/logrotate.d   --- 加载包含/etc/logrotate.d/目录中文件配置

        minsize 1M             --- 最小大小为1M,小于1M不进行切割  

9. /usr/share/nginx/html  : 网站目录

四.  Nginx 配置文件说明

1. 配置文件结构组成:

① 全局/核心模块包括{event http} : 配置影响nginx全局的指令,一般有运行nginx服务器的用户组,nginx的进程pid存放的路径,日志的存放路径以及配置文件的一如,允许生成的worker process的数量

② 事件驱动模块event:配置影响nginx服务器或者与用户的网络连接数,有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网络连接等

③ http模块{server }:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

④ server{location}块:配置虚拟主机的相关参数,一个http中可以有多个server。

⑤ location块:配置请求的路由(匹配),以及各种页面的处理情况

2. 配置文件规范配置:

1. 针对不同的虚拟主机单独创建一个配置文件

2.主配置文件中包含多个虚拟主机的配置文件

五. Nginx多虚拟主机

1. Nginx 虚拟主机设置以及主机别名设置

虚拟主机:在一台服务器上实现多个网站

server {

server_name www.test.com test.com ;    ###基于域名访问和主机别名设置

}

server {

listen 10.0.0.1:80   ###基于指定的IP地址访问

}    ####nginx中涉及到IP地址的修改都必须重新启动服务才能生效,否则无效

server {

listen 8080   ###基于端口进行访问

}

2. server配置虚拟目录 

location /a {

   alias /usr/share/nginx/html/;     ###虚拟映射,若是访问的是/a目录则指的是/usr/share/nginx/html;

}

alias后面必须要用“/”结束,否则会找不到文件的,而root则可有可无

3. 网站页面访问原理

01. 将域名进行解析   www.oldboy.com  --- 10.0.0.7,解析成IP地址由客户端再次发出请求
02. 建立TCP的连接(四层协议) 传输层中会有目标端口,默认为80
        10.0.0.7   目标端口   8080
03. 根据应用层HTTP协议发出请求 ,发送给服务端
        请求报文: hosts: bbs.oldboy.com
04. 服务端读取配置文件进行匹配,若没有相同域名的server主机,会找满足端口要求的第一个主机
        显示主机的网站页面    (若域名不对端口满足即可,若有多个可匹配的选项默认按照顺序读取)

###若是出现403错误有两种情况:1.匹配到了内容,但是没有指定默认文件 2. 地址访问控制策略

###500错误 1:网站代码问题  2.文件权限问题

六. Nginx web服务模块说明

1. 目录索引功能

Nginx模块功能: ngx_http_autoindex_module
语法: Syntax:    autoindex on | off;
           Default:    
           autoindex off;
           Context:    http, server, location

做目录索引的时候需要在指定的server里面开启nginx站点目录索引功能

autoindex on; 

若该匹配规则下面指定了 index 默认文件则会访问默认文件,所以需将首页文件删除!

中文出现乱码,可在指定的server里面指定字符集 charset utf-8;

2.Nginx 网站状态信息监控(状态模块)

状态模块: ngx_http_stub_status_module      ###不需指定根路径即可
    location = /basic_status {
        stub_status;
    }

keepalived_timeout  65s

    Active connections:  激活的连接数信息  4000用户  3500
    accepts: 接收的连接数汇总(综合)  TCP
    handled: 处理的连接数汇总(综合)  TCP
    requests: 总计的请求数量  HTTP协议请求 
    Reading: nginx服务读取请求报文的数量    100人点餐
    Writing: nginx服务响应报文信息数量      100人响应
    Waiting: nginx队列机制,要处理(读取或者响应报文进行保存)   监控

############

HTTP请求报文或者响应报文中若请求头中的字段connection伪keepalived则为长连接若是closed则为短连接

3.Nginx日志信息功能

日志模块:ngx_http_log_module

访问日志: /var/log/nginx/access.log

log_format :定义记录的格式

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"';
access_log  /var/log/nginx/access.log  main;                                调用日志格式
    $remote_addr               显示用户访问源IP地址信息
    $remote_user            显示认证的用户名信息
    [$time_local]           显示访问网站时间
    "$request"              请求报文的请求行信息
    $status                 用户访问网站状态码信息
    $body_bytes_sent        显示响应的数据尺寸信息
    $http_referer           记录调用网站资源的连接地址信息(防止用户盗链)  

    $http_user_agent        记录用户使用什么客户端软件进行访问页面的  (谷歌 火狐 IE 安卓 iphone)
    $http_x_forwarded_for   负载均衡,记录真实请求的客户端IP地址 

###可以单独定义日志,在location里面单独定义,
access_log /var/log/nginx/mylog.log  main (单独定义了在默认的日志中就不记录了)

Nginx 预定义了名为 combined 日志格式,如果没有明确指定日志格式默认使用该格式

# 设置访问日志
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

# 关闭访问日志
access_log off; 

  • path 指定日志的存放位置。

  • format 指定日志的格式。默认使用预定义的combined

  • buffer 用来指定日志写入时的缓存大小。默认是64k。

  • gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。

  • flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。

  • if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。

例:access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m

指定日志的写入路径为/var/logs/nginx-access.log,日志格式使用默认的combined,指定日志的缓存大小为 32k,日志写入前启用 gzip 进行压缩,压缩比使用默认值 1,缓存数据有效时间为1分钟。

错误日志: /var/log/nginx/error.log  --- Core functionality
    Syntax:        error_log file [level];  指定错误日志路径以及错误日志记录的级别
    Default:    error_log logs/error.log error;
    Context:    main, http, mail, stream, server, location

error_log  /var/log/nginx/error.log warn;    只有该级别或者以上才会被记录在错误日志中
    错误级别:  (级别越低记录的越详细 )
    debug        :调试级别, 服务运行的状态信息和错误信息详细显示     信息越多
    info        :信息级别, 只显示重要的运行信息和错误信息
    notice      :通知级别: 更加重要的信息进行通知说明
    warn        :警告级别: 可能出现了一些错误信息,但不影响服务运行
    error        :错误级别: 服务运行已经出现了错误,需要进行纠正      推荐选择
    crit        :严重级别: 必须进行修改调整
    alert       :严重警告级别: 即警告,而且必须进行错误修改
    emerg       :灾难级别: 服务已经不能正常运行                      信息越少

open_log_file_cache 指令

每一条日志记录的写入都是先打开文件再写入记录,然后关闭日志文件。如果你的日志文件路径中使用了变量,如 access_log /var/logs/$host/nginx-access.log,为提高性能,可以使用open_log_file_cache指令设置日志文件描述符的缓存。

log_not_found 指令

是否在error_log中记录不存在(404)的错误。默认是

 log_not_found on | off;  #因为404不能说是服务端出现的问题,若是记在日志中则会显得日志非常大,在访问日志中记载
  默认值: 
  log_not_found on;

log_subrequest 指令

是否在access_log中记录子请求(衍生请求)的访问日志。默认不记录

4. nginx服务location作用

模块: ngx_http_core_module

location 匹配URI,是有顺序的,会被第一个匹配的location 处理

location详细配置:
    Syntax:    location [ = | ~ | ~* | ^~ ] uri { ... }
    location @name { ... }
    Default:    —
    Context:    server, location

 =    表示精确匹配,优先级也是最高的 
  ^~   表示uri以某个常规字符串开头,理解为匹配url路径即可 #区分大小写,无正则
  ~    表示区分大小写的正则匹配   包含该正则匹配的内容
  ~*   表示不区分大小写的正则匹配
  /    通用匹配,任何请求都会匹配到  ##类似于else,通用的匹配
  @    内部服务跳转   错误页面

location / {
        error_page 403 @error;     ###调用下面的error的匹配
        index index.html;  ##若发生错误出现403错误从而跳转到下面的页面
    }

location @error {

         return 404 404.html;

}

5. nginx页面跳转功能

rewrite模块跳转功能:  http_rewrite_module
    Syntax:    rewrite regex replacement [flag];   rewite  匹配的正则信息  替换成什么信息
    Default:    —
    Context:    server, location, if

rewrite重定向的好处:

1.伪静态化,能更被搜索引擎给录入,排名越高

2. 更安全,太多参数无疑造成信息泄露,可能会被黑客利用,造成一定的破坏,静态url带来更高安全性

3. 实现网站跳转以及端口之间的跳转

4. 使url看上去更加整洁,用户体验感更佳

### rewrite的优先级比 root的路径高,若两个同时出现则会进行跳转!!!

跳转方式:
    永久跳转:  permanent   301    会将跳转信息进行缓存
    临时跳转:  redirect    302    不会缓存跳转信息

添加301重定向后地址栏显示的是跳转之后的url,302 则显示原来的url,不会显示真实的url

跳转到本地的目录必须存在,否则不进行跳转!!!

若rewrite后面不写permanent则默认是302,临时重定向,浏览器显示源url

出现无限跳转如何解决:
    第一种方法: 利用不同server区块配置打破循环
    server {
       server_name  test.com;
       rewrite ^/(.*) http://www.test.com/$1 permanent;
    }
    第二种方法: 利用if判断实现打破循环
    if ($host ~* "^test.com$") {
      rewrite ^/(.*) http://www.test.com/$1 permanent;
    }

rewrite的相关指令:

1. if语句 (无else只有if)

if 可以支持如下条件判断匹配符号
~                     正则匹配 (区分大小写)
~*                     正则匹配 (不区分大小写)
!~                  正则不匹配 (区分大小写)
!~*                    正则不匹配  (不区分大小写)
-f 和!-f             用来判断是否存在文件
-d 和!-d             用来判断是否存在目录
-e 和!-e             用来判断是否存在文件或目录
-x 和!-x             用来判断文件是否可执行

2. rewrite 的flag 

1)last:相当于Apache里的[L]标记,表示完成rewrite。默认为last。(500:内部重定向次数过多)

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

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

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

3.rewrite的相关案例

# http://www.testpm.com/a/1.html ==> http://www.testpm.com/b/2.html

location /a {

root /html;

index 1.html;

rewrite .* /b/2.html permanent;

}

location /b {

root /html;

index 2.html;

}

# http://www.testpm.com/2019/a/1.html ==> http://www.testpm.com/2018/a/1.html

location /2019/a {

root /html;

index 1.html;

rewrite ^/2019(.*)$ /2018/$1 permanent;

}

# http://www.test.com/a/1.html ==> http://jd.com

location /a {

index 1.html;

if ($host ~* www.test.com) {

rewrite .* http://jd.com permanent;

}

}

# http://www.test.com/a/1.html ==> http://jd.com/a/1.html

location /a {

root /html;

rewrite .* http://jd.com$request_uri permanent;

}

# 在访问目录后添加/  (如果目录后已有/,则不加/)
生产中的需求!!!

location /a/b/c {

root /html;

if (-d $request_filename) {      ### 取得是最后一个文件名 类似于basename

rewrite ^(.*) ([^ /])$    http://$host$1$2/ permanent;

}

}

#  http://www.tianyun.com/login/tianyun.html ==>  http://www.tianyun.com/reg/login.html?user=tianyun (实现伪静态化)

location /login {

rewrite  ^/login/(.*).html  http://$host/reg/login.html?user=$1;

}

location /reg {

root /html;

index login.html;

}

# 生活中博客网站!!写文章的时候在后台存储创建相关的目录!

http://www.tianyun.com/test/11-22-33/1.html  ==>  http://www.tianyun.com/test/11/22/33/1.html

location /test {

 rewrite ^/test/([0-9]+)-([0-9]+)-([0-9]+)(.*)$  /test/$1/$2/$3$4 permanent;

}

4. return 指令 (用于返回状态码给客户端)

### 80转为443端口

server {
    listen       80;
    server_name  www.testpm.cn;
    access_log  /var/log/nginx/http_access.log  main;
    return 301 https://www.testpm.cn$request_uri;
}

server {
    listen 443 ssl;
    server_name www.testpm.cn;
    access_log  /var/log/nginx/https_access.log  main;
    #ssl on;
    ssl_certificate   /etc/nginx/cert/2447549_www.testpm.cn.pem;
    ssl_certificate_key  /etc/nginx/cert/2447549_www.testpm.cn.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;

   location / {
        root  /usr/share/nginx/html;
        index index.html index.htm;
    }
}

6. nginx 反向代理

集群?:完成相同任务或工作的一组服务器 (web01 web02 web03 -- web集群)

 集群的作用:高性能 高可用性 价格有效性 可伸缩性  

分布式?:将整个工作分布到各个服务完成,做自己负责的一部分

反向代理:代理服务端

正向代理:代理客户端

ngx_http_proxy_module       --- proxy_pass 反向代理

location / {
           proxy_pass http://oldboy;
        }

01. 访问不同的网站地址,不能显示不同的网站页面  (面试题)
  proxy_set_header Host $host;
02. 访问网站用户地址信息无法进行分析统计       (面试题)
  proxy_set_header X-Forwarded-For $remote_addr;
03. 访问负载均衡会出现错误页面,影响用户体验
  proxy_next_upstream error timeout http_404 http_502 http_403;

7. nginx 负载均衡

 负载均衡?
    1) 实现用户访问请求进行调度分配
    2) 实现用户访问压力分担

ngx_http_upstream_module   --- upstream   负载均衡

upstream oldboy {
       server 10.0.0.7:80;
       server 10.0.0.8:80;
       server 10.0.0.9:80;
    }
    server {
        listen       80;
        server_name  www.oldboy.com;
        location / {
           proxy_pass http://oldboy;
        }
    }

若有upstream模块则一定有proxy模块,反之则不一定

调度算法:

1. 轮询分配请求(平均)

2. 权重分配请求(能力越强责任越重) weight =2 ,加权轮询

3. ip_hash (出现反复登陆的情况)

访问的IP会进行hash运算,给指定的主机分配,若是值相同,则将请求发送给之前的主机

热备功能:backup (只有当其他主机服务不能运行时才会代替工作)

定义最大失败次数                     健康检查参数
max_fails=5
定义失败之后重发的间隔时间            健康检查参数
fail_timeout=10s  会给失败的服务器一次机会 (是尝试完最大失败次数之后再给的休息时间)

七. Nginx web服务安全访问控制

1. 基于IP 

1. 基于IP:

访问模块:ngx_http_access_module

 deny  10.0.0.0/24;
 allow 172.16.1.0/24;

2. 基于身份认证(用户密码)

nginx认证模块: ngx_http_auth_basic_module
举例配置: 
      location / {
         auth_basic           "closed site";    --- 开启认证功能
         auth_basic_user_file conf/htpasswd;    --- 加载用户密码文件,相对路径/etc/nginx
  }

htpasswd :Apache程序的依赖包的功能,可实现加密

htpasswd -b :免交互输入密码用户信息 htpasswd -bc password test01 123456

-c :创建一个新的密码文件

-m: md5的加密算法

-D:删除指定用户

八. Nginx web服务访问流量控制

1.基于用户访问连接数量(建立TCP连接)

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;  

##定义一个限制策略     二进制客户端IP地址 (省空间,速度快)  

zone=定义域策略名字  

10m:能够存储IP的空间为10M,1M存16000的IP;

rate=10/s :每秒中10次(1秒1000毫秒,精确到1次多少毫秒,每100毫秒可以访问一次) 12r/m(每分钟12次)  ---出现503错误是因为每次需要5秒一次请求

 location /login {
                        limit_req zone=mylimit burst=20;

}

从一个给定IP地址发送21个请求,Nginx会立即将第一个请求发送到上游服务器群,然后将余下20个请求放在队列中。然后每100毫秒转发一个排队的请求,只有当传入请求使队列中排队的请求数超过20时,Nginx才会向客户端返回503。burst的值为20,队列中的请求20个

无延迟排队

location /login {
                        limit_req zone=mylimit burst=20 nodelay;
                        proxy_pass http://myweb;

}

### burst队列,值为容纳的队列的数量,除了第一个请求之后将后续请求放入队列中,按照限制的速率去访问,---该好处是不会出现503报错信息,但是用户体验度降低
### 无延迟参数 nodelay是进行无延迟请求,将burst队列中的所有请求同时都处理,若burst是20,则前21个请求都是正常的,剩下的请求会被做限制!!!如果前面的请求还没完成,则进来的请求会出现503错误
### nodelay参数允许请求在排队的时候就立即被处理,也就是说只要请求能够进入burst队列,就会立即被后台worker处理

白名单:

 geo $limit {     ### 如果进来的IP是下面的网段limit则为0,不是则默认为1
    default         1;
    10.0.0.0/24         0;
    192.168.0.0/24         0;
    }
    map $limit $limit_key {    ### map 对应映射,limit为1的话则该IP$bina...会变成二进制IP会被做限制!!!
    0 "";
    1 $binary_remote_addr;
    }
    limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;

2. 基于用户访问请求信息(HTTP请求)

九.Nginx动静分离

实现网站集群动静分离
    01. 提高网站服务安全性
    02. 管理操作工作简化
    03. 可以换分不同人员管理不同集群服务器

1) 根据用户访问的uri信息进行负载均衡

2)根据用户访问的终端信息显示不同页面

server {
        listen       80;
        server_name  www.oldboy.com;
        location / {
           if ($http_user_agent ~* iphone) {
              proxy_pass http://mobile;
           }
           if ($http_user_agent ~* Chrome) {
             proxy_pass  http://web;
           }
           proxy_pass http://default;
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $remote_addr;
           proxy_next_upstream error timeout http_404 http_502 http_403;
        }
    }

十. Nginx 系统优化

LNMP部署

1. 服务介绍及原理

1. PHP服务的作用:

    1)处理动态的页面请求
    2)负责和数据库建立关系

2. Nginx作用:

处理用户的静态请求 html jpg txt mp4/avi

3. Mysql作用:

存储用户的字符串数据信息

################### 原理

用户通过访问网站的动态资源请求Nginx,Nginx通过fastcgi_pass (网络接口)通过fastcgi交给PHP-fpm软件交给wrapper处理请求,通过php解析器转为SQL语句读取或写入数据到MySQL中

2. 安装PHP

   第一个历程: 更新yum源/卸载系统自带的PHP软件
    yum remove php-mysql php php-fpm php-common
    rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
    
    第二个历程: 安装php软件
    yum install -y php71w php71w-cli php71w-common php71w-devel php71w-embedded  php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache  php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
    
    第三个历程: 编写配置文件
    vim /etc/php-fpm.d/www.conf
    user = www   nginx---www
    group = www
    PS: 保证nginx进程的管理用户和php服务进程的管理用户保持一致
    
    第四个历程: 启动php服务
    systemctl start php-fpm 

3.  服务之间建立关系

1. nginx + php 建立关系

 location ~ \.php$ {
                root /www;
                fastcgi_index index.php;          url               uri
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;   ####加载其中的域名和URI,
                fastcgi_pass  127.0.0.1:9000;   ##发送给本地的9000端口服务
                include fastcgi_params;   变量配置文件
       }

2. 实现php和MySQL关系

编写php代码文件
       [root@web01 blog]# vim test_mysql.php
       <?php
        $servername = "localhost";
        $username = "root";
        $password = "oldboy123";
        //$link_id=mysql_connect('主机名','用户','密码');
        //mysql -u用户 -p密码 -h 主机
        $conn = mysqli_connect($servername, $username, $password);
        if ($conn) {
              echo "mysql successful by root !\n";
           }else{
              die("Connection failed: " . mysqli_connect_error());
           }
       ?>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值