nginx配置与使用

936 阅读16分钟

nginx配置与使用

自从使用前后端分离模式开发项目后,前端开发需要了解掌握的东西也越多了。
虽然前端不需要精通nginx,但熟悉nginx基本的配置对一些项目的本地开发调试来说非常方便有效。
因此,记录一下nginx的基本配置和使用。

前言

  • 现在大部分都使用vue,react等脚手架快捷开发项目,大大提高了前端开发效率
    • 当有一些功能修改之后需要部署到线上环境才能验证时,就需要build打包代码后放到测试环境进行测试。
    • 可以将build打包后的代码放入本地nginx服务器中模拟测试,测试OK后再部署到测试环境进行测试,避免因频繁修改代码并部署而影响线上环境。
  • 对于一些不需要用到脚手架的小项目,nginx中配置下代理转发,便可以进行跨域访问了,这样就可以直接在nginx中进行开发调试了。

下面分享下nginx的安装、配置使用以及配置https访问方法

nginx下载与安装

Nginx版本说明

  • Mainline version :开发版,主要是给广大Nginx爱好者,测试、研究和学习的,但是不建议使用于生产环境。
  • Stable version : 稳定版,也就是我们说的长期更新版本。这种版本一般比较成熟,经过长时间的更新测试,所以这种版本也是主流版本。
  • legacy version : 历史版本,如果你需要以前的版本,Nginx也是有提供的。

下载安装

nginx下载地址:nginx.org/download/

下载对应版本的安装包(我下载的版本是nginx-1.17.3),将其解压到本地的任一目录下。

我电脑系统是win10 64位的,解压到的目录:D:\nginx-1.17.3。

html目录下放置我们前端build打包好的代码或者非脚手架的前端代码,conf目录下有个非常重要的文件nginx.conf,用来配置nginx服务器。

nginx配置说明

nginx文件结构

......        # main全局块

events {      # events块
   ......
}

http           # http块
{
    ......     # http全局块
    server              # server块
    { 
        ......          # server全局块

        location [PATTERN]      # location块
        {
            ......
        }
        location [PATTERN] 
        {
            ......
        }
    }
    
    server
    {
        ......
    }

    upstream name {             # upstream块
        ......
    }

    ......     # http全局块
}

如上述配置文件所示,主要由6个部分组成:

  • main全局块:用于nginx工作模式的配置,配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • events块:用于nginx工作模式的配置,配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • http块:用于进行http协议信息的一些配置,可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • server块:用于进行服务器访问信息的配置,配置虚拟主机的相关参数,一个http中可以有多个server。
  • location块:用于进行访问路由的配置,配置请求的路由,以及各种页面的处理情况。
  • upstream块:用于进行负载均衡的配置

nginx服务器基本配置

打开conf目录下的nginx.conf文件,这个文件就是nginx服务器配置文件,下面是我的一些配置:

########### 每个指令必须有分号结束。#################

# user administrator administrators;  # 配置用户或者组,默认为nobody nobody。
worker_processes 1;  # 允许生成的进程数,默认为1

# 制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别依次为:debug|info|notice|warn|error|crit|alert|emerg
# error_log log/error.log debug;
# error_log  logs/error.log;
# error_log  logs/error.log  notice;
# error_log  logs/error.log  info;
 
# pid logs/nginx.pid;   # 指定nginx进程运行文件存放地址

events {
    accept_mutex on;   # 设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  # 设置一个进程是否同时接受多个网络连接,默认为off
    # use epoll;      # 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}


http {
    ## 以下配置可以开启目录浏览功能,可在http下全局设置,也可单独某个server的location目录下设置
    autoindex on;                        # 开启目录浏览功能;   
    autoindex_exact_size off;            # 关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;   
    autoindex_localtime on;              # 开启以服务器本地时区显示文件修改日期!

    include       mime.types;   # 文件扩展名与文件类型映射表
    default_type  application/octet-stream; # 默认文件类型,默认为text/plain

    # access_log log/access.log myFormat;  # combined为日志格式的默认值
    access_log off; # 取消服务日志   
    ## 自定义格式
    # <1>
    # log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; 
    # <2>
    # log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                   '$status $body_bytes_sent "$http_referer" '
    #                   '"$http_user_agent" "$http_x_forwarded_for"';

    sendfile on;   # 允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  # 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  # 连接超时时间,默认为75s,可以在http,server,location块。

    client_max_body_size 200m;

    #gzip  on;

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  # 热备
    }

    server {
        # keepalive_requests 120; # 单连接请求上限次数。
        listen       5555;   # 监听端口
        server_name  localhost;   # 监听地址       
        location  ~*^.+$ {       # 请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
            # root path;  # 根目录
            # root   D:/my-workspace/login; # 设置D:\my-workspace\login为根目录
            # index index.html index.htm;  # 设置默认页

            proxy_pass  http://mysvr;  # 请求转向mysvr 定义的服务器列表
            deny 127.0.0.1;  # 拒绝的ip
            allow 10.200.120.122; # 允许的ip           
        } 
    }

    server {
        # keepalive_requests 120; # 单连接请求上限次数。
        listen       9999;
        server_name  localhost;

        location / {
            root   html; # 设置nginx的html文件夹为根目录
            
            # index  index.html index.htm;
            try_files $uri $uri/ /index.html; # vue history模式时的路径匹配设置
            
            # 以下配置可以开启目录浏览功能,可在http下全局设置,也可单独某个server的location目录下设置
            # autoindex on;                        # 开启目录浏览功能;   
            # autoindex_exact_size off;            # 关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;   
            # autoindex_localtime on;              # 开启以服务器本地时区显示文件修改日期!
        }

        # 配置代理。由于项目是在本地起动的,当我们的request需要跨域请求其他ip地址时, 可以使用下面的配置进行匹配
        # 如果你的request链接为localhost:9999/api/login?name=zhangsan,那么下面配的就是location /api,最终会被代理到 http://192.168.1.206:80/login?name=zhangsan
        
        location /api {
            proxy_pass   http://192.168.1.206:80;       
        }

        # 如果你的项目是多页面的,则需要用到下面的配置。
        # 因为此时你的浏览器的url不是localhost:9999/#/login,而是 localhost:9999/a.html/#/login
        # 所以我们需要将路径中a.html指向具体的某个文件夹中的html文件,因为默认指向index.html
        location /a.html {
            alias html;
            index a.html;
        }
        location /b.html{
            alias html;
            index b.html;
        }

        # 404页面配置,页面同样在html文件夹中
        error_page  404    /404.html;
        location = /404.html {
            root   html;
        }

        # 其他错误码页面配置
        error_page  500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
    server {
        listen       9998;
        # server_name  localhost;

        location / {
            root   html; # 设置nginx的html文件夹为根目录
            
            # index  index.html index.htm;
            try_files $uri $uri/ /index.html; # vue history模式时的路径匹配设置
            
            # 以下配置可以开启目录浏览功能,可在http下全局设置,也可单独某个server的location目录下设置
            # autoindex on;                        # 开启目录浏览功能;   
            # autoindex_exact_size off;            # 关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;   
            # autoindex_localtime on;              # 开启以服务器本地时区显示文件修改日期!
        }
        
        location /phone/ {
            proxy_pass http://192.168.1.206:80/phone/; # 将地址代理到/phone/
        }

        # 404页面配置,页面同样在html文件夹中
        error_page  404    /404.html;
        location = /404.html {
            root   html;
        }

        # 其他错误码页面配置
        error_page  500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

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

  • 日志几个常见配置项:
    • $remote_addr:与 $http_x_forwarded_for 用以记录客户端的ip地址;
    • $remote_user:用来记录客户端用户名称;
    • $time_local: 用来记录访问时间与时区;
    • $request: 用来记录请求的url与http协议;
    • $status: 用来记录请求状态;成功是200;
    • $body_bytes_s ent:记录发送给客户端文件主体内容大小;
    • $http_referer:用来记录从那个页面链接访问过来的;
    • $http_user_agent:记录客户端浏览器的相关信息;
  • 惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。

文章末尾列出了nginx各个模块的详细信息,可供参考

nginx启动、关闭、重启等

进入nginx目录(D:\nginx-1.17.3),双击nginx.exe,来启动nginx。

启动完成后在浏览器地址栏输入localhost:9999看到nginx默认的欢迎页面,则说明本地的nginx服务器搭建好了

nginx有一些常用命令,可以启动,关闭,重启nginx,下面是一些常用的命令

nginx常用命令

由于nginx执行程序没有添加到系统变量,所以一定要进入nginx的安装目录才能执行

  • start nginx 启动nginx
  • nginx -s stop 强制关闭
  • nginx -s quit 安全关闭
  • nginx -t -c conf/nginx.conf 检查测试 nginx 配置文件
  • nginx -s reload 改变配置文件的时候,重启nginx工作进程,来时配置文件生效
  • nginx -s reopen 打开日志文件
  • nginx -v 查看Nginx版本

命令封装

虽然使用命令行可以进行nginx的操作,但是每次都需要进入nginx目录,还需要手动敲命令,个人感觉不是很方便

下面就将一些常用操作进行封装,封装到一个.bat的批处理文件,以后只需要双击这个文件就可以快捷操作了

  • 1、首先在桌面新建一个nginx.txt文本文件,将下面的批处理代码复制粘贴进去,保存,关闭文件
@echo off
rem 提供Windows下nginx的启动,重启,关闭功能
 
echo ==================begin========================
 
cls 
::ngxin 所在的盘符
set NGINX_PATH=D:
 
::nginx 所在目录
set NGINX_DIR=D:\nginx-1.17.3\
color 0a 
TITLE Nginx 管理程序增强版
 
CLS 
 
echo. 
echo. ** Nginx 管理程序  *** 
echo. 
 
:MENU 
 
echo. ***** nginx 进程list ****** 
::tasklist|findstr /i "nginx.exe"
tasklist /fi "imagename eq nginx.exe"
 
echo. 
 
    if ERRORLEVEL 1 (
        echo nginx.exe不存在
    ) else (
        echo nginx.exe存在
    )
 
echo. 
::*************************************************************************************************************
echo. 
  echo.  [1] 启动Nginx  
  echo.  [2] 关闭Nginx  
  echo.  [3] 重启Nginx 
  echo.  [4] 刷新控制台  
  echo.  [5] 重新加载Nginx配置文件
  echo.  [6] 检查测试nginx配置文件
  echo.  [7] 查看nginx version
  echo.  [0] 退 出 
echo. 
 
echo.请输入选择的序号:
set /p ID=
  IF "%id%"=="1" GOTO start 
  IF "%id%"=="2" GOTO stop 
  IF "%id%"=="3" GOTO restart 
  IF "%id%"=="4" GOTO MENU
  IF "%id%"=="5" GOTO reloadConf 
  IF "%id%"=="6" GOTO checkConf 
  IF "%id%"=="7" GOTO showVersion 
  IF "%id%"=="0" EXIT
PAUSE 
 
::*************************************************************************************************************
::启动
:start 
  call :startNginx
  GOTO MENU
 
::停止
:stop 
  call :shutdownNginx
  GOTO MENU
 
::重启
:restart 
  call :shutdownNginx
  call :startNginx
  GOTO MENU
 
::检查测试配置文件
:checkConf 
  call :checkConfNginx
  GOTO MENU
 
::重新加载Nginx配置文件
:reloadConf 
    call :checkConfNginx
  call :reloadConfNginx
  GOTO MENU
  
::显示nginx版本
:showVersion 
    call :showVersionNginx
  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"不存在
        goto :eof
     )
 
  %NGINX_PATH% 
  cd "%NGINX_DIR%" 
 
  IF EXIST "%NGINX_DIR%nginx.exe" (
    echo "start '' nginx.exe"
    start "" nginx.exe
  )
  echo.OK
  goto :eof
  
 
:checkConfNginx
  echo. 
  echo.检查测试 nginx 配置文件...... 
  IF NOT EXIST "%NGINX_DIR%nginx.exe" (
        echo "%NGINX_DIR%nginx.exe"不存在
        goto :eof
     )
 
  %NGINX_PATH% 
  cd "%NGINX_DIR%" 
  nginx -t -c conf/nginx.conf
 
  goto :eof
  
::重新加载 nginx 配置文件
:reloadConfNginx
  echo. 
  echo.重新加载 nginx 配置文件...... 
  IF NOT EXIST "%NGINX_DIR%nginx.exe" (
        echo "%NGINX_DIR%nginx.exe"不存在
        goto :eof
     )
 
  %NGINX_PATH% 
  cd "%NGINX_DIR%" 
  nginx -s reload
 
  goto :eof
  
::显示nginx版本
:showVersionNginx
  echo. 
  %NGINX_PATH% 
  cd "%NGINX_DIR%" 
  nginx -V
  goto :eof

  • 2、将nginx.txt文件重命名为nginx.bat,弹窗,点击确定即可

  • 3、双击执行nginx.bat文件,效果如下图,列出了7个操作,想要执行哪个操作,只需要输入对应操作的编号即可

输入1启动nginx,可以看到nginx启动后的效果,命令行窗口打印出了当前nginx进程相关信息

通过执行批处理文件,可以非常方便快捷的进行nginx的启动,关闭以及重启等操作

nginx配置https访问

安装OpenSSL

(1)下载地址:去slproweb.com/products/Wi…下载OpenSSL(根据系统选择32位或者64位版本下载安装)。

我的系统是win10 64位的,本次下载的版本为 Win64 OpenSSL v1.1.1g的.exe安装包。

下载完成后选择任意一个目录进行安装,我安装在了D:\OpenSSL目录)

(2)配置环境变量:

  • 在环境变量中添加环境变量,变量名为OPENSSL_HOME,变量值为D:\OpenSSL\bin(指向OpenSSL的安装路径下的bin目录)。

  • 在 Path变量 结尾添加一条:%OPENSSL_HOME%

  • 在环境变量中添加环境变量,变量名为OPENSSL_CONF,变量值为D:\OpenSSL\bin\openssl.cfg(指向openssl.cfg文件)。

生成证书

(1)在Nginx安装目录中创建ssl文件夹用于存放证书。以管理员的身份运行cmd.exe,进入ssl文件夹。

(2)创建私钥

在命令行中执行命令:

openssl genrsa -des3 -out openssl.key 1024     # openssl.key 可以随意取名,以.key后缀名结尾即可

此处要输入和验证密码(本次设置为123456),输入时界面是看不到密码的,请认真输入并记住改密码,后面会用到。

(3)创建csr证书

在命令行中执行命令:

openssl req -new -key openssl.key -out openssl.csr

其中openssl.key文件为刚才生成的.key文件。

执行上述命令后,需要输入一系列的信息。

输入的信息中最重要的为Common Name,这里输入的域名即为我们要使用https访问的域名,比如我输入的是localhost,其它的内容随便填即可。

以上步骤完成后,ssl文件夹内会有两个文件:openssl.csropenssl.key

(4)去除密码

在加载SSL支持的Nginx并使用上述私钥时需要输入密码,为了启动方便,先去除密码。

首先拷贝一份openssl.key并重命名为 openssl_copy.key

在命令行中执行如下命令以去除密码:

openssl rsa -in openssl_copy.key -out openssl.key

如下图所示,此命令需要密码,这个密码就是上文中在创建私钥的时候输入的密码。

(5)生成crt证书

在命令行中执行如下命令:

openssl x509 -req -days 365 -in openssl.csr -signkey openssl.key -out openssl.crt

至此,证书生成完毕。我们发现,ssl文件夹中一共生成了4个文件。

下面在nginx中配置https服务器的时候,我们需要用到的是其中的openssl.crt和openssl.key这两个文件。

修改nginx.conf配置文件

  • 打开nginx安装目录D:\nginx-1.17.3\conf\下的nginx.conf文件
  • 找到HTTPS server配置https的那一段(即包含有listen 443 ssl的那一段),默认这段代码被注释掉了,删除前面的#号解除注释
  • 然后分别修改其中的ssl_certificatessl_certificate_key配置项为刚才所生成的openssl.crt和openssl.key这两个文件的路径。
  • nginx默认读取的是conf目录下的证书,可以将刚才生成的证书放到conf目录下,我的证书在ssl目录,这里需要返回到ssl目录去获取证书
  • 默认https://localhost即可访问页面。
  • server_name配置项可以随意设置,比如"local-https",启动之后也可以使用https://local-https访问

修改后的该段配置如下:

server {
    # 默认localhost的80端口可以访问
    listen       443 ssl;
    server_name  local-https;
    
    ssl_certificate      ../ssl/openssl.crt;
    ssl_certificate_key  ../ssl/openssl.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        root   html;
        index  index.html index.htm;
        # try_files $uri $uri/ /index.html; # vue history模式时的路径匹配设置

        # 固定写法-------------
        # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # proxy_set_header X-Forwarded-Proto $scheme;
        # proxy_set_header X-Forwarded-Port $server_port;

        # proxy_pass http://127.0.0.1:8086; 
    }
}

重启nginx,在浏览器地址栏输入 https://localhost 并回车。

这时候,你可能看到“您的连接不是私密连接”的提示,单击页面中的“高级”,并接着单击“继续前往xxx(不安全)”,就可以看到界面了。说明https服务器已经配置成功了。

模块详解

main模块

示例代码:

# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;

上述配置都是存放在main全局配置模块中的配置项

  • user:用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
  • worker_processes:指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
  • error_log:定义错误日志文件的位置及输出级别 debug|info|notice|warn|error|crit|alert|emerg
  • pid:用来指定进程id的存储文件的位置
  • worker_rlimit_nofile:用于指定一个进程可以打开最多文件数量的描述

event 模块

示例代码:

event {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

上述配置是针对nginx服务器的工作模式的一些操作配置

  • worker_connections:指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。
  • multi_accept:配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
  • use epoll:配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue

http模块

作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可!

(1)基础配置

  • sendfile on:配置on让sendfile发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处

  • tc_nopush on:让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发

  • tcp_nodelay on:让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦

  • keepalive_timeout 10:给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好

  • client_header_timeout 10:设置请求头的超时时间

  • client_body_timeout 10:设置请求体的超时时间

  • send_timeout 10:指定客户端响应超时时间,如果客户端两次操作间隔超过这个时间,服务器就会关闭这个链接

  • limit_conn_zone $binary_remote_addr zone=addr:5m :设置用于保存各种key的共享内存的参数,

  • limit_conn addr 100: 给定的key设置最大连接数

  • server_tokens:虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处哦

  • include mime.types:指定在当前文件中包含另一个文件的指令

  • default_type application/octet-stream:指定默认处理的文件类型可以是二进制

  • type_hash_max_size 2048:混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢

(2)日志配置

  • access_log logs/access.log:设置存储访问记录的日志
  • error_log logs/error.log:设置存储记录错误发生的日志

(3)SSL证书加密

  • ssl_protocols:指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。
  • ssl prefer server ciphers:设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件

(4)压缩配置

  • gzip:是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
  • gzip_disable:为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
  • gzip_static:告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。
  • gzip_proxied:允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。
  • gzip_min_length:设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。
  • gzip_comp_level:设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。
  • gzip_type:设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。

(5)文件缓存配置

  • open_file_cache:打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。
  • open_file_cache_valid:在open_file_cache中指定检测正确信息的间隔时间。
  • open_file_cache_min_uses:定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
  • open_file_cache_errors:指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。

server模块

srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息

  • server:一个虚拟主机的配置,一个http中可以配置多个server
  • server_name:用力啊指定ip地址或者域名,多个配置之间用空格分隔
  • root:表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录
  • index:用户访问web网站时的全局首页
  • charset:用于设置www/路径中配置的网页的默认编码格式
  • access_log:用于指定该虚拟主机服务器中的访问记录日志存放路径
  • error_log:用于指定该虚拟主机服务器中访问错误日志的存放路径

location模块

location模块是nginx配置中出现最多的一个配置,主要用于配置路由访问信息

在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,所以location模块也是一个非常重要的配置模块

(1)基本配置

location / {
    root    /nginx/www;
    index    index.php index.html index.htm;
}
  • location /:表示匹配访问根目录
  • root:用于指定访问根目录时,访问虚拟主机的web目录
  • index:在不指定访问具体资源时,默认展示的资源文件列表

(2)反向代理配置方式

通过反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化

location / {
    proxy_pass http://bbb.example.com;
    proxy_set_header X-real-ip $remote_addr;
    # proxy_set_header Host $http_host; 
    # proxy_set_header Host $proxy_host;
}

如果想要将aaa.example.com/api的请求代理到bbb.example.com/api

  • 当Host设置为$http_host时,不会改变请求头的值,所以当要转发到bbb.example.com的时候,请求头还是aaa.example.com的Host信息
  • 当Host设置为$proxy_host时,则会重新设置请求头为bbb.example.com的Host信息。
  • 如果不设置Host,则默认host的值为proxy_pass后面跟的那个域名或者IP(一般写IP)

(3)uwsgi配置

wsgi模式下的服务器配置访问方式

location / {
    include uwsgi_params;
    uwsgi_pass localhost:9999
}

upstream模块

upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器

简单的配置方式如下

upstream name {
    ip_hash;
    server 192.168.1.100:8000;
    server 192.168.1.100:8001 down;
    server 192.168.1.100:8002 max_fails=3;
    server 192.168.1.100:8003 fail_timeout=20s;
    server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}

配置信息说明:

  • ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定
  • server host:port:分发服务器的列表配置
    • down:表示该主机暂停服务
    • max_fails:表示失败最大次数,超过失败最大次数暂停服务
    • fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求