Nginx系列-配置介绍

上一片老猫和大家分享了Nginx的相关的一些概念,以及一些基础的Nginx的模型,本篇开始,和大家一起探讨一下Nginx的一些配置信息,讲清楚所以然,为什么要这么配置,这么配置有什么作用,这是本节的初衷。

配置结构以及相关语法

玩过nginx的都知道nginx.conf,nginx的最主要的配置也就是在这个文件中。我们首先看一下这个配置的结构信息。打开nginx.conf文件,我们浏览一下,大概可以得到如下一个结构图。

nginx 4层 日志_crontab用法 时间配置

上述结构图还是比较清晰,老猫相信大多数开发配置nginx的话其实主要是为了做前后端分离的项目,因此,接触最多的也就是http模块中server的配置,对其他的配置有什么作用,应该不是每个人都知道。所以接下来每个模块的详细介绍,且听老猫接下来细细分析。

核心配置文件以及介绍

  1. 设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为'nobody'
user root;
  1. worker进程工作数设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行
worker_processes 1;
  1. nginx 日志级别'debug|info|notice|warn|error|crit|alert|emerg',错误级别从左到右越来越大
  2. 设置nginx进程 pid
pid   logs/nginx.pid;
  1. 设置工作模式
events {     # 默认使用epoll      use epoll;    # 每个worker允许连接的客户端最大连接数      worker_connections  10240; }
  1. http 是指令块,针对http网络传输的一些指令配置
http {}
  1. include 引入外部配置,提高可读性,避免单个配置文件过大
include   mime.types;
  1. 设定日志格式,main为定义的格式名称,如此 access_log 就可以直接使用这个变量了
#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;

参数名

参数意义

$remote_addr

客户端ip

$remote_user

远程客户端用户名,一般为:’-’

$time_local

时间和时区

$request

请求的url以及method

$status

响应状态码

$body_bytes_send

响应客户端内容字节数

$http_referer

记录用户从哪个链接跳转过来的

$http_user_agent

用户所使用的代理,一般来时都是浏览器

$http_x_forwarded_for

通过代理服务器来记录客户端的ip

  1. sendfile使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,提高了效率。
sendfile     on;tcp_nopush   on;
  1. keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。
#keepalive_timeout   0;keepalive_timeout   65;
  1. gzip启用压缩,html/js/css压缩后传输会更快
gzip  on;
  1. server可以在http指令块中设置多个虚拟主机
  • listen 监听端口
  • server_name localhost、ip、域名
  • location 请求路由映射,匹配拦截
  • root 请求位置
  • index 首页设置
server {             listen      88;            server_name   localhost;            location /  {                root    html;                index   index.html index.htm;            }     }

Nginx中遇到的一些需要注意的点

(1)如果nginx.pid丢失,我们要进行手动创建该文件,并且对nginx服务进行reload重启。如果nginx处于启动状态,我们先要查询当前nginx的进程号码,然后设置到我们的nginx.pid中,然后进行重新reload我们的服务器。

(2)自己配置的配置文件无法找到的时候,我们可以用以下命令./nginx -c +路径的方式,进行设置相关的配置文件信息。

Nginx常用命令整理

(1)./nginx -t 校验自己设置的nginx配置文件是否有效。

(2)./nginx -s reload 重新加载nginx的配置文件信息。

(3)./nginx -s quit 功能性优雅地关闭nginx服务,非强制性关闭,如果有客户有所链接,等释放之后才进行关闭。

(4)./nginx -s stop 暴力关闭,直接快速关闭nginx服务,紧急情况下使用该指令。 

(5)./nginx -h 或者./nginx -?查询nginx的用法大全。

(6)./nginx -c +path 手动设置相关配置文件信息,指定配置文件路径,多配置下可以手动切换核心配置文件。

(7)./nginx -v简单版本信息 ./nginx -V表示详细版本信息。

日志拆分

随着业务的发展,我们的线上用户访问量往往会越来越大,这时候就会产生很多访问日志。现有的日志都会存在 access.log 文件中,但是随着时间的推移,这个文件的内容会越来越多,体积会越来越大,不便于运维人员查看,所以我们可以通过把这个大的日志文件切割为多份不同的小文件作为日志,切割规则可以以为单位,如果每天有几百G或者几个T的日志的话,则可以按需以每半天或者每小时对日志切割一下。

下面是老猫整理出来的切割nginx的日志的方法。当然是通过我们的shell脚本去执行。「具体步骤如下:」

  1. 创建一个shell可执行文件:cut_my_log.sh,内容为:
  2. cut_my_log.sh添加可执行的权限:
chmod +x cut_my_log.sh
  1. 测试日志切割后的结果:
./cut_my_log.sh

当然以上的配置信息,大家可以根据自己本身的LOG_PATH以及PID去设置自己的日志原始路径以及pid的路径。

当我们执行该脚本之后我们就能够成功对其进行拆分了,老猫本地拆分结果如下:

nginx 4层 日志_nginx 4层 日志_02

并且通过里面的详细信息,我们不难发现,之前的一部分日志已经被顺利拆分到了其他几个文件中,大家可以试试。

自动日志拆分

如果我们每天去做这个拆分动作的时候,其实是愚蠢的,其实在我们的linux中系统中也有定时任务的说法,其用法也和我们Java中的定时任务类似,所以大家也非常容易上手。我们可以利用linux中的crontabs这个插件去实现。具体如何做的如下:

  1. 安装定时任务:
yum install crontabs
  1. crontab -e 编辑并且添加一行新的任务:
*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh
  1. 重启定时任务:
service crond restart
  • 附:常用定时任务命令:
service crond start         //启动服务 service crond stop          //关闭服务 service crond restart       //重启服务 service crond reload        //重新载入配置 crontab -e                  // 编辑任务 crontab -l                  // 查看任务列表

定时任务表达式:

Cron表达式是,分为5或6个域,每个域代表一个含义,如下所示:





星期几

年(可选)

取值范围

0-59

0-23

1-31

1-12

1-7

2019/2020/2021/…

常用表达式:

  • 每分钟执行:
*/1 * * * *
  • 每日凌晨(每天晚上23:59)执行:
59 23 * * *
  • 每日凌晨1点执行:
0 1 * * *

老猫为了演示的方便,按照上面的步骤将其设置为一分钟执行一次,效果图如下:

nginx 4层 日志_nginx 日志切割_03

以上32分以及33分出现的日志已经说明当前的定时任务生效了。当然正常的使用情况我们还是一天跑一次会比较好,例如就像后面的举例,每日凌晨进行执行。