Day 50 Nginx 常用模块

1.1 Nginx目录索引

    当用户访问 http://game.oldboy.com/ 直接访问我们的游戏

    当用户访问 http://game.oldboy.com/centos 跳转到我们centos的目录

1.1.1 如果开启了目录的索引

    上传的文件,只看该文件的修改时间。

    如果本地创建,则和服务器时间进行保持。

1.1.2 具体的例子

    autoindex on;

    开启目录索引

    autoindex_exact_size off;

    默认为on 显示出文件的确切大小,单位是bytes

    修改为off,显示出文件的大概大小,单位是kB或者MB或者GB

    autoindex_localtime on;

    默认为off,显示的文件时间为GMT时间。

    修改为on 显示的文件时间为文件的服务器时间。

    charset utf-8,gbk;

    默认中文目录乱码,添加上解决乱码。

[root@web01 centos]# cat /etc/nginx/conf.d/oldboy_game.conf

server {

    listen 80;

    server_name game.oldboy.com;

    charset utf-8,gbk;

 

    location / {

       root /oldboy_code;

       index index.html;

    }

 

    location /centos {

       autoindex on;

       autoindex_localtime on;

       autoindex_exact_size off;

       root /oldboy_code;

    }

}

 

1.2 Nginx状态监控

    当前的活跃连接

    TCP连接数

    HTTP请求数

Active connections: 2

server accepts handled requests

 4 4 61

Reading: 0 Writing: 1 Waiting: 1

 

Active connections    # 当前活动的连接数

accepts   4           # 当前的总连接数TCP

handled   4           # 成功的连接数TCP

requests 61           # 总的http请求数

一次TCP的连接,可以发起多次http的请求(长连接状态)

 

keepalive_timeout  0;   # 类似于关闭长连接

keepalive_timeout  65;  # 65s没有活动则断开连接

    location /nginx_status {

       stub_status;

    }

 

1.3 Nginx访问控制

1.3.1 基于IP地址

    //允许配置语法

    Syntax: allow address | CIDR | unix: | all;

    Default:    —

    Context:    http, server, location, limit_except

    //拒绝配置语法

    Syntax: deny address | CIDR | unix: | all;

    Default:    —

    Context:    http, server, location, limit_except

    1.访问控制配置示例, 拒绝指定的IP, 其他全部允许

       deny 10.0.0.1/32;

       allow all;

 

    2.访问控制配置示例, 只允许谁能访问, 其它全部拒绝

        allow 127.0.0.1;

        deny all;

 

1.3.2 基于用户密码

//配置语法

Syntax: auth_basic string| off;

Default:    auth_basic off;

Context:    http, server, location, limit_except

 

//用户密码记录配置文件

Syntax: auth_basic_user_file file;

Default:    -

Context:    http, server, location, limit_except

 

1.安装hhtpd-tools,需要使用到htpaaswd这个命令生成密码

[root@web01 conf.d]# yum install httpd-tools -y

[root@web01 conf.d]# htpasswd -b -c /etc/nginx/auth_conf bgx xuliangwei

2.加入需要做认证的location模块

    auth_basic "Gun Dan!!!!";

    auth_basic_user_file /etc/nginx/auth_conf;

3.参考fj.xuliangwei.com

location / {

    root /code;                                 # 指定网站代码存放的位置

    autoindex on;                                                # 开启目录索引

    autoindex_localtime on;                                   # 开启本地服务器的时间

    autoindex_exact_size off;                                # 以人性化方式显示文件大小

    access_log off;                                              # 关闭访问日志

    auth_basic "Permission denied";                      # 基础认证的描述信息

    auth_basic_user_file /etc/nginx/auth_conf; # 基础认证密码文件位置(验证)

}

1.4 Nginx访问限制

    基于TCP连接数限制(不准)

    基于http请求数限制 1s 30http

HTTP请求建立在一次TCP连接基础上,一次TCP连接至少产生一次HTTP请求(还可以产生多次)

//Nginx连接限制语法

Syntax:  limit_conn_zone key zone=name:size;

Default: —

Context: http

Syntax: limit_conn zone number;

Default: —

Context: http, server, location

 

#1.定义连接限制

http{

limit_conn_zone $binary_remote_addr zone=conn_kt:10M;

}

 

#2.调用连接的限制

server {

    limit_conn_zone conn_kt 1;

}

# 3.注意是否开启了长连接,因为开启长连接可能后面的刷新都是http的请求

 

//Nginx请求限制语法

Syntax:  limit_req_zone key zone=name:size rate=rate;

Default: —

Context: http

Syntax: limit_conn zone number [burst=number] [nodelay];

Default: —

Context: http, server, location

//具体配置如下:

http {

//http段配置请求限制, rate限制速率,限制一秒钟最多一个IP请求

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

    ...

    server {

    ... 

 

        location / {

        //1r/s只接收一个请求,其余请求拒绝处理并返回错误码给客户端

            limit_req zone=req_zone;

        //请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量, 多余的请求返回503

            #limit_req zone=req_zone burst=3 nodelay;

        }

 

连接限制没有请求限制有效?

    我们前面说过, 多个请求可以建立在一次的TCP连接之上, 那么我们对请求的精度限制,当然比对一个连接的限制会更加的有效。

    因为同一时刻只允许一个连接请求进入。

    但是同一时刻多个请求可以通过一个连接进入。

    所以请求限制才是比较优的解决方案。

1.4.1 nginx常用模块

    目录索引 autoindex

    状态监控 stub_status

    访问控制

        access/deny     #基于来源IP验证

        auth_basic      # 基于用户密码验证

    例子

        目录索引配置用户密码认证

        状态模块配置来源IP验证

    访问限制

        limit_conn_zone     #连接限制

        limit_req_zone      #请求限制

1.5 Nginx日志配置

    只要出错一定要日志!!!

    日志里面的每一列都是什么意思

1.5.1  log_format指令

# 配置语法: 包括: error.log access.log

Syntax: log_format name [escape=default|json] string ...;

Default: log_format combined "...";

Context: http

 

#默认Nginx定义日志语法

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

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

                     

10.0.0.1 - - [19/Sep/2018:08:44:02 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"

 

# Nginx日志格式允许包含的变量:

$remote_addr        # 记录客户端IP地址

$remote_user        # 记录客户端用户名

$time_local         # 记录通用的本地时间

$time_iso8601       # 记录ISO8601标准格式下的本地时间

$request            # 记录请求的方法以及请求的http协议

$status             # 记录请求状态码(用于定位错误信息)

$body_bytes_sent    # 发送给客户端的资源字节数,不包括响应头的大小

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

$msec               # 日志写入时间。单位为秒,精度是毫秒。

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

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

$http_x_forwarded_for #记录客户端IP地址

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

$request_time       # 请求花费的时间,单位为秒,精度毫秒

# :如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地址。

# $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,

# 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。

 

1.5.2 access_log指令

Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

access_log off;

Default: access_log logs/access.log combined;   #相对于nginx的安装目录/etc/nginx/logs

Context: http, server, location, if in location, limit_except

 

Example:

server {

    ...

    access_log /var/log/nginx/www.bgx.com.log;

    ...

  

1.6 Nginx虚拟主机(多Server标签)

    定义多个网站

    基于IP的多网站    (毫无卵用)

    基于端口的多网站   (一般)

基于域名的多网站    (最关键)

1.6.1 创建站点的目录

[root@web01 ~]# mkdir /oldboy_code2

[root@web01 ~]# echo "AVI" > /oldboy_code2/index.html

 

1.6.2 准备Nginx的配置文件

[root@web01 ~]# cat /etc/nginx/conf.d/oldboy_avi.conf

server {

    listen 80;

    server_name avi.oldboy.com;

 

    location / {

       root /oldboy_code2;

       index index.html;

    }

}

 

默认返回的页面

 index   index.html   #默认返回index.html 如果站点目录不存在index.html 则会报403

 

/code/                  # 根据定义默认反正index.html

                        # 如果希望访问oldboy.html,在域名后面跟上我们的路径/oldboy.html

    index.html

    oldboy.html

 

基于端口的多网站   (一般)

    1.如果网站都是使用不同的端口访问,那使用域名和不使用域名没有什么影响。

    注意:只在公司内部才会使用到。

   

1.7 Nginx Location

    控制网站的访问路径

    了解Location的优先级和匹配方式

一个server可以有多个location配置,但多个location配置的优先级又该如何划分

1.7.1   匹配符      匹配规则                     优先级

~                区分大小写的正则匹配              3

~*              不区分大小写的正则匹配              4

/                 通用匹配,任何请求都会匹配到         7

1.7.2 匹配符                   匹配规则                 优先级

=                       精确匹配                         1

^~                     以某个字符串开头                2

~                       区分大小写的正则匹配            3

~*                     不区分大小写的正则匹配           4

!~                       区分大小写不匹配的正则         5

!~*                     不区分大小写不匹配的正则         6

/                        通用匹配,任何请求都会匹配到       7

 

1.7.3 通用匹配,任何请求都会匹配到

location / {

 

}

 

1.7.4 严格区分大小写,匹配以.php结尾的都走这个location   

location ~ \.php$ {

    fastcgi_pass http://127.0.0.1:9000;

}

1.7.5 严格区分大小写,当用户访问/.zip结尾,统统全部拒绝

location ~ \.zip$ {

    deny  all;

}

 

1.7.6 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location

location ~* .*\.(jpg|gif|png|js|css)$ {

        root /code/xuliangwei;

        expires 7d;

        #rewrite (.*) http://cdn.xuliangwei.com$request_uri;

}

 

1.7.7 不区分大小写匹配

location ~* "\.(sql|bak|tgz|tar.gz|.git)$" {

        return 403 "启用访问控制成功";

}  

 

日志模块

虚拟主机(一台服务器运行多个网站)

location的匹配符

location的优先级

1.8 Nginx常见问题

    Server_name都配置IP会产生冲突,冲突后优先级是怎么回事?

    include 包含

    rootalias

    error_page