nginx的安装和使用

前言

Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru 站点(俄文:Рамблер)开发的.
它也是一种轻量级的Web服务器,可以作为独立的服务器部署网站(类似Tomcat)。它高性能和低消耗内存的结构受到很多大公司青睐,如淘宝网站架设。

  • 轻量级,同样是web 服务,比apache占用更少的内存及资源 ,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 这归功于Nginx为我们选择了 epoll and kqueue 作为开发模型.
  • 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简单
  • 社区活跃,各种高性能模块出品迅速啊
  • Nginx本身就是一个反向代理服务器
  • 负载均衡能力突出,Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多.

安装使用

Nginx 的安装步骤比较简单,安装在windows上推荐使用压缩包的安装方式。压缩包安装方式配置属性更灵活。

源码:https://trac.nginx.org/nginx/browser

官网:http://www.nginx.org/

下载

百度搜索Nginx,找到官网直接下载对应版本的压缩包。 有稳定版本和最新版本及以前版本,推荐使用稳定版本开发

  1. 官网下载地址 http://nginx.org/en/download.html
    image.png

  2. 下载完成之后,进行解压可以看到如下 文件结构。
    image.png

  3. 双击nginx,exe 就启动了。在页面输入localhost。出现如下界面则表示安装成功。默认监听80端口号
    image.png

安装

发布为Windows服务

虽然双击运行nginx.exe就可以启动,但是为了解决windows重启后可以自动启动nginx,我们可以将nginx发布为windows服务

需要借助"Windows Service Wrapper"小工具,项目地址: https://github.com/kohsuke/winsw

下载地址: http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/1.18/winsw-1.18-bin.exe

下载该工具后,将其放在 Nginx安装目录下,并重命名为nginx-service.exe,创建配置文件nginx-service.xml(名字要和工具名一样),

创建 nginx-service.exe.config(为支持NET 4.0 runtime,默认只支持NET 2.0 runtime)

文件结构如下:

image.png

nginx-service.xml 内容如下:

复制代码
<service>
    <id>nginx</id>
    <name>Nginx Service</name>
    <description>High Performance Nginx Service</description>
    <logpath>D:\nginx-1.14.0\logs</logpath>
    <log mode="roll-by-size"> 
      <sizeThreshold>10240</sizeThreshold>
      <keepFiles>8</keepFiles>  
    </log>
    <executable>D:\nginx-1.14.0\nginx.exe</executable> 
    <startarguments>-p D:\nginx-1.14.0</startarguments>  
    <stopexecutable>D:\nginx-1.14.0\nginx.exe</stopexecutable> 
    <stoparguments>-p D:\nginx-1.14.0 -s stop</stoparguments>
</service>
复制代码

 

nginx-service.exe.config 内容如下:

复制代码
<configuration>  
    <startup>     
        <supportedRuntime version="v2.0.50727" />   
        <supportedRuntime version="v4.0" />  
    </startup>  
    <runtime>    
        <generatePublisherEvidence enabled="false"/>  
    </runtime>
</configuration>
复制代码

 

在cmd中运行如下命令安装windows服务

D:\nginx-1.14.0\nginx-service.exe install

之后就可以在Windows服务面板中启动服务了

image.png

日常常用启停cmd命令

为了方便日常维护的使用,目前已经封装了bat文件,可以使用以下命令保存为bat文件,步骤如下:

  1. 将下面代码拷贝到txt文件

  2. 配置nginx.exe所在的目录

    SET NGINX_PATH=E:   //nginx.exe所在的盘符
    SET NGINX_DIR=E:\web\nginx-1.12.2\ //nginx.exe所在的目录

     

  3. 文件另存为.bat文件,重命名为nginx-help.bat

  4. 放到nginx根目录

image.png

日常启停功能的cmd命令:

复制代码
====================================================
@echo off
rem 提供日常启停功能的cmd命令

echo ==================begin========================

cls 
SET NGINX_PATH=E:
SET NGINX_DIR=E:\web\nginx-1.12.2\
color 0a 
TITLE Nginx 管理程序控制面板

CLS 

ECHO. 
ECHO. * Nginx 管理程序 * 
ECHO. * 创建2018-02-26 * 
ECHO. 

:MENU 

ECHO. * nginx 进程list * 
tasklist|findstr /i "nginx.exe"

ECHO. 
ECHO. [1] 启动Nginx 
ECHO. [2] 关闭Nginx 
ECHO. [3] 重启Nginx 
ECHO. [4] 退 出 
ECHO. 

ECHO.请输入选择项目的序号:
set /p ID=
IF "%id%"=="1" GOTO start 
IF "%id%"=="2" GOTO stop 
IF "%id%"=="3" GOTO restart 
IF "%id%"=="4" EXIT
PAUSE 

:start 
call :startNginx
GOTO MENU

:stop 
call :shutdownNginx
GOTO MENU

:restart 
call :shutdownNginx
call :startNginx
GOTO MENU

:shutdownNginx
ECHO. 
ECHO.关闭Nginx...... 
taskkill /F /IM nginx.exe > nul
ECHO.OK,关闭所有nginx 进程
goto :eof

:startNginx
ECHO. 
ECHO.启动Nginx...... 
IF NOT EXIST "%NGINX_DIR%nginx.exe" ECHO "%NGINX_DIR%nginx.exe"不存在 

%NGINX_PATH% 

cd "%NGINX_DIR%" 

IF EXIST "%NGINX_DIR%nginx.exe" (
echo "start '' nginx.exe"
start "" nginx.exe
)
ECHO.OK
goto :eof
复制代码

 

界面效果:

image.png

基本功能

注意:

  • 每个指令必须有分号结束
  • 在nginx.conf的注释符号为“#”

Nginx配置文件结构

打开conf文件夹,Nginx服务器的基础配置,默认的配置也存放在此,以下是你的安装文件目录结构:
image.png

下面主要介绍nginx.conf,文件结构如下:

复制代码
...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}
复制代码

 

说明:

  1. 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

  4. server块:配置虚拟主机的相关参数,一个http中可以有多个server。

  5. location块:配置请求的路由,以及各种页面的处理情况。

配置文件示例

复制代码
########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,
     http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request 
       $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}
复制代码

 

上面是nginx的基本配置,需要注意的有以下几点:

  1. $remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
  2. $remote_user :用来记录客户端用户名称;
  3. $time_local : 用来记录访问时间与时区;
  4. $request : 用来记录请求的url与http协议;
  5. $status : 用来记录请求状态;成功是200,
  6. $body_bytes_s ent :记录发送给客户端文件主体内容大小;
  7. $http_referer :用来记录从那个页面链接访问过来的;
  8. $http_user_agent :记录客户端浏览器的相关信息;
  9. 惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。(如何解决“惊群”现象)
  10. 每个指令必须有分号结束。

站点搭建

搭建静态站点非常简单,只需要3步:

  1. http下增加server节点,一个server节点就是一个网站
  2. 配置server节点下的server_name(服务器名称域名或IP)和listen(端口)节点
  3. 配置server节点下root(网站目录)和index(默认页)节点

配置好以上三步,直接启动nginx就可以看到效果了

比较推荐的写法是在conf文件夹下建立一个名为webapps的文件夹,针对一个站点单独建立一个.conf文件,然后在nginx.conf主配置文件内include进来,方便后期维护,不然多个server节点都配置在nginx.conf下会显得非常臃肿,下面附上搭建demo

  1. 在新建的webapps文件夹下建一个名为web1.conf的配置文件:

    复制代码
    ## backend for web1 ##
    
    ## Start www.web1.com ##
    server {
        listen 9001;
        server_name  localhost;
        error_log  logs/error.log;
        root   html;
        #配置了index节点,默认按顺序查找返回配置的页面
        #index  index.html index.htm index.php;
        location / {
            default_type text/html;
            return 200 '我是web1';  
        }
    
        #返回固定文本
        location ~ ^/get_text {
            default_type text/html;
            return 200 'This is text!';  
        }
    
        #返回固定json
        location ~ ^/get_json {
            default_type application/json;
            return 200 '{"status":"success","result":"nginx json"}';
        }
    
        #错误页
        error_page 404 /404.html;
        location = /40x.html {
        }
    
        #错误页
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
        
    
       
    }
    ## End www.web1.com ##
    复制代码

     

  2. 在nginx.conf主配置文件内使用include引入web1.conf文件

    复制代码
    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        charset utf-8;
        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;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
        
        #引入web1配置文件
        include webapps/web1.conf;
    
    }
    复制代码

     

配置好后启动nginx就可以看到效果了

在浏览器输入http://localhost:9001/

image.png

在浏览器输入http://localhost:9001/get_json

image.png

正向代理

如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

image.png

具体配置和用法待补充…

反向代理

如果局域网向Internet提供资源服务,让Internet上的其他客户端来访问局域网内的资源,使它们必须通过一个代理服务器来进行访问,这种服务就称为反向代理。正向代理和反向代理逻辑正好相反。

image.png

模拟一个场景:有web1和web2两个网站,希望可以实现用户访问web2可以获取到web1的网站

新建一个web2.conf,内容如下

复制代码
## backend for web2 ##

## Start www.web2.com ##
server {
    listen 9002;
    server_name  127.0.0.1;
    error_log  logs/error.log;
    root   html;
    #配置了index节点,默认按顺序查找返回配置的页面
    #index  index.html index.htm index.php;
    location / {
        default_type text/html;
        return 200 '我是web2';  
    }

    location /web1 {
        proxy_pass   http://127.0.0.1:9001/;
    }
    
}
## End www.web2.com ##
复制代码

 

在nginx.conf引入,并重启nginx

在浏览器输入http://localhost:9002

image.png

在浏览器输入http://localhost:9002/web1

image.png

以上就是使用proxy_pass来实现反向代理的功能

负载均衡

Nginx的upstream目前支持的负载策略分别是:轮询策略权重轮询策略ip_hash策略,fair策略,url_hash策略,least_conn策略等。
目前我总结的nginx负载策略共两大类,分别是:内置策略扩展策略。内置策略有3种,包括:轮询策略、权重轮询策略和ip_hash策略。默认情况下内置策略会编译进Nginx的内核,只需要在nginx配置中指明参数即可,扩展策略需要额外注册模块来配置。

负载均衡的作用:

  1. 转发功能

    按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。

  2. 故障移除

    通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器期宕掉,自动将请求发送到其他应用服务器。

  3. 恢复添加

    如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。

轮询策略

这种是默认的策略,把每个请求按顺序逐一分配到不同的server,如果server挂掉,能自动剔除

upstream  example.com {   
    server   192.168.99.100:9001; 
    server   192.168.99.100:9002;  
}

 

权重轮询策略

使用weight来指定server访问比率,weight默认是1。以下配置会是server2访问的比例是server1的两倍。

upstream  example.com {   
    server   192.168.99.100:9001 weight=1; 
    server   192.168.99.100:9002 weight=2;  
}

 

ip_hash策略

每个请求会按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理,可以解决session的问题。如果server挂掉,能自动剔除

upstream  example.com {   
    ip_hash;
    server   192.168.99.100:9001; 
    server   192.168.99.100:9002;  
}

 

ip_hash可以和weight结合使用。

least_conn策略

最少连接,把请求分配到连接数最少的server

upstream  example.com {   
    least_conn;
    server   192.168.99.100:9001; 
    server   192.168.99.100:9002;  
}

 

fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。

upstream  example.com {   
    server   192.168.99.100:9001; 
    server   192.168.99.100:9002;  
    fair;
}

 

url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

upstream example.com { 
      server   192.168.99.100:9001; 
      server   192.168.99.100:9002;  
      hash $request_uri; 
      hash_method crc32; 
}

 

Sticky策略

该策略在多台服务器的环境下,为了确保一个客户端只和一台服务器通讯,它会保持长连接,并在结束会话后再次选择一个服务器,保证了压力均衡。

upstream example.com { 
      sticky;
      server   192.168.99.100:9001; 
      server   192.168.99.100:9002; 
}

 

其他配置

upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:

down 表示当前的server暂时不参与负载.

weight 默认为1.weight越大,负载的权重就越大。

max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.

fail_timeout : max_fails次失败后,暂停的时间。

backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

upstream bakend{ #定义负载均衡设备的Ip及设备状态 
      ip_hash; 
      server 10.0.0.11:9090 down; 
      server 10.0.0.11:8080 weight=2; 
      server 10.0.0.11:6060; 
      server 10.0.0.11:7070 backup; 
}

 

示例Demo

创建一个名为web3.conf的配置文件,内容如下:

复制代码
## backend for web3 ##

upstream example {
    server 127.0.0.1:9004; #web1
    server 127.0.0.1:9005; #web2
}


## Start www.web3.com ##
server {
    listen 9003;
    server_name  127.0.0.1;
    error_log  logs/error.log;
    root   html;
    #配置了index节点,默认按顺序查找返回配置的页面
    index  index.html index.htm index.php;
    location / {
        proxy_pass http://example;
    }
    
}

### 为了演示效果,我直接在同文件搭建了web1和web2 ###

server {
    listen 9004;
    server_name  127.0.0.1;
    error_log  logs/error.log;
    root   html;
    #配置了index节点,默认按顺序查找返回配置的页面
    index  index.html index.htm index.php;
    location / {
        default_type text/html;
        return 200 '我是负载后的web1';  
    }
    
}

server {
    listen 9005;
    server_name  127.0.0.1;
    error_log  logs/error.log;
    root   html;
    #配置了index节点,默认按顺序查找返回配置的页面
    index  index.html index.htm index.php;
    location / {

        default_type text/html;
        return 200 '我是负载后的web2';  
    }
    
}
## End www.web3.com ##
复制代码

 

在nginx.conf引入,并重启nginx

在浏览器输入http://localhost:9003

image.png

再刷新下,就跳转到了web2

image.png

后续问题

如果关了server1,再多次刷新页面,接下来出现的就会都是server2的页面,但是时而快时而慢。这其中原因是当如果nginx将请求转发到server2时,服务器会马上跳转成功,但是如果是转到server1,因为server1已经关闭了,所以会出现一段等待响应过程的过程,要等它失败后才会转到server2。
而这个等待响应的时间我们是可以配置的。

这个时间由以下3个参数控制:
proxy_connect_timeout:与服务器连接的超时时间,默认60s
fail_timeout:当该时间内服务器没响应,则认为服务器失效,默认10s
max_fails:允许连接失败次数,默认为1

等待时间 = proxy_connect_timeout + fail_timeout * max_fails

image.png

如果我这样配置的话,只需等待6秒就可以了。

日志配置和日志切割

日志配置

日志对于统计排错来说非常有利的。下面总结了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反向代理之后,web服务器无法直接获取到客户端真实的IP地址了。 $remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。PS: 获取用户真实IP参见 Nginx 反向代理获取真实IP问题 ,如下所示:

    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 通用日志格式下的本地时间。

    发送给客户端的响应头拥有“sent_http_”前缀。 比如$sent_http_content_range,
    实例如下:

    复制代码
    http {
    
     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                            '"$status" $body_bytes_sent "$http_referer" '
                                            '"$http_user_agent" "$http_x_forwarded_for" '
                                            '"$gzip_ratio" $request_time $bytes_sent $request_length';
     
     log_format srcache_log '$remote_addr - $remote_user [$time_local] "$request" '
                                    '"$status" $body_bytes_sent $request_time $bytes_sent $request_length '
                                    '[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]';
     
     open_log_file_cache max=1000 inactive=60s;
    
     server {
     server_name ~^(www\.)?(.+)$;
     access_log logs/$2-access.log main;
     error_log logs/$2-error.log;
     
     location /srcache {
          access_log logs/access-srcache.log srcache_log;
        }
      }
    }
    复制代码

     

  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模块提供的。用来记录重写日志的。对于调试重写规则建议开启。 Nginx重写规则指南
    语法: 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
    配置错误日志。

日志切割

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

具体这边不展开细讲,直接上一个模版,按照模版配置就行了

#日志切割,按天切割
if ($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})') {
   set $tttt $1;
}

access_log  logs/access/web3/access-$tttt.log  main;
复制代码
##cache##
proxy_connect_timeout 500;
#跟后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_read_timeout 600;
#连接成功后_等候后端服务器响应的时间_其实已经进入后端的排队之中等候处理
proxy_send_timeout 500;
#后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有数据
proxy_buffer_size 128k;
#代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可  
proxy_buffers 4 128k;
#同上 告诉Nginx保存单个用的几个Buffer最大用多大空间
proxy_busy_buffers_size 256k;
#如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
proxy_temp_file_write_size 128k;
#proxy缓存临时文件的大小
proxy_temp_path ./data/proxy_temp_dir;
#用于指定本地目录来缓冲较大的代理请求
proxy_cache_path   ./data/proxy_cache_dir   levels=1:2   keys_zone=cache_one:200m inactive=1d max_size=30g; 
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。  
复制代码

 

将以上配置放在server下,如下图所示:

image.png

配置好后重启nginx,直接访问,就会在对应的目录生成以下的log文件,内容如下:

image.png

服务器缓存配置

nginx的一大功能就是完成静态资源的分离部署,减轻后端服务器的压力,如果给这些静态资源再加一级nginx的缓存,可以进一步提升访问效率。

第一步:添加nginx.conf的http级别的缓存配置

复制代码
##cache##
proxy_connect_timeout 500;
#跟后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_read_timeout 600;
#连接成功后_等候后端服务器响应的时间_其实已经进入后端的排队之中等候处理
proxy_send_timeout 500;
#后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有数据
proxy_buffer_size 128k;
#代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可  
proxy_buffers 4 128k;
#同上 告诉Nginx保存单个用的几个Buffer最大用多大空间
proxy_busy_buffers_size 256k;
#如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
proxy_temp_file_write_size 128k;
#proxy缓存临时文件的大小
proxy_temp_path ./data/proxy_temp_dir;
#用于指定本地目录来缓冲较大的代理请求
proxy_cache_path   ./data/proxy_cache_dir   levels=1:2   keys_zone=cache_one:200m inactive=1d max_size=30g; 
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
复制代码

 

此处的重点在最后一句,缓存存储路径为:./data/proxy_cache_dir,levels=1:2代表缓存的目录结构为2级目录

第二步:在访问静态文件的location上添加缓存

复制代码
#静态数据保存时效
location ~ \.html$ {
      proxy_cache cache_one;
      #此处的cache_one必须于上一步配置的缓存区域名称相同
      proxy_cache_valid 200 304 12h;
      proxy_cache_valid 301 302 1d;
      proxy_cache_valid any 1m;
      #不同的请求设置不同的缓存时效
      proxy_cache_key $uri$is_args$args;
      #生产缓存文件的key,通过4个string变量结合生成
      expires 30d;
      #其余类型的缓存时效为30天
      proxy_set_header X-Forwarded-Proto $scheme;
}
复制代码

 

此处需要注意:
只有在proxy_pass的时候,才会生成缓存,下一次请求执行到proxy_pass的时候会判断是否有缓存,如果有则直接读缓存,返回给客户端,不会执行proxy_pass;如果没有,则执行proxy_pass,并按照规则生成缓存文件;可以到nginx的cache文件夹下看是否生成了缓存文件。

具体这边不展开细讲,直接上一个模版,按照模版配置就行了

修改nginx.conf文件:

image.png

修改web3.conf文件:

image.png

打开浏览器访问http://localhost:9003,生成的缓存如下:

image.png

 

 

知识链接

小知识:
如果我们没有备案的域名,又想做出域名的效果,我们可以在本地修改hosts来达到效果
win 下hosts 的地址为 C:\Windows\System32\drivers\etc
我们需要在hosts文件里面添加如下配置
127.0.0.1 www.web1.com

Nginx 新手起步

Nginx 反向代理获取真实IP问题

Windows下编译Nginx超详细教程

Nginx实现请求的负载均衡 + keepalived实现nginx的高可用

Nginx高可用集群实战

IIS Nginx(或者tomcat)共用80端口

posted on   五官一体即忢  阅读(83)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

导航

点击右上角即可分享
微信分享提示