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支持的负载均衡调度算法方式如下:
-
weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
-
ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
-
fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。
-
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日志文件进行切割保存
日积月累下,日志文件会越来越大,日志文件太大严重影响服务器效率,须要定时对日志文件进行切割。
切割的方式有按月切割、按天切割、按小时切割,一般都是按天切割。那么如何进行切割呢?
思路:
- 创建日志文件存放路径
- 将日志文件以当天时间为名字进行重命名
- 发送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