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) 正则表达式     如: ~^.*\.magedu\d+\.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
posted @ 2021-06-05 09:57  原因与结果  阅读(234)  评论(0编辑  收藏  举报