乐趣区

关于nginx:小白入门学习Nginx代理服务器看这篇最新Nginx进阶学习最佳配置实践指南就OK了

<!– more –>

前置基础知识学习

  • 1.Nginx 根底装置与配置具体 https://blog.weiyigeek.top/20…
  • 2.Nginx 进阶学习之最佳配置实际指南 https://blog.weiyigeek.top/20…
  • 3.Nginx 模块学习应用实际指南 https://blog.weiyigeek.top/20…
  • 4.Nginx 平安加固与性能调优最佳指南 https://blog.weiyigeek.top/20…
  • 5.Nginx 常遇问题入坑出坑整顿 https://blog.weiyigeek.top/20…

0x00 编译实际

形容: 在企业线上生产环境中举荐进行 Nginx 编译装置, 能够依照业务侧重点进行相应 Nginx 编译参数配置,所以编译参数不是性能加的越多越好,应该尽可能少编译模块不必的最好不要退出,本小结将以最新的 Nginx 版本以及依赖版本进行编译演示。

Nginx-1.21.6+OpenSSL-1.1.1n

最新源码构建装置整顿,以后最新版本 nginx-1.21.6,实际工夫【2022 年 3 月 24 日】
版本阐明: pcre-8.45、zlib-1.2.11、openssl-1.1.1n、nginx-1.21.6。

官网装置参考地址: https://docs.nginx.com/nginx/…

步骤 01. 在从源代码编译 NGINX Open Source 之前,您须要为其依赖项装置库:

  • PCRE – 反对正则表达式,NGINX Core 和 Rewrite 模块须要。

    # http://pcre.org/
    # https://sourceforge.net/projects/pcre/files/
    wget -c https://nchc.dl.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.bz2
    tar -jxf pcre-8.45.tar.bz2 && cd pcre-8.45
    ./configure
    make  && sudo make install
  • zlib – 反对标头压缩, NGINX Gzip 模块须要。

    # http://www.zlib.net/
    wget -c http://zlib.net/zlib-1.2.11.tar.gz
    tar -zxf zlib-1.2.11.tar.gz && cd zlib-1.2.11
    ./configure
    make && sudo make install
  • OpenSSL – 反对 HTTPS 协定, NGINX SSL 模块和其余模块须要。

    # https://www.openssl.org/source/
    wget -c http://www.openssl.org/source/openssl-1.1.1n.tar.gz
    tar -zxf openssl-1.1.1n.tar.gz && cd openssl-1.1.1n
    ./config --prefix=/usr/local/openssl
    make && sudo make install
    # lib 库加载到零碎
    echo "/usr/local/openssl/lib" >> /etc/ld.so.conf.d/libc.conf
    ldconfig
    # 能够看到当下零碎的 Openssl 版本曾经更新到最新
    # root@weiyigeek-top:/usr/local/openssl/bin# openssl version
    # OpenSSL 1.1.1n  15 Mar 2022

步骤 02. 从 nginx.org 下载稳定版和主线版本的源代码文件,要下载并解压最新主线版本的源代码,请运行:

# https://nginx.org
sudo mkdir -vp /usr/local/nginx/module /usr/lib/nginx/modules /var/cache/nginx/{client_temp,proxy_temp,fastcgi_temp,uwsgi_temp,scgi_temp} 
wget https://nginx.org/download/nginx-1.21.6.tar.gz
tar zxf nginx-1.21.6.tar.gz && cd nginx-1.21.6
$ ./configure \
--prefix=/usr/local/nginx \
--with-pcre=../pcre-8.45 \
--with-zlib=../zlib-1.2.11 \
--user=ubuntu --group=ubuntu \
--sbin-path=/usr/sbin/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--lock-path=/var/run/nginx.lock \
--modules-path=/usr/lib/nginx/modules \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_geoip_module \
--with-threads --with-mail --with-mail_ssl_module \
--with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module \
--with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module \
--with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module \
--with-compat --with-file-aio \
--with-cc-opt='-Os -fomit-frame-pointer -g' --with-ld-opt=-Wl,--as-needed,-O1,--sort-common
# <!-- --add-dynamic-module=/usr/local/nginx/module -->

Tips:请留神 geoip_module 模块, 如果须要应用则须要提前装置好 GeoIP library,例如在 Ubuntu 零碎上执行 apt-get install libgeoip-dev 如下命令。

Tips : 请留神 通过 yum 或者 apt 装置的 nginx,通常会将 nginx 的配置文件放在/etc/nginx,而手动编译构建的个别是在 /usr/local/nginx 目录中。

步骤 03. 执行 ./configure 命令后的后果如下

Configuration summary
  + using threads
  + using PCRE library: ../pcre-8.45
  + using system OpenSSL library
  + using zlib library: ../zlib-1.2.11

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/sbin/nginx"
  nginx modules path: "/usr/lib/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx"
  nginx configuration file: "/usr/local/nginx/nginx.conf"
  nginx pid file: "/usr/local/nginx/nginx.pid"
  nginx error log file: "/var/log/nginx/error.log"
  nginx http access log file: "/var/log/nginx/access.log"
  nginx http client request body temporary files: "/var/cache/nginx/client_temp"
  nginx http proxy temporary files: "/var/cache/nginx/proxy_temp"
  nginx http fastcgi temporary files: "/var/cache/nginx/fastcgi_temp"
  nginx http uwsgi temporary files: "/var/cache/nginx/uwsgi_temp"
  nginx http scgi temporary files: "/var/cache/nginx/scgi_temp"

步骤 04. 执行构建装置后查看 nginx 版本以及构建参数等信息

$ nginx -V
nginx version: nginx/1.21.6
built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04)
built with OpenSSL 1.1.1n  15 Mar 2022
TLS SNI support enabled
  configure arguments: --prefix=/usr/local/nginx --with-pcre=../pcre-8.45 --with-zlib=../zlib-1.2.11 --user=ubuntu --group=ubuntu --sbin-path=/usr/sbin/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --lock-path=/var/run/nginx.lock --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_geoip_module --with-threads --with-mail --with-mail_ssl_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-compat --with-file-aio --with-cc-opt='-Os -fomit-frame-pointer -g' --with-ld-opt=-Wl,--as-needed,-O1,--sort-common

步骤 05. 执行 /usr/sbin/nginx 命令, 启用 nginx 服务并查看提供的服务。

# 查看 Nginx 并发过程数
$ ps -ef | grep nginx | grep -v "grep" | wc -l
3

Nginx 编译(configure) 参数一览

形容: 咱们能够执行 ./configure --help 便能够查看编译相干参数。

# 罕用选项 #
--prefix= #指向装置目录
--user= #指定程序运行时的非特权用户
--group= #指定程序运行时的非特权用户组
--with-perl= #设定 perl 库文件门路启用 pcre 库
--with-perl_modules_path= #设定 perl 模块门路
--with-pcre-opt= 在编译时为 pcre 库设置附加参数

--with-zlib= #指向 zlib 库目录
--with-zlib-opt= #在编译时为 zlib 设置附加参数
--with-zlib-asm= #为指定的 CPU 应用 zlib 汇编源进行优化,CPU 类型为 pentium, pentiumpro

--with-openssl= #指向 openssl 装置目录
--with-openssl-opt #在编译时为 openssl 设置附加参数
--with-http_ssl_module #启用 ngx_http_ssl_module 反对(使反对 https 申请,需已装置 openssl)--with-cc-opt= #设置 C 编译器参数将被增加到 CFLAGS 变量(PCRE 库,须要指定–with-cc-opt=”-I /usr/local/include”,如果应用 select()函数则须要同时减少文件描述符数量,能够通过–with-cc- opt=”-D FD_SETSIZE=2048”指定。)--with-ld-opt= #设置连贯文件参数链接零碎库。(PCRE 库,须要指定–with-ld-opt=”-L /usr/local/lib”。)--with-cpu-opt= #指定编译的 CPU,可用的值为: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64


#上面按需配置
--conf-path= #指向配置文件(nginx.conf)--error-log-path= #指向谬误日志目录
--pid-path= #指向 pid 文件(nginx.pid)--sbin-path= #指向(执行)程序文件(nginx)--lock-path= #指向 lock 文件(nginx.lock)(安装文件锁定,避免安装文件被他人利用,或本人误操作。)--builddir= #指向编译目录

#模块增加
--with-rtsig_module #启用 rtsig 模块反对(实时信号)--with-select_module #启用 select 模块反对(一种轮询模式, 不举荐在高载环境下应用)禁用:–without-select_module
--with-poll_module #启用 poll 模块反对(性能与 select 雷同,与 select 个性雷同,为一种轮询模式, 不举荐在高载环境下应用)--with-file-aio #启用 file aio 反对(一种 APL 文件传输格局)--with-ipv6 #启用 ipv6 反对
--with-http_realip_module #启用 ngx_http_realip_module 反对(这个模块容许从申请标头更改客户端的 IP 地址值,默认为关)--with-http_addition_module #启用 ngx_http_addition_module 反对(作为一个输入过滤器,反对不齐全缓冲,分局部响应申请)--with-http_xslt_module #启用 ngx_http_xslt_module 反对(过滤转换 XML 申请)--with-http_image_filter_module #启用 ngx_http_image_filter_module 反对(传输 JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用、gd 库要用到)--with-http_geoip_module #启用 ngx_http_geoip_module 反对(该模块创立基于与 MaxMind GeoIP 二进制文件相配的客户端 IP 地址的 ngx_http_geoip_module 变量)--with-http_sub_module #启用 ngx_http_sub_module 反对(容许用一些其余文本替换 nginx 响应中的一些文本)--with-http_dav_module #启用 ngx_http_dav_module 反对(减少 PUT,DELETE,MKCOL:创立汇合,COPY 和 MOVE 办法)默认状况下为敞开,需编译开启
--with-http_flv_module #启用 ngx_http_flv_module 反对(提供寻求内存应用基于工夫的偏移量文件)--with-http_gzip_static_module #启用 ngx_http_gzip_static_module 反对(在线实时压缩输入数据流)--with-http_random_index_module #启用 ngx_http_random_index_module 反对(从目录中随机筛选一个目录索引)--with-http_secure_link_module #启用 ngx_http_secure_link_module 反对(计算和查看要求所需的平安链接网址)--with-http_degradation_module  #启用 ngx_http_degradation_module 反对(容许在内存不足的状况下返回 204 或 444 码)--with-http_stub_status_module   #启用 ngx_http_stub_status_module 反对(获取 nginx 自上次启动以来的工作状态)--without-http_charset_module #禁用 ngx_http_charset_module 反对(从新编码 web 页面,但只能是一个方向–服务器端到客户端,并且只有一个字节的编码能够被从新编码)--without-http_gzip_module #禁用 ngx_http_gzip_module 反对(该模块同 -with-http_gzip_static_module 性能一样)--without-http_ssi_module #禁用 ngx_http_ssi_module 反对(该模块提供了一个在输出端解决解决服务器蕴含文件(SSI)的过滤器,目前反对 SSI 命令的列表是不残缺的)--without-http_userid_module #禁用 ngx_http_userid_module 反对(该模块用来解决用来确定客户端后续申请的 cookies)--without-http_access_module #禁用 ngx_http_access_module 反对(该模块提供了一个简略的基于主机的访问控制。容许 / 回绝基于 ip 地址)--without-http_auth_basic_module #禁用 ngx_http_auth_basic_module(该模块是能够应用用户名和明码基于 http 根本认证办法来爱护你的站点或其局部内容)--without-http_autoindex_module #禁用 disable ngx_http_autoindex_module 反对(该模块用于主动生成目录列表,只在 ngx_http_index_module 模块未找到索引文件时发出请求。)--without-http_geo_module #禁用 ngx_http_geo_module 反对(创立一些变量,其值依赖于客户端的 IP 地址)--without-http_map_module #禁用 ngx_http_map_module 反对(应用任意的键 / 值对设置配置变量)--without-http_split_clients_module #禁用 ngx_http_split_clients_module 反对(该模块用来基于某些条件划分用户。条件如:ip 地址、报头、cookies 等等)--without-http_referer_module #禁用 disable ngx_http_referer_module 反对(该模块用来过滤申请,回绝报头中 Referer 值不正确的申请)--without-http_rewrite_module #禁用 ngx_http_rewrite_module 反对(该模块容许应用正则表达式扭转 URI,并且依据变量来转向以及抉择配置。如果在 server 级 别设置该选项,那么他们将在 location 之前失效。如果在 location 还有更进一步的重写规定,location 局部的规定仍然会被执行。如果这个 URI 重写是因为 location 局部的规定造成的,那么 location 局部会再次被执行作为新的 URI。这个循环会执行 10 次,而后 Nginx 会返回一个 500 谬误。)--without-http_proxy_module #禁用 ngx_http_proxy_module 反对(无关代理服务器)--without-http_fastcgi_module #禁用 ngx_http_fastcgi_module 反对(该模块容许 Nginx 与 FastCGI 过程交互,并通过传递参数来管制 FastCGI 过程工作。)FastCGI 一个常驻型的公共网关接口。--without-http_uwsgi_module #禁用 ngx_http_uwsgi_module 反对(该模块用来医用 uwsgi 协定,uWSGI 服务器相干)--without-http_scgi_module #禁用 ngx_http_scgi_module 反对(该模块用来启用 SCGI 协定反对,SCGI 协定是 CGI 协定的代替。它是一种应用程序与 HTTP 服务接口标准。它有些像 FastCGI 但他的设计 更容易实现。)--without-http_memcached_module #禁用 ngx_http_memcached_module 反对(该模块用来提供简略的缓存,以进步零碎效率)-without-http_limit_zone_module #禁用 ngx_http_limit_zone_module 反对(该模块能够针对条件,进行会话的并发连接数管制)--without-http_limit_req_module #禁用 ngx_http_limit_req_module 反对(该模块容许你对于一个地址进行申请数量的限度用一个给定的 session 或一个特定的事件)--without-http_empty_gif_module #禁用 ngx_http_empty_gif_module 反对(该模块在内存中常驻了一个 1 * 1 的通明 GIF 图像,能够被十分疾速的调用)--without-http_browser_module #禁用 ngx_http_browser_module 反对(该模块用来创立依赖于申请报头的值。如果浏览器为 modern,则 $modern_browser 等于 modern_browser_value 指令调配的值;如 果浏览器为 old,则 $ancient_browser 等于 ancient_browser_value 指令调配的值;如果浏览器为 MSIE 中的任意版本,则 $msie 等于 1)--without-http_upstream_ip_hash_module #禁用 ngx_http_upstream_ip_hash_module 反对(该模块用于简略的负载平衡)--with-http_perl_module #启用 ngx_http_perl_module 反对(该模块使 nginx 能够间接应用 perl 或通过 ssi 调用 perl)--http-log-path=           # 设定 access log 门路
--http-client-body-temp-path= # 设定 http 客户端申请临时文件门路
--http-proxy-temp-path=    # 设定 http 代理临时文件门路
--http-fastcgi-temp-path=  # 设定 http fastcgi 临时文件门路
--http-uwsgi-temp-path=    # 设定 http uwsgi 临时文件门路
--http-scgi-temp-path=    # 设定 http scgi 临时文件门路

-without-http # 禁用 http server 性能
--without-http-cache # 禁用 http cache 性能

--with-mail #启用 POP3/IMAP4/SMTP 代理模块反对
--with-mail_ssl_module 启用 ngx_mail_ssl_module 反对
--without-mail_pop3_module #禁用 pop3 协定(POP3 即邮局协定的第 3 个版本, 它是规定集体计算机如何连贯到互联网上的邮件服务器进行收发邮件的协定。是因特网电子邮件的第一个离 线协定标 准,POP3 协定容许用户从服务器上把邮件存储到本地主机上, 同时依据客户端的操作删除或保留在邮件服务器上的邮件。POP3 协定是 TCP/IP 协定族中 的一员,次要用于 反对应用客户端远程管理在服务器上的电子邮件)--without-mail_imap_module #禁用 imap 协定(一种邮件获取协定。它的次要作用是邮件客户端能够通过这种协定从邮件服务器上获取邮件的信息,下载邮件等。IMAP 协定运行在 TCP/IP 协定之上,应用的端口是 143。它与 POP3 协定的次要区别是用户能够不必把所有的邮件全副下载,能够通过客户端间接对服务器上的邮件进行操作。)--without-mail_smtp_module #禁用 smtp 协定(SMTP 即简略邮件传输协定, 它是一组用于由源地址到目标地址传送邮件的规定,由它来管制函件的直达形式。SMTP 协定属于 TCP/IP 协定族,它帮忙每台计算机在发送或直达函件时找到下一个目的地。)--with-google_perftools_module #启用 ngx_google_perftools_module 反对(调试用,分析程序性能瓶颈)--with-cpp_test_module #启用 ngx_cpp_test_module 反对

--add-module= #启用内部模块反对

--with-cc=  # 指向 C 编译器门路
--with-cpp= # 指向 C 预处理门路

--without-pcre #禁用 pcre 库

--with-md5=     # 指向 md5 库文件目录(音讯摘要算法第五版,用以提供音讯的完整性爱护)--with-md5-opt= # 在编译时为 md5 库设置附加参数
--with-md5-asm  # 应用 md5 汇编源

--with-sha1=     # 指向 sha1 库目录(数字签名算法,次要用于数字签名)--with-sha1-opt= # 在编译时为 sha1 库设置附加参数
--with-sha1-asm  # 应用 sha1 汇编源

--with-libatomic  # 为原子内存的更新操作的实现提供一个架构
--with-libatomic= # 指向 libatomic_ops 装置目录

--with-debug # 启用 debug 日志

Shell 脚本一键部署虚拟主机 (附上关键性脚本):
残缺代码:https://github.com/weiyigeek/…

#!/bin/bash
#@Desc:Nginx 多实例部署虚拟主机
#@Author:WeiyiGeek
#@CreatTime:2020 年 3 月 8 日 12 点 06 分
#@Site:WeiyiGeek.top
#@Test_Linux: Linux weiyigeek 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
#@release:CentOS Linux release 7.4.1708 (Core)

## Define nginx variable
NGX_VER=1.16.1
NGX_URI="http://nginx.org/download/nginx-${NGX_VER}.tar.gz"
NGX_SRC="nginx-${NGX_VER}.tar.gz"
NGX_NAME=${NGX_SRC%.tar.gz}
NGX_DIR="/usr/local/nginx/${NGX_VER}"
NGX_ARGS="--prefix=${NGX_DIR} --user=nginx --group=nginx --with-http_stub_status_module"
NGX_SRCCODE="${NGX_NAME}/src/core/nginx.h"
NGX_VHDIR="${NGX_DIR}/conf/domains"

## Define 防火墙凋谢端口
FIREWALL_PORT=(80 8080)


## [Nginx INSTALL]
function nginx_install(){
    echo -e "\e[32m1. 核查装置依赖....... \e[0m"
    CHECK_SOFT=$(rpm -qa | grep -cE "^gcc|^pcre|^zlib")
    if [$CHECK_SOFT -lt 2];then yum install -y gcc gcc-c++ pcre pcre-devel zlib-devel;fi

    echo -e "\e[32m2. 查看 nginx 源码包是否存在....... \e[0m"
    if [! -f $NGX_SRC];then wget -c $NGX_URI;fi
    if [! -d $NGX_NAME];then tar -zxf $NGX_SRC;fi

    echo -e "\e[32m3.nginx 装置陆军是否存在....... \e[0m"
    if [! -f $NGX_DIR/sbin/nginx];then mkdir -vp $NGX_DIR;fi

    echo -e "\e[32m3. 验证 nginx 用户是否存在不存在则建设低权限用户....... \e[0m"
    CHECK_USER=$(getent passwd | grep -wc nginx)
    if [$CHECK_USER -eq 0];then useradd -s /sbin/nologin nginx -M; fi

    echo -e "平安设置:Nginx 版本暗藏......"
    sed -i "s/$NGX_VER//g" $NGX_SRCCODE
    sed -i 's/nginx\//JWS/g' $NGX_SRCCODE
    sed -i 's/"NGINX"/"JWS"/g' $NGX_SRCCODE

    echo -e "\e[32m4. 进行 nginx 预编译及其编译装置....... \e[0m"
    cd $NGX_NAME && ./configure $NGX_ARGS 
    if [$? -eq 0];then
        #进行 2 个线程并行编译(能够依据你处理器个数抉择)
        make -j2 && make -j2 install
    else
        echo -e "\e[31m#Error: 预编译失败! 终止装置, 请查看软件依赖! \e[0m"
        exit
    fi
    if [$? -ne 0];then echo -e "\e[31m#Error: 编译装置失败! 终止装置 \e[0m";exit;fi
    echo -e "\e[32m Nginx 胜利装置....... \n 装置目录:${NGX_DIR} \n 正在启动 Nginx....\e[0m"
    $NGX_DIR/sbin/nginx
}

## [Nginx CONFIG]
function nginx_vhost(){
    NGX_VHOSTS=$1
    firewall_config
    cd ${NGX_DIR}
    NGX_CNF="${NGX_DIR}/conf/nginx.conf"
    if [! -f $NGX_CONF];then echo -e "Nginx- 配置文件不存在请仔细检查!";exit;fi
    #判断是否曾经存在 domains 配置文件是则不同从新建设;
    grep "domains" ${NGX_CNF} >>/dev/null 2>&1
    if [$? -ne 0];then
        #备份 NGX 配置文件
        cp ${NGX_CNF}{,_$(date +%F_%H%M%S).bak}
        mkdir -vp ${NGX_VHDIR}
        sed -i "s/#user  nobody/user  nginx/g" ${NGX_CNF}
        sed -i "s/#gzip/gzip/g" ${NGX_CNF}
        #去除空行以及正文
        grep -vE "#|^$" ${NGX_CNF} > ${NGX_CNF}.swp
        #重点删除 server 字符到文件开端
        sed -i '/server/,$d' ${NGX_CNF}.swp
        cp ${NGX_CNF}.swp ${NGX_CNF}
        echo -e "include domains/*;\n}" >> ${NGX_CNF}
    fi
    
cat>${NGX_VHDIR}/$NGX_VHOSTS.conf<<EOF
server {
    listen       80;
    server_name  $NGX_VHOSTS;

    location / {
        root   html/$NGX_VHOSTS;
        index  index.html index.htm;
    }
    #Nginx 监控模块启用
    location /nginxStatus {stub_status;}
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {root   html;}
}
EOF
   

echo -e "\e[32m$NGX_VHOSTS 网站目录建设之中.....\e[0m"
if [! -d $NGX_DIR/html/$NGX_VHOSTS/];then
    mkdir -vp $NGX_DIR/html/$NGX_VHOSTS/
cat>$NGX_DIR/html/$NGX_VHOSTS/index.html<<EOF
<h1>$NGX_VHOSTS Test Pages. </h1>
<p>By WeiyiGeek.top </p>
<hr color=red>
EOF
fi
    echo -e "\e[32mNginx 配置文件验证中.....\e[0m"
    $NGX_DIR/sbin/nginx -t
    if [$? -ne 0];then
        echo -e "\e[31mNginx 配置文件有误,请处理错误后重启 Nginx 服务器:\n ${NGX_DIR}/sbin/nginx -s reload"
    fi
    cat ${NGX_VHDIR}/$NGX_VHOSTS.conf

    echo -e "\e[32mNginx 重启之中.....\e[0m"
    $NGX_DIR/sbin/nginx -s reload
    CHECK_STATUS=$(netstat -tlnp | grep -wc "nginx")
    if [$CHECK_STATUS -ne 0];then
        echo -e "\e[32m#Nginx 启动胜利.... \e[0m"
    else
        echo -e "\e[31m#Nginx 启动失败.... \e[0m"
    fi
}

运行成果:

测试成果:


0x01 Nginx 配置最佳实际

Nginx 之 多配置文件配置

形容: Nginx 配置文件中反对蕴含多个配置文件,比方上面的虚拟主机的配置将应用,在程序加载运行时候首先会读取 nginx.conf 的配置文件,而后再读取 /etc/nginx/conf.d/上面的配置文件;

例如,咱们须要在 /etc/nginx/nginx.conf 文件中, 进行如下设置include /etc/nginx/conf.d/*.conf;

http {
  ....
  include conf.d/*.conf;
  ....
}

<br/>

Nginx 之 Server 侦听端口主机头配置浅析

形容: 惯例网站编译装置后运行只是单个网站拜访,咱们如何能够做到多网站同时运行到该 Nginx 服务器上, 那咱们便可应用 Nginx 提供的虚拟机主机形式, 使得一个服务端口能够拜访不同的服务利用;

惯例有三种形式:

  • 1) 多端口
  • 2) 多 IP
  • 3) 多域名: 虚拟主机(VirtualHost)

环境筹备:

cat >> /etc/hosts<<END
127.0.0.1 v1.weiyigeek.top v2.weiyigeek.top
END

流程步骤:

  • 1. 批改移除 Nginx.conf 配置文件中的 Server {...} 蕴含的参数增加include domains/*;;

    user  nginx;
    worker_processes  1;
    events {worker_connections  1024;}
    http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    include domains/*;
    }
  • 2. 在 Nginx 的 Conf 目录中建设一个 domains 目录(留神这里不要建设到下级目录之中,否则会呈现 nginx master 过程曾经启动然而无监听端口), 进入该目录中建设虚拟主机 v1.weiyigeek.top.conf 文件

    server {
    listen       80;
    server_name  v1.weiyigeek.top;  #关键点
    location / {
      #关键点
      root   html/v1.weiyigeek.top;
      index  index.html index.htm;
    }
    #Nginx 监控模块启用
    location /nginxStatus {stub_status;}
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {root   html;}
    }
  • 3. 在 nginx 装置目录中的 html 中建设一个与虚拟主机同名的文件夹(当然名字您能够任意取,然而必须和 v1.weiyigeek.top.conf 中指定路与的 root 统一)

    [root@WeiyiGeek html]# pwd
    /usr/local/nginx/1.16.1/html
    [root@WeiyiGeek html]# ls
    50x.html  index.html  v1.weiyigeek.top  v2.weiyigeek.top

<br/>

配置示例

server {
  # 应用规范 HTTP 协定
  listen 80;
  # 应用规范 HTTPS 协定
  listen 443 ssl;
  # 应用 http2 协定
  listen 443 ssl http2;
  # 应用 IPV6 地址监听 80 端口
  listen [::]:80;
  # 只应用 IPV6 地址监听 80 端口
  listen [::]:80 ipv6only=on;

  # 匹配指定域名拜访
  server_name weiyigeek.top;
  # 匹配多域名拜访
  server_name weiyigeek.top www.weiyigeek.top;
  # 匹配 weiyigeek.top 下所有子域名
  server_name *.weiyigeek.top;
  # 匹配所有的蕴含 weiyigeek.top 的顶级域名
  server_name weiyigeek.top.*;
  # 仅匹配 IP 地址拜访
  server_name "";
  server_name _;
}

舒适提醒: 当网站设置反对 http2 当前能够从申请响应头中看到如下字段 X-Firefox-Spdy:h2

<br/>

Nginx 之 Location 规定配置浅析

形容: Location 语法规定:location [=|~|~*|^~] /uri/ {…}

  • =: 示意准确匹配.
  • /: 示意通用匹配, 即任何申请都会匹配到。
  • ~: 示意辨别大小写的正则匹配.
  • ~*: 示意不辨别大小写的正则匹配.
  • !~,!~* : 别离标识为辨别大小写不匹配及不辨别大小写不匹配的正则
  • ^~: 示意 URL 以某个惯例字符串结尾, 能够了解为匹配 url 门路即可, 值得注意的是 Nginx 不对 URL 做编码, 例如会将申请为 /static/20%/aa 被 ^~ /static/ /aa 规定匹配到。

默认状况下 location 的匹配程序为 准确匹配 -> 结尾匹配 (^~) -> 文件程序中的正则匹配 -> 通用匹配(/), 当有匹配胜利的 URL 则进行匹配。

例如,有如下匹配规定:

location = / {#规定 A. 准确匹配 / URL 下的操作。}
location = /login {#规定 B. 准确匹配 /login URL 下的操作。}
location ^~ /static/ {#规定 C. 正则匹配 /static/ URL 下的操作。}
location ~ \.(gif|jpg|png|svg|js|css)$ {#规定 D,留神:是依据括号内的大小写进行匹配,括号内全是小写只匹配小写。}
location ~* \.(gif|jpg|png|svg|js|css)$ {#规定 D,留神:疏忽大写来匹配动态资源后缀。}
location ~* \.png$ {#规定 E. 匹配以.png 或者.PNG 结尾的动态资源。}
location !~ \.xhtml$ {#规定 F. 不匹配.xhtml 为后缀的资源。}
location !~* \.xhtml$ {#规定 G. 不匹配.xhtml 或者.XHTML 为后缀的资源。}
location / {#规定 H. 通用匹配,当上述匹配都不能匹配时,应用该规定。}

<br/>

在实际过程中常见, 有如下几种匹配规定:

# 第一个必选规定是间接匹配网站根,通过域名拜访网站首页比拟频繁,应用这个会减速解决,# 这里能够是间接转发给后端应用服务器了,也能够是一个动态首页。location = / {
  root /usr/local/nginx/html
  proxy_pass http://tomcat:8080/index
}
 
# 第二个必选规定是解决动态文件申请,这是 nginx 作为 http 服务器的强项
# 有两种配置模式,目录匹配或后缀匹配, 任选其一或搭配应用
location ^~ /static/ {                             # // 以 xx 结尾
  root /webroot/static/;   # 留神, 须要指定跟目录.
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {     # // 以 xx 结尾
  root /webroot/res/;  
}
 
#第三个规定就是通用规定,用来转发动静申请到后端应用服务器
#非动态文件申请就默认是动静申请,本人依据理论把握
location / {proxy_pass http://tomcat:8080/}

Nginx 之 规定判断表达式浅析

Nginx 罕用判断表达式如下:

  • - f 和!-f: 用来判断是否存在文件
  • - d 和!-d: 用来判断是否存在目录
  • - e 和!-e: 用来判断是否存在文件或目录
  • - x 和!-x: 用来判断文件是否可执行
  • 除此之外咱们还能够应用上一大节的正则匹配符进行判断。

nginx 全局变量一览:

arg_PARAMETER      # 这个变量蕴含 GET 申请中,如果有变量 PARAMETER 时的值。args               # 这个变量等于申请行中 (GET 申请) 的参数,如:foo=123&bar=blahblah;
binary_remote_addr # 二进制的客户地址。body_bytes_sent    # 响应时送出的 body 字节数数量。即便连贯中断,这个数据也是准确的。content_length    # 申请头中的 Content-length 字段。content_type      # 申请头中的 Content-Type 字段。cookie_COOKIE     # cookie COOKIE 变量的值
document_root     # 以后申请在 root 指令中指定的值。document_uri      # 与 uri 雷同。host              # 申请主机头字段,否则为服务器名称。hostname          # 设置为 gethostname 返回的机器主机名
http_HEADER       # 申请 header 头字段
is_args           # 如果有 args 参数,这个变量等于”?”,否则等于”",空值。http_user_agent   # 客户端 agent 信息
http_cookie       # 客户端 cookie 信息
limit_rate        # 这个变量能够限度连贯速率。query_string      # 与 args 雷同。request_body_file  #客户端申请主体信息的长期文件名。request_method    #客户端申请的动作,通常为 GET 或 POST。remote_addr          #客户端的 IP 地址。remote_port          #客户端的端口。remote_user          #曾经通过 Auth Basic Module 验证的用户名。request_completion #如果申请完结,设置为 OK. 当申请未完结或如果该申请不是申请链串的最初一个时,为空(Empty)。request_method    #GET 或 POST
request_filename  #以后申请的文件门路,由 root 或 alias 指令与 URI 申请生成。request_uri          #蕴含申请参数的原始 URI,不蕴含主机名,如:”/foo/bar.php?arg=baz”。不能批改。scheme                #HTTP 办法(如 http,https)。server_protocol      #申请应用的协定,通常是 HTTP/1.0 或 HTTP/1.1。server_addr          #服务器地址,在实现一次零碎调用后能够确定这个值。server_name        #服务器名称。server_port          #申请达到服务器的端口号。

<br/>

Nginx 解析 URL 用作判断的全局变量,例如,拜访的 URL 为http://weiyigeek.top:8080/test1/test2/test.php.

$host:weiyigeek.top
$server_port:8080
$request_uri:http://weiyigeek.top:8080/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/data/nginx/html
$request_filename:/data/html/test1/test2/test.php

<br/>

简略示例:

  • 1. 判断申请的动态资源文件是否是存在的,如不存在则返回 403.

    location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {if (-f $request_filename) { 
      return 403;
      break;
    }
    }
  • 2. 判断 Nginx 全局变量并进行跳转到指定页面。

    if ($host !~* weiyigeek\.top) {return 301 https://space.bilibili.com/385802642;}
  • 3. 文件反盗链并设置过期工夫

    location ~*^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
    valid_referers none blocked *.weiyigeek.top localhost 127.0.0.1;
    if ($invalid_referer) {
        rewrite ^/ https://weiyigeek.top/wechat.html;
        return 412;
        break;
    }
    root /usr/local/nginx/html
    access_log  off;
    expires 3d;
    break;
    }
  • 4. 自定义变量判断跳转到指定页面.

    # 仅容许 222.222.222.222 或者内网的两个 IP 拜访, 其余 IP 都 rewrite 到停服页面
    if ($remote_addr = 222.222.222.222){set $my_ip 1;}
    if ($remote_addr = 192.168.1.170){set $my_ip 1;}
    if ($remote_addr = 192.168.1.169){set $my_ip 1;}
    if ($my_ip != 1) {rewrite ^/design/(.*)\.php$ /weiyigeek.html?$1&;}  #将 *.php 转到 tingfu.html

舒适提醒: 此处以 Nginx 裸露给互联网, 所以利用 $remote_addr 变量获取访问者地址, 如果用了负载平衡的话此处应该是$http_x_forwarded_for 变量。

<br/>

Nginx 之 Redirect 重定向与 ReWrite 重写 配置浅析

Redirect(重定向)语法示例

# http 向 https 跳转 (永恒)
server {
  listen 80;
  server_name weiyigeek.top www.weiyigeek.top;
  return 301 https://$host$request_uri;
}

# http 向 https 跳转(长期)server {
  listen 80;
  server_name weiyigeek.top www.weiyigeek.top;
  return 302 https://www.weiyigeek.top$request_uri;
}

<br/>

ReWrite 重写语法示例
rewrite 正则表达式以及其可用参数:

  • last : 基本上都用这个 Flag。
  • break : 停止 Rewirte 不在持续匹配
  • redirect : 返回长期重定向的 HTTP 状态 302
  • permanent : 返回永恒重定向的 HTTP 状态 301
# http 向 https 跳转
server {
  listen 80;
  server_name weiyigeek.top www.weiyigeek.top;
  # 判断申请 host 是否是 www.weiyigeek.top , 如果是 weiyigeek.top 则重写为 www.weiyigeek.top 
  if ($http_host !~ "^www\.weiyigeek\.top$" {rewrite ^(.*) https://www.weiyigeek.top$1 permanent;
  }
}

# 利用重写规定避免盗链
location ~* \.(gif|jpg|png|svg|css|js)$ {
  valid_referers none blocked *.weiyigeek.top localhost 127.0.0.1 server_names ~\.google\. ~\.baidu\.;
  if ($invalid_referer) {rewrite ^/ https://www.weiyigeek.top/403.jpg;}
}

# 利用重写性能可将网页中旧的拜访目录重写到新的拜访门路
# 例如, 如果拜访 https://blogwww.weiyigeek.top/2020/10/515.html 则将显示首页。if ($document_uri ~* /([0-9]+)/([0-9]+)/([0-9]+)\.html$) {rewrite ^/ /index.html last;}

舒适提醒:301 与 302 状态码的不同区别。

  • 301 redirect: 301 代表永久性转移(Permanently Moved ) – 网站 SEO 举荐。
  • 302 redirect: 302 代表暂时性转移(Temporarily Moved )

<br/>

Nginx 之 SSL 证书平安配置浅析

形容: 通常为了保障网站数据在传输过程中不被窃取和篡改,咱们须要为其配置 SSL 证书,而在 Nginx 中配置办法是十分的简略的,不过最重要的还是你要生成私钥以及证书申请文件 csr 向证书颁发机构生成网站证书。

# Permanent Redirect for HTTP to HTTPS
server {
  listen 80;
  listen [::]:80;
  server_name weiyigeek.top;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name weiyigeek.top;

  # HSTS (ngx_http_headers_module is required) 应该只应用 HTTPS 而不是应用 HTTP 通信
  add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload" always;

  # XXS-Protection
  add_header X-XSS-Protection "1; mode=block";

  # MIME 模仿探测
  add_header X-Content-Type-Options nosniff;

  # Frame 安全控制
  add_header X-Frame-Options ALLOW-FROM music.163.com;

  # Spider Robots 爬取策略限度
  add_header X-Robots-Tag none;

  # 开启 SSL,如果想 http 与 https 专用一个配置则能够将其正文(the "ssl" directive is deprecated)
  # ssl on;

  # 配置证书链与证书密钥
  ssl_certificate      /etc/nginx/ssl/fullchain.cer;
  ssl_certificate_key  /etc/nginx/ssl/weiyigeek.top.key;

  # ssl 会话复用超时工夫以及会话复用缓存大小
  ssl_session_timeout 1d;
  ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions

  # 配置双证书时开启否则应该敞开
  ssl_session_tickets off;  

  ## OCSP stapling
  ssl_stapling on;
  ssl_stapling_verify on;
  # 应用根 CA 和两头证书验证 OCSP 响应的信赖链
  ssl_trusted_certificate /etc/nginx/ssl/ca.cer;

  # 仅应用 ECDH 是不必配置 ssl_dhparam 的否则你应该为它配置上 
  # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
  ssl_dhparam /path/to/dhparam;

  # 兼容性较为通用的 SSL 协定与加密算法套件
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;
  # 平安配置: ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
  # 证书惯例握手加密算法形式共十八个,ECDHE、DHE、AES 结尾别离 6 个
  ; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DES:!MD5:!RC4;
  
  # 为了兼容性举荐服务器主动抉择要应用的算法套件
  ssl_prefer_server_ciphers  on;

  # replace with the IP address of your resolver
  resolver 223.6.6.6 8.8.8.8 192.168.12.254;
}

补充阐明: 为 Nginx 服务器配置 RSA 与 ECDSA 双证书的两种形式。

# 1. 首先是将两个证书链都退出 Nginx 的配置文件
ssl_certificate     example.com.rsa.crt;
ssl_certificate_key example.com.rsa.key;
ssl_certificate     example.com.ecdsa.crt;
ssl_certificate_key example.com.ecdsa.key;

# 2. 或者应用 CT 的话有两种办法,一个是将两个证书的 CT 信息放到同一目录,并做如下设置,Nginx CT 模块会主动在这个目录下查找相应证书的 CT 信息并发送验证:ssl_ct on;
ssl_ct_static_scts /path/to/sct/dir;

# 咱们也能够独自配置每个证书的 CT 文件
ssl_ct on;
ssl_certificate example.com.rsa.crt;
ssl_certificate_key example.com.rsa.key;
ssl_ct_static_scts xample.com.rsa.scts;
 
ssl_certificate example.com.ecdsa.crt;
ssl_certificate_key example.com.ecdsa.key;
ssl_ct_static_scts example.com.ecdsa.scts;

Nginx 之 资源压缩配置浅析

形容: 为了升高服务器带宽压力以及优化响应速度, 通常咱们须要在 Nginx 服务器配置中为其开启 gzip 压缩,

配置示例:

# 开启 gzip
gzip on;
# 启用 gzip 压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 2k;
# gzip 压缩级别,1-10,数字越大压缩的越好,也越占用 CPU 工夫,前面会有具体阐明
gzip_comp_level 2;
# 进行压缩的文件类型,javascript 有多种形,其中的值能够在 mime.types 文件中找到。gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png font/ttf font/opentype image/svg+xml;
# 倡议在 http header 中增加 Vary: Accept-Encoding 反对
gzip_vary on;

<br/>

Nginx 之 动态资源 expires 缓存过期工夫配置

形容: 在 Nginx 配置 expires 指令能够起到管制页面缓存的作用, 配置动态资源的 expires 能够无效的缩小客户端对服务器的申请,该配置项实用于: http、server 以及 location 块中。

expires(过期工夫语法)语法示例

; 语法: `expires [time|epoch|max|off]`
* epoch:指定 Expires 的值为 1 January,1970,00:00:01 GMT
* max: 指定 Expires 的值为 31 December2037 23:59:59GMT,"Cache-Control" 的值为 10 年。* -1:指定 Expires 的值为以后服务器工夫 -1s,即永远过期。* off:不批改 Expires 和 "Cache-Control" 的值

# location 块 ~ 应用正则匹配
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
  # 动态资源源门路必须配置否则, 动态资源可能无奈找到
  root /var/www/img/;
  # 禁用 404 谬误日志
  log_not_found off;
  # 敞开 access 拜访日志
  access_log off;
  # 动态资源过期工夫
  expires 7d;
}

该指令管制 HTTP 应答中的 ”Expires” 和 ”Cache-Control”Header 头部信息, 例如在配置后 expires 指令申请 https://blog.weiyigeek.top/img/avatar.jpg URL:

HTTP/1.1 304 Not Modified
Server: nginx
Date: Fri, 01 Apr 2022 09:19:09 GMT
Last-Modified: Wed, 30 Mar 2022 15:42:30 GMT
Connection: keep-alive
ETag: "62447a66-35db"
Expires: Fri, 08 Apr 2022 09:19:09 GMT # 示意资源过期工夫,由以后拜访工夫加上 max-age 指令值所得
Cache-Control: max-age=604800          # 应用 max-age 指令指定组件被缓存多久, 正数示意 no-cache, 负数或零示意 max-age=time
Access-Control-Allow-Origin: *.weiyigeek.top
Access-Control-Allow-Methods: GET,POST
Access-Control-Allow-Headers: DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization

<br/>

实际示例:

# 网页资源缓存
location ~* \.(xml|html|htm)$ {
  # 资源决相对目录设置
  root /var/www/html;
  # 日志文件的相对路径或残缺门路
  access_log /path/to/file.log;
  # 开启日志记录
  access_log on;
  # 设置过期工夫
  expires 24h;
}

# 款式、JS、图片资源缓存
location ~* \.(css|js|ico|gif|jpg|jpeg|png)$ {
  root /var/www/html/res;
  # 禁用 404 谬误日志
  log_not_found off;
  # 敞开日志
  access_log off;
  # 缓存工夫 7 天
  expires 7d;
}

# 字体资源缓存
location ~* \.(eot|ttf|otf|woff|woff2|svg)$ {
  root /var/www/html/static;
  log_not_found off;
  access_log off;
  expires max;
}

<br/>

Nginx 之 反向代理资源根本缓存配置

形容: 在 Nginx 中往往咱们会对指定站点进行反代(反向代理), 而在反代站点中存在动静资源与动态资源,咱们能够应用下述指令开启简略的缓存配置。

首先咱们须要理解一下三种缓存类型:

  • 客户端缓存
  • 代理缓存(Proxy Cache)
  • 服务端缓存

这里次要解说 Nginx 作为代理服务器进行代理缓存的配置采纳的参数以及示例:

  • 1.proxy_cache: 定义用于缓存的共享内存区域。同一个区域能够用于多个中央

    Syntax:     proxy_cache zone | off;
    Default:     proxy_cache off;
    Context:     http, server, location
  • 2.proxy_cache_path: 设置缓存的门路和其余参数缓存数据存储在文件中,缓存中的文件名是将 MD5 函数利用于缓存键的后果

    Context: http
    Syntax: proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
    
    #例如,在上面的配置中 level 参数定义缓存的层次结构级别: 从 1 到 3,每个级别承受值 1 或 2。proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m; #10M = 10 * 8000 个密钥
    #/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
  • 3.proxy_cache_valid: 设置缓存过期工夫

    Syntax:     proxy_cache_valid  time;
    Context:     http, server, location
    
    #例如,为不同的响应代码设置缓存工夫。proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404      1m;
    
    #If only caching time is specified (指定),也能够能够指定 any 参数来缓存任何响应:
    proxy_cache_valid 5m;
    proxy_cache_valid any      1m;
  • 4.proxy_cache_key: 设置缓存维度

    Syntax:     proxy_cache_key string;
    Default:     proxy_cache_key $scheme$proxy_host$request_uri;
    Context:     http, server, location
    
    #例如,定义用于缓存的键,proxy_cache_key "$host$request_uri $cookie_user";
    proxy_cache_key $scheme$proxy_host$uri$is_args$args; #默认状况下指令也是字符串不必加上 ""
  • 5.proxy_cache_purge: 定义将在何种条件下将申请视为缓存革除申请。如果字符串参数中至多有一个值不为空且不等于“0”,则删除具备相应缓存键的缓存项。通过返回 204 (No Content)响应来批示操作胜利的后果。

    Syntax:     proxy_cache_purge string ...;
    Context:     http, server, location
    
    # Example configuration: 
    map $request_method $purge_method {
      PURGE   1;
      default 0;
    }
  • 6.proxy_no_cache: 指定不缓存的局部页面,能够与 proxy_cache_bypass 指令一起应用。

    Syntax:     proxy_no_cache string ...;
    Context:     http, server, location
    
    #如果字符串参数中至多有一个值不为空且不等于“0”,则不会保留响应:
    proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
    proxy_no_cache $http_pragma    $http_authorization;

    <br/>

proxy_cache 相干指令集简述
形容: 其中 proxy_cache_path 指令 配置了缓存名称以及其寄存地址、缓存大小等相干其它参数配置, 而 proxy_cache 指令 配置是为了启用创立的 mycache 名称的缓存。

  • proxy_no_cache : 该指令用于定义满足条件的响应不会被保留到缓存中, 在条件字符串中至多有一个条件不为空或者 0,合乎这样条件的响应才不会被缓存, 其个别会配合 proxy_cache_bypass 独特应用;
  • proxy_cache_bypass : 该指令用于定义哪些状况不从 cache 读取间接从 backend 获取资源配置同上。
  • proxy_cache_key : 该指令给缓存数据定义一个键。
  • proxy_cache_methods:该指令用于设置缓存哪些 HTTP 办法, 默认缓存 HTTP GET/HEAD 办法不缓存 POST 办法。
  • proxy_cache_valid:该指令用于设置不同响应码的缓存工夫。
  • proxy_cache_min_uses : 该指令用于设置缓存的最小应用次数, 默认值为 1
  • proxy_cache_use_stale : 该指令开启 (加强) 容错能力,即应用缓存内容来响应客户端的申请

<br/>

示例演示:

# 1. 其中,cookie_nocache、arg_nocache... 皆为变量,能够依据你拜访的匹配策略来设置,其值只有 2 类,0 和非 0;
# 拜访匹配策略, 如果在此链式配置中,只有有一个值不为 0 则不会 cache。if ($request_uri ~ ^/(login|register|password\/reset)/) {set $cookie_nocache 1;}
proxy_no_cache $cookie_nocache(0) $arg_nocache(1) $arg_comment(0)
proxy_no_cache $http_pragma $http_authorization;

# 2. 默认状况下,该指令的值的字符串,给缓存数据定义一个键。proxy_cache_key $scheme$proxy_host$uri$is_args$args; # 缺省
proxy_cache_key $scheme$proxy_host$request_uri;

# 4. 缺省缓存 GET HEAD 申请。proxy_cache_methods GET HEAD;

# 5. 只对响应码为 200,301,302 的拜访申请资源设置缓存工夫,此外能够个性化定制。proxy_cache_valid 200 302 10m; 
proxy_cache_valid 301 1h; 
proxy_cache_valid 404 1m; 
proxy_cache_valid any 1m;

# 6. 设置缓存的最小应用次数。proxy_cache_min_uses 1;

# 7. 当作为 cache 的 NGINX 收到源站返回 error、timeout 或者其余指定的 5XX 谬误,并且在其缓存中有申请文件的古老版本,则会将这些古老版本的文件而不是错误信息发送给客户端。proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;  

实际配置: 多磁盘宰割缓存,如果有多个硬盘则能够用来在多个硬盘之间宰割缓存。

# 假如每块硬盘挂载在相应的目录中:/mnt/disk1、/mnt/disk2、/mnt/disk3, 应用了 3 个独立的缓存,每个缓存专用一块硬盘,另外,3 个独立的线程池也各自专用一块硬盘。proxy_cache_path /mnt/disk1 levels=1:2 keys_zone=cache_1:256m max_size=1024G use_temp_path=off;
proxy_cache_path /mnt/disk2 levels=1:2 keys_zone=cache_2:256m max_size=1024G use_temp_path=off;
proxy_cache_path /mnt/disk3 levels=1:2 keys_zone=cache_3:256m max_size=1024G use_temp_path=off;

# 缓存之间(其后果就是磁盘之间)的负载平衡应用 split_clients 模块
split_clients $request_uri $disk {
  33.3%     1;
  33.3%     2;
  *         3;
}
location / {
  proxy_pass http://127.0.0.1:9090;
  proxy_cache_key $request_uri;
  proxy_cache cache_$disk;
}

实际示例:

  • 示例 1.

    proxy_cache_path /path/to/cache levels=1:2 keys_zone=mycache:10m max_size=10g inactive=60m use_temp_path=off;
    upstream my_upstream {
    server 192.168.1.20:8080 weight=5 max_fails=5 fail_timeout=30s;
    server 192.168.1.10:8080 weight=5 max_fails=5 fail_timeout=30s;
    }
    server {
    location / {
      proxy_cache mycache;
      proxy_pass http://my_upstream;
    }
    }
  • 示例 2:

    http {
      ...
      proxy_cache_path /opt/app levels:1:2 keys_zone=weiyigeek_cache:10m max_size=10g inactive=60m use_temp_path=off; 
      map $request_method $purge_method {
        PURGE   1;
        default 0;
      }
      ...
      server {
        ...
        location / {
            proxy_cache weiyigeek_cache;
            proxy_pass http://weiyigeek;
            proxy_cache_valid 200 304 12h;
            proxy_cache_valid any 10m;
            proxy_cache_key $host$uri$is_args$args;
            proxy_cache_purge $purge_method;
            add_header Nginx-Cache "$upstream_cache_status";
            proxy_net_upstream error timeout invalid_header http_500 http_502;
            include proxy_params;
        }
        ...
      }
    }

舒适提醒: 在 proxy_cache_path 指令中的 use_temp_path=off 参数, 示意会将临时文件保留在缓存数据的同一目录中, 此举防止在更新缓存时, 磁盘之间相互复制响应数据,缩小磁盘 IO 压力。

<br/>

补充阐明:
问: 如何清理指定缓存?

> 1.rm -rf 删除缓存目录内容
> 2. 第三方扩大模块 ngx_cache_purge

Nginx 之 黑白名单限度与申请限流

形容: 通常为了避免黑客攻击以及歹意爬虫爬取, 咱们须要针对 Nginx 服务器配置黑白名单和限流措施。

黑白名单之 deny 与 allow
形容: 利用 include 指令增加黑白名单配置文件, 该指令能够在 http, server, location, limit_except 语句块, 例如:

# 白名单
include whiteip.conf;
# allow 192.168.12.0/24; # 容许 IP 段
# allow 127.0.0.1;       # 容许单个 IP
# allow all;             # 容许所有 IP

# 黑名单
include blockip.conf;
# deny 127.0.0.1; # 屏蔽单个 IP
# deny all; # 屏蔽所有 IP

舒适提醒: 当被屏蔽的 IP 再次拜访咱们的 nginx 服务器网页是, 将会显示 403 页面。

<br/>

拜访限度之并发连贯与申请速率
形容: 咱们能够别离利用 Nginx 提供的 limit_conn_zone 与 limit_req_zone 模块来限度每个 IP 的连接数以及申请数。$binary_remote_addr 是限度同一客户端 ip 地址 (节约空间), 留神不是应用$remote_addr 变量;

http {
  # - limit_conn_zone:限度每个 IP 的并发连接数
  # 例如 blogweiyigeektop 是定义的一个会话区其用于记录会话状态信息。limit_conn_zone $binary_remote_addr zone=blogweiyigeektop:10m;
  limit_conn_zone $server_name zone=serverweiyigeektop:10m;
  limit_conn_log_level info;

  # - limit_req_zone:限度每个 IP 的申请数
  limit_req_zone $binary_remote_addr zone=weiyigeek_top:10m rate=1r/s;
    limit_req_zone $binary_remote_addr $uri zone=blog_weiyigeek_top:3m rate=1r/s; # $uri 示意同个 ip 拜访同个 uri 才会进入限度
  
  server {
    # 限连接数
    location  ^~ /download1/ {  
      limit_conn serverweiyigeektop 1000; # 示意该服务提供的总连接数最大不超过 1000,超过的申请会被回绝
      limit_conn blogweiyigeektop 4;   # 示意对 blogweiyigeektop 空间中的每个 IP 的最大并发连接数为 4
      limit_rate 200k;                 # 留神此处是对连贯的限速不是对 IP 的限速
      alias /data/www.weiyigeek.top/download1/;
    }

    # 限申请速率
    location  ^~ /download2/ {# 容许超过频率限度的申请数不多于 5 个,无提早示意申请超过频次时,可提供解决 (burst + rate) 个申请的能力,留神 nodelay 是要和 burst 配合应用的。limit_req zone=weiyigeek_top burst=5 nodelay; 
            alias /data/blog.weiyigeek.top/download2/;
    }
  }
}

<br/>

动静屏蔽歹意 IP
Step 1. 从 logs 目录下日志文件中装置指定规定查找要屏蔽的 IP 执行如下命令 awk '{print $1}' access.log |sort |uniq -c|sort -n 即可,就能够统计出 IP 的拜访次数。

68 218.76.35.4
73 42.192.96.35
94 139.155.14.45
221 223.202.212.140
  • Step 2. 自动化脚本简略实现拜访申请次数多的 IP 将进行封禁,
#! /bin/bash
log_nginx="/var/log/nginx"                # nginx 日志文件
blockfile="/usr/local/nginx/conf.d"     # ip 黑名单寄存目录
ip_tempfile="/tmp/nginx/ip.txt"        

# 取出日志中符合条件的 ip 写入 ip.txt,并过滤掉反复的
grep "/atom.xml" $log_nginx/access.log | awk '{print $1}' | sort -rn |uniq -c |awk '{print $2}' > /tmp/nginx/ip.txt

for ip in `cat /home/shell/ip.txt`;do
  result=$(grep $ip $blockfile/blockip.conf)

  #判断 ip 是否曾经被屏蔽
  if [-z "$result"]; then
 
  #剖析 ip 申请的次数
  count=$(grep $ip $log_nginx/access.log|grep "app/user/getCode"|wc -l)
 
  # 申请次数大于等于 20 次就进行屏蔽
  if [$count -ge 20]; then
    echo "deny $ip;" >> $blockfile/blockip.conf
  fi
fi
done
 
#重启 nginx
/usr/local/nginx/sbin/nginx -s reload

舒适提醒: 上述并不是一个十分好的形式,此种形式误杀显著,倡议与申请限度联结应用,于此同时咱们能够利用 Lua + redis 实现一个动静封禁与解封(这个后续在实现)。

白名单与限度联结应用:
形容: 如果 Nginx 后面有 lvs 或者 haproxy 之类的负载平衡或者反向代理,nginx 获取的都是来自负载平衡的连贯或申请,此时是不应该限度负载平衡的连贯和申请,这就须要 geo 和 map 模块设置白名单了;

geo $whiteiplist  {
  default 1;
  10.11.15.161 0;
}
map $whiteiplist $limit {
  1 $binary_remote_addr;
  0 "";
}
limit_req_zone $limit zone=one:10m rate=10r/s;
limit_conn_zone $limit zone=addr:10m;

原文连贯: https://blog.weiyigeek.top/20...

文章书写不易,如果您感觉这篇文章还不错的,请给这篇专栏【点个赞、投个币、收个藏、关个注,转个发】(世间五大情),这将对我的必定,谢谢!。

本文章起源 我的 Blog 站点 或 WeiyiGeek 公众账号 以及 我的 BiliBili 专栏 (技术交换、友链替换请邮我哟 ), 谢谢反对!(๑′ᴗ‵๑) ❤
欢送各位气味相投的敌人一起学习交换,如文章有误请留下您贵重的常识倡议,通过邮箱【master#weiyigeek.top】分割我哟!

退出移动版