• WEB服务-Nginx之3-配置文件和虚拟主机和日志管理


    WEB服务-Nginx之3-配置文件和虚拟主机和日志管理

    Nginx目录结构

    nginx编译安装目录结构

    [root@web01 ~]# ll /apps/nginx/
    total 0
    drwx------ 2 nginx root   6 Sep 10 15:40 client_body_temp
    drwxr-xr-x 2 root  root 333 Sep 10 15:45 conf
    drwx------ 2 nginx root   6 Sep 10 15:40 fastcgi_temp
    drwxr-xr-x 2 root  root  40 Sep 10 15:38 html              # 测试页
    drwxr-xr-x 2 root  root  58 Sep 10 22:32 logs
    drwx------ 2 nginx root   6 Sep 10 15:40 proxy_temp
    drwxr-xr-x 2 root  root  19 Sep 10 15:38 sbin              # 主程序
    drwx------ 2 nginx root   6 Sep 10 15:40 scgi_temp
    drwx------ 2 nginx root   6 Sep 10 15:40 uwsgi_temp
    
    [root@web01 ~]# ll /apps/nginx/sbin/
    total 7596
    -rwxr-xr-x 1 root root 7774216 Sep 10 15:38 nginx          # 程序文件
    
    [root@web01 ~]# ll /apps/nginx/html/
    total 8
    -rw-r--r-- 1 root root 494 Sep 10 15:38 50x.html
    -rw-r--r-- 1 root root 612 Sep 10 15:38 index.html         # 默认测试网页
    

    nginx官方源安装目录结构

    [root@web01 ~]# ll /usr/sbin/nginx
    -rwxr-xr-x 1 root root 1342640 Apr 21 23:07 /usr/sbin/nginx # 程序文件
    
    [root@web01 ~]# ll /usr/share/nginx/html/
    total 8
    -rw-r--r-- 1 root root 494 Apr 21 23:07 50x.html
    -rw-r--r-- 1 root root 612 Apr 21 23:07 index.html          # 默认测试网页
    
    nginx                不带参默认为启动nginx
         -t             测试nginx语法错误
         -c filename    指定配置文件(default: /etc/nginx/nginx.conf)
         -s signal      发送信号给master进程,signal:stop, quit, reopen, reload
         -g directives  从配置文件中设置全局指令
    示例:
    nginx -s stop        # 停止nginx
    nginx -s reload      # 加载配置文件
    

    Nginx配置文件

    使用rpm -ql nginx查看Nginx整体的目录结构及对应的功能,如下表格整理了Nginx比较重要的配置文件

    1. Nginx主配置文件
    路径 类型 作用
    /etc/nginx/nginx.conf 配置文件 nginx主配置文件
    /etc/nginx/conf.d/default.conf 配置文件 默认网站配置文件
    1. Nginx子配置文件
    路径 类型 作用
    /etc/nginx/conf.d/* 配置文件 网站配置文件
    1. Nginx代理相关参数文件
    路径 类型 作用
    /etc/nginx/fastcgi_params 配置文件 Fastcgi代理配置文件
    /etc/nginx/scgi_params 配置文件 scgi代理配置文件
    /etc/nginx/uwsgi_params 配置文件 uwsgi代理配置文件
    1. Nginx编码相关配置文件
    路径 类型 作用
    /etc/nginx/win-utf 配置文件 Nginx编码转换映射文件
    /etc/nginx/koi-utf 配置文件 Nginx编码转换映射文件
    /etc/nginx/koi-win 配置文件 Nginx编码转换映射文件
    /etc/nginx/mime.types 配置文件 Content-Type与扩展名
    1. Nginx管理相关命令
    路径 类型 作用
    /usr/sbin/nginx 命令 Nginx命令行管理终端工具
    /usr/sbin/nginx-debug 命令 Nginx命令行与终端调试工具
    1. Nginx日志相关目录与文件
    路径 类型 作用
    /var/log/nginx 目录 Nginx默认存放日志目录
    /etc/logrotate.d/nginx 配置文件 Nginx默认的日志切割

    配置文件配置语法:directive value [value2 ...];

    注意:

    1. 指令必须以分号结尾
    2. 支持使用配置变量
    • 内建变量:由Nginx模块引入,可直接引用
    • 自定义变量:由用户使用set命令定义

    帮助文档

    http://nginx.org/en/docs/

    http://tengine.taobao.org/nginx_docs/cn/docs/

    https://cloud.tencent.com/developer/doc/1158


    Nginx主配置文件

    Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束。

    Nginx主配置文件整体分为三块,分别是CoreModule(核心模块)EventModule(事件驱动模块)HttpCoreModule(http内核模块)

    CoreModule(核心模块)

    user nginx;           # Nginx进程所使用的用户,若组不指定,默认和用户名同名
    worker_processes 1;   # Nginx运行的work进程数量(建议与CPU数量一致或auto)
    error_log /var/log/nginx/error.log warn;  # Nginx错误日志文件存放路径及其级别,可设定为debug,需要编译时使用“--with-debug”选项
    pid       /var/run/nginx.pid;             # Nginx服务运行后产生的pid进程号
    master_process on;    # 是否启动工作进程,默认on;off,将不启动worker
    daemon on;            # 是否以守护进程方式运行,默认on;off,即以前台方式运行。用于调试或docker环境。
    

    EventModule(事件驱动模块)

    events {            
        worker_connections 25535; # 每个worker进程支持的最大连接数(建议改为25535),不能大于系统限制的进程能打开的文件数量上限
        use epoll;                # 指定并发连接请求的处理方法:事件驱动模型, 默认epoll
        accept_mutex on;          # 处理新的连接请求的方法:on则由各个worker轮流处理新请求,Off则每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊群”,影响性能,默认值为off,优化为on。
        multi_accept on;          # off则一个worker进程只能一次接受一个新的网络连接, on则每个woker进程同时接受多个新网络连接,默认值是off,可以优化为on。
    }
    

    HttpCoreModule(http内核模块)

    # http层开始
    http {
    # 服务器包含资源类型的配置文件,MIME是网络资源的媒体类型,有HTML/GIF/XML/Flash等类型
        include       /etc/nginx/mime.types;
    # 默认以下载方式传输给浏览器(前提是该资源在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  /var/log/nginx/access.log  main;
    # 高效文件传输
        sendfile        on;
    # 搭配sendfile使用
        #tcp_nopush     on;
    # 长连接超时时间
        keepalive_timeout  65;
    # 是否开启压缩
        #gzip  on;
    
        # 使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机)
        server {
            listen       80;            # 监听端口, 默认80
            server_name  oldboy.com;    # 提供的域名
            access_log  access.log;     # 该网站的访问日志
            # 控制网站访问路径
            location / {
                root   /usr/share/nginx/html;   # 存放网站源代码的位置
                index  index.html index.htm;    # 默认返回网站的文件
            }
        }
        ...
        # 第二个虚拟主机配置
        server {
        ...
        }
    # 包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件
        include /etc/nginx/conf.d/.conf;
    # http层结束
    }
    

    http{}层下允许有多个Server{}层,一个Server{}层下又允许有多个Location

    • http{} 标签主要用来解决用户的请求与响应。
    • server{} 标签主要用来响应具体的某一个网站。
    • location{} 标签主要用于匹配网站具体URL路径。

    MIME参考文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types

    server_name后可跟多个由空白字符分隔的字符串,匹配优先级机制从高到低

    (1) 字符串精确匹配  如:www.magedu.com
    (2) 左侧*通配符    如:*.magedu.com
    (3) 右侧*通配符    如:www.magedu.*
    (4) 正则表达式     如: ~^.*.magedud+.com$   # d 表示 [0-9]
    (5) default_server
    

    主配置文件其他区块

    MailModule(mail模块)默认情况下未构建此模块,应使用--with-mail配置参数启用它。

    StreamModule(stream模块)默认情况下未构建此模块,自1.9.0版开始可用,应使用--with-stream 配置参数启用它 。


    Nginx内建全局变量

    $args : 这个变量等于请求URI中的参数,同$query_string
    $content_length : 请求头中的Content-length字段。
    $content_type : 请求头中的Content-Type字段。
    $cookie_name : 表示key为 name 的cookie值
    $document_root : 当前请求在root指令中指定的系统根目录,如/apps/nginx/html/
    $document_uri : 与$uri相同。
    $host : 请求主机头字段,否则为服务器名称。
    $http_user_agent : 客户端agent信息(浏览器的详细信息)
    $http_cookie : 客户端cookie信息
    $limit_rate : 显示nginx服务器限制的连接速率。没有设置,则显示0。
    $query_string :http://www.baidu.com/index.do?id=090&partner=search中的id=090&partner=search
    $request_body_file ;nginx做反向代理时发给后端服务器的本地资源的名称
    $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成的文件绝对路径。
    $request_method : 客户端请求的动作,通常为GET/POST/PUT/DELETE等。
    $request_uri : 包含请求参数的原始URI,不包含主机名,如:index.do?id=090&partner=search。
    $remote_addr : 客户端IP地址。
    $remote_port : 客户端端口。
    $remote_user : 已经经过Auth Basic Module验证的用户名。
    $scheme : 协议(如ftp,http,https)。
    $server_protocol : 服务器协议,通常是HTTP/1.0或HTTP/1.1。
    $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
    $server_name : 服务器主机名
    $server_port : 服务器端口
    $uri : 不包含请求参数的当前URI,$uri不包含主机名,如”/core/index.do”。
    

    Nginx自定义变量

    ngx_http_rewrite_module用于使用PCRE正则表达式更改请求URI,返回重定向并有条件地选择配置。


    • 定义变量:set variable value;

      Syntax:	    set $variable value;
      Default:	—
      Context:	server, location, if
      
    • 引用变量:$variable_name

    示例:

    set $name magedu;
    echo $name;
    set $my_port $server_port;
    echo $my_port;
    echo "$server_name:$server_port";
    

    Nginx网站配置

    1. 新增nginx配置文件
    [root@web01 conf.d]# cat /etc/nginx/conf.d/game.conf 
    server {
        listen 80;
        server_name game.oldboy.com;
     
        location / {
            root /code;
            index index.html;
        }
    }
    
    1. 将游戏源代码文件放至nginx配置文件root指定的目录
    [root@web01 conf.d]# mkdir /code && cd /code
    [root@web01 code]# rz html5.zip
    [root@web01 code]# unzip html5.zip
    [root@web01 code]# ls
    ceshi  game  html5.zip  img  index.html  readme.txt
    
    1. 检查nginx配置文件的语法是否存在错误
    [root@web01 code]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
    1. 重载Nginx
    [root@web01 code]# systemctl reload nginx
    
    1. 设置客户机hosts
    MacBook-Pro:~ oldboy$ sudo vim /etc/hosts
    10.0.0.7 game.oldboy.com
    
    1. 检测是否设置成功
    MacBook-Pro:~ oldboy$ ping game.oldboy.com
    PING game.oldboy.com (10.0.0.7): 56 data bytes
    64 bytes from 10.0.0.7: icmp_seq=0 ttl=64 time=0.267 ms
    64 bytes from 10.0.0.7: icmp_seq=1 ttl=64 time=0.450 ms
    64 bytes from 10.0.0.7: icmp_seq=2 ttl=64 time=0.508 ms
    
    1. 浏览器检测

    打开浏览器访问:http://game.oldboy.com

    img

    Nginx虚拟主机

    通常在企业中可能会有很多业务系统,那么多套业务服务如何使用Nginx配置?

    img

    如果使用如上方式部署,则需要多台服务器配置Nginx,但如果使用虚拟主机方式,则在同一个Nginx上运行多套单独服务,这些服务是相互独立的。简单来说,看似多套业务系统,实则可以运行在一台Nginx服务上。

    img


    Nginx配置虚拟主机有如下三种方式:

    方式一、基于多IP方式

    方式二、基于多端口方式

    方式三、基于多域名方式(多个hosts名称方式)


    基于多IP方式

    img

    基于多IP方式,有如下两种方式:

    img

    具体配置如下:

    1. 配置多网卡多IP的方式
    server {
        ...
        listen 10.0.0.10:80;
        ...
    }
     
    server {
        ...
        listen 10.0.0.11:80;
        ...
    }
    
    1. 配置单网卡多IP的方式
    # 给网卡添加一个IP
    [root@web01 ~]# ip addr add 10.0.0.11/24 dev eth0
    
    # 虚拟主机配置
    server {
        ...
        listen 10.0.0.10:80;
        ...
    }
    
    server {
        ...
        listen 10.0.0.11:80;
        ...
    }
    

    基于多端口方式

    img

    具体配置如下:

    # 仅修改listen监听端口即可, 但不能和系统端口出现冲突
    server {
        ...
        listen 80;
        ...
    }
    
    server {
        ...
        listen 81;
        ...
    }
    
    server {
        ...
        listen 82;
        ...
    }
    

    基于多域名方式

    img

    具体配置如下:

    1. 创建对应的web站点目录以及程序代码
    [root@web01 ~]# mkdir /code/{server1,server2}
    [root@web01 ~]# echo "server1" > /code/server1/index.html
    [root@web01 ~]# echo "server2" > /code/server2/index.html
    
    1. 配置不同域名的虚拟主机
    [root@web01 ~]# cat /etc/nginx/conf.d/server1.conf
    server {
        listen       80;
        server_name  1.oldboyedu.com;
        root /code/server1;
        index index.html;
        ...
    }
    [root@web01 ~]# cat /etc/nginx/conf.d/server2.conf
    server {
        ...
        listen       80;
        server_name  2.oldboyedu.com;
        root /code/server2;
        index index.html;
    }
    

    Nginx日志管理

    Nginx有非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志。

    访问日志是记录客户端即用户的具体请求内容信息,全局配置模块中的error_log是记录nginx服务器运行时的日志保存路径和记录日志的level,因此有着本质的区别。

    而且Nginx的错误日志一般只有一个,但是访问日志可以在不同server中定义多个,定义一个日志需要使用access_log指定日志的保存路径,使用log_format指定日志的格式,格式中定义要保存的具体日志内容。


    日志格式

    1. log_format定义日志格式语法
    # 配置语法: 包括: error.log access.log
    Syntax: log_format name [escape=default|json] string ...;
    Default: log_format combined "...";
    Context: http
    
    1. Nginx默认日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
    1. 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头信息中提供$http_x_forwarded_for,用来记录客户端IP地址和客户端请求的服务器地址。

    1. 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;
    Context: http, server, location, if in location, limit_except
    
    1. Nginx Access日志配置示例
    server {
        listen 80;
        server_name code.oldboy.com;
    
        #将当前的server网站的访问日志记录至对应的目录,使用main格式
        access_log /var/log/nginx/code.oldboy.com.log main;
        location / {
            root /code;
        }
    
        #当有人请求改favicon.ico时,不记录日志
        location /favicon.ico {
            access_log off;
            return 200;
        }
    }
    
    1. 使用实例一:favicon.ico

    favicon.ico图标是网站的缩略标志,当使用浏览器访问页面时,浏览器会自动发起请求获取favicon.ico文件,但当favicon.ico文件不存在时,服务器会记录404日志,而且浏览器的该请求也会收到404报错。

    解决方案:

    1. 提供favicon.ico文件和index.html放在一起
    2. 服务器不记录日志:
    location = /favicon.ico {
    	log_not_found off;  # 不记录文件没发现事件到error_log
    	access_log off;     # 不记录请求事件access_log
    }
    
    1. 使用实例二:json格式

    nginx默认访问日志记录内容相对比较单一,默认的格式也不方便后期做日志统计分析,生产环境中通常将nginx日志转换为json格式,然后使用日志分析工具ELK,做日志收集-统计-分析。

    http{
    	...
    	log_format access_json '{"@timestamp":"$time_iso8601",'
    		'"host":"$server_addr",'
    		'"clientip":"$remote_addr",'
    		'"size":$body_bytes_sent,'
    		'"responsetime":$request_time,'
    		'"upstreamtime":"$upstream_response_time",'
    		'"upstreamhost":"$upstream_addr",'
    		'"http_host":"$host",'
    		'"uri":"$uri",'
    		'"domain":"$host",'
    		'"xff":"$http_x_forwarded_for",'
    		'"referer":"$http_referer",'
    		'"tcp_xff":"$proxy_protocol_addr",'
    		'"http_user_agent":"$http_user_agent",'
    		'"status":"$status"}';
    	access_log /var/log/nginx/access.log access_json;
    }
    

    json格式日志含义:

    "@timestamp":日志时间戳
    "host":主机ip
    "clientip":客户端请求ip
    "size":请求大小
    "responsetime":响应时长
    "upstreamtime":转发时长
    "upstreamhost":转发的目标机器及端口
    "http_host":请求的域名
    "url":请求的后缀
    "referer":实际请求的转发域名
    "agent":客户端请求源类型
    "status":http状态码
    

    json格式日志内容:

    {"@timestamp":"2016-04-25T13:16:29+08:00","host":"192.168.0.202","clientip":"106.120.73.171","size":0,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"samsung.chinacloudapp.cn","url":"/index1.html","domain":"samsung.chinacloudapp.cn","xff":"-","referer":"-","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36","status":"304"}
    

    json格式日志,python访问统计脚本:

    [root@web01 ~]# cat nginx_json.py
    #!/usr/bin/env python
    #coding:utf-8
    status_200= []
    status_404= []
    with open("access_json.log") as f:
            for line in f.readlines():
            line = eval(line)
            if line.get("status") == "200":
                    status_200.append(line.get)
            elif line.get("status") == "404":
                    status_404.append(line.get)
            else:
                    print("状态码 ERROR")
    f.close()
    print "状态码200的有--:",len(status_200)
    print "状态码404的有--:",len(status_404)
    

    日志切割

    默认使用logrotate切割日志

    [root@web01 ~]# cat /etc/logrotate.d/nginx
    /var/log/nginx/.log {
            daily                   # 每天切割日志
            missingok               # 日志丢失忽略
            rotate 52               # 日志保留52天
            compress                # 日志文件压缩
            delaycompress           # 延迟压缩日志
            notifempty              # 不切割空文件
            create 640 nginx adm    # 日志文件权限
            sharedscripts
            postrotate              # 切割日志执行的命令
                    if [ -f /var/run/nginx.pid ]; then
                            kill -USR1 `cat /var/run/nginx.pid`
                    fi
            endscript
    }
    

    日志切割后的效果

    [root@web01 ~]# ll /var/log/nginx/
    total 4044
    -rw-r----- 1 www adm  54438 Oct 12 03:28 access.log-20181012.gz
    -rw-r----- 1 www adm  28657 Oct 13 03:48 access.log-20181013.gz
    -rw-r----- 1 www adm  10135 Oct 12 03:28 error.log-20181130.gz
    -rw-r----- 1 www adm   7452 Oct 13 03:48 error.log-20181201.gz
    

    日志清理

    当日志文件过大时,先将有用的log日志文件进行备份,然后再清理日志。

    不要删除日志文件,删除需要重启nginx,而清空日志,不需要重启,还会继续跟踪日志文件。

    [root@web01 ~]# > /var/log/nginx/access_json.log                # 方法一
    [root@web01 ~]# cat /dev/null > /var/log/nginx/access_json.log  # 方法二
    

    1、ngx_http_log_module模块:指定日志格式记录请求

    2、log_format name string ...;string可以使用nginx核心模块及其它模块内嵌的变量

    3、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

    4、access_log off; #禁用访问日志

    5、访问日志文件路径,格式及相关的缓冲的配置

    buffer=size
    flush=time
    
  • 相关阅读:
    hive之insert导入分区数据
    Hive数据倾斜及优化方案
    Hive中join关键字运行机制及使用详解
    如何去编写一个定时器?
    MapReduce运行原理详解
    nfs共享服务搭建
    IDEA中Java方法的抽取
    阿里巴巴开发规约(Alibaba Java Coding Guidelines)安装介绍
    IDEA集成vue
    写给初学asp.net的新人们 新手学习经验
  • 原文地址:https://www.cnblogs.com/backups/p/nginx3.html
Copyright © 2020-2023  润新知