nginx学习笔记

一、nginx安装


1、必要软件准备

  • 安装 pcre

为了支持 rewrite功能,我们需要安装pcre

# yum install pcre* //如过你已经装了,请跳过这一步 

  • 安装 openssl

需要ssl的支持,如果不需要ssl支持,请跳过这一步

# yum install openssl*

2、安装nginx

此处不说明,百度查详细步骤参考:https://blog.csdn.net/tengxing007/article/details/61615234

3、 启动、关闭、重置nginx 

启动:直接执行以下命令,nginx 就启动了,不需要改任何配置文件,nginx 配置多域名虚拟主机请参考后续
         /usr/local/nginx-1.5.1/sbin/nginx

试试访问:直接使用 curl 命令来读取 web 信息 
         # curl -s http://localhost | grep nginx.com nginx.com.

关闭: 
         /usr/local/nginx-1.5.1/sbin/nginx -s stop

重置:当你有修改配置文件的时候,只需要 reload 以下即可 
         /usr/local/nginx-1.5.1/sbin/nginx -s reload

整个 nginx 的安装就到这里结束了。

二、nginx配置详解


1、nginx 编译参数详解 

 由于参数太多,请参考:http://www.ttlsa.com/nginx/nginx-configure-descriptions/

2、内核参数优化 

# vi sysctl.conf  
增加以下配置 ,参数详解:https://www.cnblogs.com/Jtianlin/p/4339931.html
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1800 
    net.ipv4.ip_conntrack_max = 16777216 # 如果使用默认参数,容易出现网络丢包 
    net.ipv4.netfilter.ip_conntrack_max = 16777216# 如果使用默认参数,容易出现网络丢包 
    net.ipv4.tcp_max_syn_backlog = 65536 
    net.core.netdev_max_backlog =  32768 
    net.core.somaxconn = 32768 
    net.core.wmem_default = 8388608 
    net.core.rmem_default = 8388608 
    net.core.rmem_max = 16777216 
    net.core.wmem_max = 16777216 
    net.ipv4.tcp_timestamps = 0 
    net.ipv4.tcp_synack_retries = 2 
    net.ipv4.tcp_syn_retries = 
    net.ipv4.tcp_tw_recycle = 1 
    net.ipv4.tcp_tw_reuse = 1 
    net.ipv4.tcp_mem = 94500000 915000000 927000000 
    net.ipv4.tcp_max_orphans = 3276800 
    net.ipv4.ip_local_port_range = 1024  65535 
配置生效 
    # sysctl –p 
修改 iptables 启动脚本,在 star()函数里面加上 
    # vi /etc/init.d/iptables 
    /sbin/sysctl  -p   

3、 nginx.conf配置文件参数说明

下面通过一个简单的例子,来实现一个域名站点访问

(1)先进行nginx.conf文件的配置

# vi nginx.conf 

user  nobody nobody; # 运行 nginx 的所属组和所有者 

worker_processes  2; # 开启两个 nginx 工作进程,一般几个 CPU 核心就写几

error_log  logs/error.log  notice; # 错误日志路径

pid     logs/nginx.pid; # pid 路径

events {

    worker_connections  1024; # 一个进程能同时处理 1024 个请求

http { 
    include       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  logs/access.log  main; 
    sendfile        on; keepalive_timeout  65; # keepalive 超时时间 
    # 开始配置一个域名,一个 server 配置段一般对应一个域名 
    server { 
        listen       80; # # 在本机所有 ip 上监听 80,也可以写为 192.168.253.129:80,这样的话,就只监听 192.168.253.129 上的 80 口 
        server_name  www.myweb.com; # 域名,可以写多个
        root   /www/html/www.myweb.com; # 站点根目录(程序目录) 
        index  index.html index.htm; # 索引文件 
        location / {  # 可以有多个 location 
            root   /www/html/www.myweb.com; # 站点根目录(程序目录) 
        } 
        error_page   500 502 503 504  /50x.html; 
        # 定义错误页面,如果是 500 错误,则把站点根目录下的 50x.html 返回给用户 
        location = /50x.html { 
            root   /www/html/www.myweb.com
        } 
    }
}

(2)、nginx重启使配置生效

# ./sbin/nginx -t

# ./sbin/nginx -s reload

(3)、创建服务器本地文件

# mkdir -p /www/html/www.myweb.com

# touch index.html

# echo “welcome to my website!” > /www/html/www.myweb.com/index.html 

 (4)、绑定hosts测试

把域名指向 192.168.253.129    www.myweb.com

打开 www.myweb.com,如下图: 

nginx学习笔记_第1张图片

3、 nginx日志参数说明 

ngx_http_core_module 模块在处理请求时,会有大量的变量,这些变量可以通过访问日志来记录下来,也可以用于其它 nginx 模块。在我们对请求做策略如改写等等都会使用到一些变量,顺便对ngx_http_core_module 模块提供的变量总结 了下,如下所示:

 nginx学习笔记_第2张图片

nginx学习笔记_第3张图片

本文总结了 nginx 日志相关的配置如 access_log、log_format、 open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。

nginx 有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过 log_format 命令来定义。ngx_http_log_module 是用来定义请求日志格式的 。

1. access_log指令 

语法: access_log path [format [buffer=size [flush=time]]]; 
access_log path format gzip[=level] [buffer=size] [flush=time]; 
access_log syslog:server=address[,parameter=value] [format]; 
access_log off; 
默认值: access_log logs/access.log combined; 
配置段: http, server, location, if in location, limit_except 
gzip 压缩等级。 
buffer 设置内存缓存区大小。 
flush 保存在缓存区中的最长时间。 
不记录日志:access_log off; 
使用默认 combined 格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined; 

2. log_format指令

语法: log_format name string …;

默认值: log_format combined “…”;

配置段: http

name 表示格式名称,string 表示等义的格式。log_format 有一个默认的无需设置的 combined 日志格式,相当于 apache 的 combined 日志格式,如下所示:  

log_format  combined  '$remote_addr - $remote_user  [$time_local]  '

                                        ' "$request"  $status  $body_bytes_sent  '

                                       ' "$http_referer"  "$http_user_agent" '; 

如果 nginx 位于负载均衡器,squid,nginx 反向代理之后,web 服务器无法直接获取到客户端真实的 IP 地址了。 $remote_addr 获取反向代理的 IP 地址。反向代理服务器在转发请求的 http 头信息中,可以增加 X-ForwardedFor 信息,用来记录 客户端 IP 地址和客户端请求的服务器地址。PS: 获取用户真实 IP 参见 http://www.ttlsa.com/html/2235.html 如下所示: 

log_format  porxy  '$http_x_forwarded_for - $remote_user  [$time_local]  '

                                              ' "$request"  $status $body_bytes_sent '

                                              ' "$http_referer"  "$http_user_agent" '; 

日志格式允许包含的变量注释如下:

$remote_addr, $http_x_forwarded_for 记录客户端 IP 地址 

$remote_user 记录客户端用户名称

$request 记录请求的 URL 和 HTTP 协议

$status 记录请求状态

$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与 Apache 模块 mod_log_config 里的 “%B”参数兼容。

$bytes_sent 发送给客户端的总字节数。

$connection 连接的序列号。

$connection_requests 当前通过一个连接获得的请求数量。

$msec 日志写入时间。单位为秒,精度是毫秒。

$pipe 如果请求是通过 HTTP 流水线(pipelined)发送,pipe 值为“p”,否则为“.”。  

$http_referer 记录从哪个页面链接访问过来的

$http_user_agent 记录客户端浏览器相关信息

$request_length 请求的长度(包括请求行,请求头和请求正文)。

$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送 给客户端后进行日志写入为止。

$time_iso8601 ISO8601 标准格式下的本地时间。

$time_local 通用日志格式下的本地时间。 

3. open_log_file_cache指令 

语法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

open_log_file_cache off;

默认值: open_log_file_cache off;

配置段: http, server, location

对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用 open_log_file_cache 来设置日志 文件缓存(默认是 off),格式如下: 参数注释如下

max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用 LRU 算法将描述符关闭。

inactive:设置存活时间,默认是 10s

min_uses:设置在 inactive 时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是 1 次

valid:设置检查频率,默认 60s 

off:禁用缓存 

实例如下: 
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

4. log_not_found指令 

语法: log_not_found on | off;

默认值: log_not_found on;

配置段: http, server, location

是否在 error_log 中记录不存在的错误。默认是

5. log_subrequest指令

语法: log_subrequest on | off;

默认值: log_subrequest off;

配置段: http, server, location

是否在 access_log 中记录子请求的访问日志。默认不记录。 

6. rewrite_log指令

由 ngx_http_rewrite_module 模块提供的。用来记录重写日志的。对于调试重写规则建议开启。 

语法: rewrite_log on | off;

默认值: rewrite_log off;

配置段: http, server, location, if

启用时将在 error log 中记录 notice 级别的重写日志。

7. error_log指令

语法: error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];

默认值: error_log logs/error.log error;

配置段: main, http, server, location

配置错误日志

8. 日志切割

nginx 日志默认情况下统统写入到一个文件中,文件会变的越来越大,非常不方便查看分析。以日期来作为日志的切割 是比较好的,通常我们是以每日来做统计的。下面来说说 nginx 日志切割。

1. 定义日志轮滚策略 
# vim nginx-log-rotate

/data/weblogs/*.log {

    nocompress

    daily

    copytruncate

    create

    notifempty

    rotate 7

    olddir /data/weblogs/old_log

    missingok

    dateext

    postrotate

        /bin/kill -HUP `cat /var/run/nginx.pid 2> /dev/null` 2> /dev/null || true

    endscript

}

[warning]/data/weblogs/*.log 使用通配符时,/data/weblogs/目录下的所有匹配到的日志文件都将切割。如果要切割特定日志文件,就指定到该文件。[/warning] 

2. 设置计划任务

# vim /etc/crontab

59 23 * * * root ( /usr/sbin/logrotate -f /PATH/TO/nginx-log-rotate)

这样每天 23 点 59 分钟执行日志切割。

三、nginx正反向代理


所谓的代理就是一个代表、渠道。代理又涉及到2个角色被代理角色目标角色(代理对象)。比如用户去耐克专卖店买鞋,那么专卖店就是代理被代理角色是耐克厂家,代理对象就是用户。

正向代理

假设我现在需要去访问facebook,但是由于墙的问题我无法访问。此时大家可能都会用一个操作FQ(番羽 土啬)进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!

nginx学习笔记_第4张图片

上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息

反向代理

明白了什么是正向代理,我们继续看关于反向代理的处理方式,举例如我大天朝的某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用nginx进行反向代理实现的。那么反向代理具体是通过什么样的方式实现的分布式的集群操作呢,我们先看一个示意图:

nginx学习笔记_第5张图片uploading.4e448015.gif正在上传…重新上传取消nginx学习笔记_第6张图片

通过上述的图解大家就可以看清楚了,多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!

--代理信息来源(https://www.jianshu.com/p/79dbbf5e3a63)

前面第二章的nginx.conf配置文件参数说明这节里举的例子就是一个反向代理的简单例子,实际应用中反向代理用的比较多。

那么为什么要使用代理

1)提高访问速度 由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能明显提高请求速度。

2)防火墙作用 由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可在代理服务器上设限,过滤某些不安全信息。

3)通过代理服务器访问不能访问的目标站点 互联网上有许多开发的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的浏览器就是利用了代理服务器,虽然不能出国,但也可直接访问外网。

下面来总结一下两者的特性:

1、安全性

        正向代理的客户端能够在隐藏自身的同时访问任意网站,这给网络安全带来了极大的威胁。因此,在使用时必须采取安全的措施,以确保仅为经过授权的客户端提供服务。而反向代理的客户端只能通过外网访问代理服务器,并且用户不知道自己访问的是一个代理服务器,好处就是反向代理将真正的处理放在内网中,有效的提高了网络安全。

2、功能性

        正向代理的主要用途是为在防火墙内的局域网用户提供访问Internet的途径。而反向代理是将防火墙后的服务器提供给Internet用户访问,还可以为多个后端服务器提供负载均衡、缓存功能等。


四、nginx负载均衡


========================持续更新======================

你可能感兴趣的:(nginx)