Nginx教程(二)

Ngingx入门配置

一、Nginx是什么?能干什么?

Nginx同Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL作为沟通依据,通过HTTP协议提供各种网络服务。

由于:

  • Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接

  • 高度的模块化和自由软件许可证是的第三方模块层出不穷(这是个开源的时代啊~)

  • Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris, AIX,Mac OS等操作系统上

  • 这些优秀的设计带来的极大的稳定性

所以,Nginx火了!

Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。

二、代理

1、正向代理

"它代理的是客户端",位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

用途:
(1)访问原来无法访问的资源,如Google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

2、反向代理

举例:某宝网站,每天同时连接到网站的访问人数爆表,单个服务器远远不能满足,此时就出现了:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用Nginx进行反向代理实现的,并且通过封装Nginx和其他的组件之后起了个高大上的名字:Tengine,有兴趣的童鞋可以访问Tengine的官网查看具体的信息:http://tengine.taobao.org/。

多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。

反向代理,"它代理的是服务端",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。

反向代理的作用:
(1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
(2)负载均衡,通过反向代理服务器来优化网站的负载

         

图解:

在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;

在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;

三、负载均衡

客户端发送的、Nginx反向代理服务器接收到的请求数量,就是我们说的负载量。

请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则。

所以~将服务器接收到的请求按照规则分发的过程,称为负载均衡。

硬件负载均衡:价格高昂     软件负载均衡:价格低

Nginx支持的负载均衡调度算法方式如下:

  1. weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。

  2. ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。

  3. fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。

  4. url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。

四、Nginx配置

1、log_format指令设置日志格式

  log_format指令语法:log_format name format [format ...]
  Nginx默认的combined格式如下:
  log_format combined '$remote_addr - $remote_user [$time_local] '
                                      '"$request" $status $body_bytes_sent '
                                      '"$http_referer" "$http_user_agent"';
  定义日志使用的字段及其作用:

        $remote_addr            和$http_x_forward_for用于记录IP地址
        $remote_user            用于记录远程客户端用户名称
        $time_local             用于记录访问时间和时区
        $request                用于记录请求URL与HTTP协议
        $status                 用于记录请求状态
        $body_bytes_sent        用于记录发送给客户端的文件主体内容大小,不包括响应头的大小
        $http_referer           用于记录是从哪个页面链接访问过来的
        $http_user_agent        用于记录客户端浏览器的相关内容
        $bytes_sent             用于发送给客户端的总字节数
        $connection             用于连接的序列号
        $connection_requests    用于当前通过一个连接获得的请求数量
        $msec                   用于日志写入时间。单位为秒,精度是毫秒
        $pipe                   用于如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”
        $request_length         用于请求的长度(包括请求行,请求头和请求正文)
        $request_time           用于请求处理时间,单位为秒,精度毫秒
        $time_iso8601           用于ISO8601标准格式下的本地时间
        $time_local             用于记录访问时间与时区

2、access_log指令指定访问日志文件存放路径

access_log指令语法:access_log path [format [buffer=size | off]]
    format即第一点中log_format的name,如何设置了format,那么日志文件就会按设置的日志格式生成日志文件.
    butter=size表示内存缓冲区的大小,例如可以设置buffer=32k

3、error_log指令指定错误日志文件存放路径

error_log    <FILE>    <LEVEL>;
    <FILE>:可以指定任意存放日志的目录
    <LEVEL>:错误日志级别,常见的错误日志级别有[debug | info | notice | warn | error | crit | alert | emerg],级别越高记录的信息越少。
    生产场景一般是 warn | error | crit 这三个级别之一

    关闭error_log的方法:error_log /dev/null;

五、Nginx日志文件进行切割保存

日积月累下,日志文件会越来越大,日志文件太大严重影响服务器效率,须要定时对日志文件进行切割。
切割的方式有按月切割、按天切割、按小时切割,一般都是按天切割。那么如何进行切割呢?
思路:

  1. 创建日志文件存放路径
  2. 将日志文件以当天时间为名字进行重命名
  3. 发送kill -USR1信号给Nginx的主进程号,让Nginx重新生成一个新的日志文件

下面以每天凌晨00:00切割nginx的访问日志access_log为例,详细讲解切割步骤

1、创建一个div_nginx_log.sh脚本,输入下面按天切割日志文件的shell脚本

#!/bin/bash
// nginx的日志文件路径
logs_path="/data1/logs/"

// 创建日志文件存放路径
mkdir -p ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m")/
// 将日志文件以当天时间为名字进行重命名
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
// 发送kill -USR1信号给Nginx的主进程号,让Nginx重新生成一个新的日志文件
kill -USR1 `cat /var/nginx/nginx.pid`

2、设置crontab,每天凌晨00:00切割nginx日志文件

// 进入编辑crontab
crontab -e

// 输入配置
// div_nginx_log.sh脚本的路径要写绝对路径
00 00 * * * /bin/bash /root/div_nginx_log.sh

彩蛋:cnblogs.com/phonecom/category/963145.html

发布了77 篇原创文章 · 获赞 19 · 访问量 4086

猜你喜欢

转载自blog.csdn.net/qq_41861558/article/details/102695897