<!-- 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.bz2tar -jxf pcre-8.45.tar.bz2 && cd pcre-8.45./configuremake  && sudo make install
  • zlib – 反对标头压缩, NGINX Gzip 模块须要。

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

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

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

# https://nginx.orgsudo 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.gztar 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 -Vnginx version: nginx/1.21.6built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04)built with OpenSSL 1.1.1n  15 Mar 2022TLS 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 -l3

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 variableNGX_VER=1.16.1NGX_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<<EOFserver {    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>EOFfi    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<<END127.0.0.1 v1.weiyigeek.top v2.weiyigeek.topEND

流程步骤:

  • 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]# ls50x.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或POSTrequest_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/htmlaccess_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 HTTPSserver {  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压缩,

配置示例:

# 开启gzipgzip 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 ModifiedServer: nginxDate: Fri, 01 Apr 2022 09:19:09 GMTLast-Modified: Wed, 30 Mar 2022 15:42:30 GMTConnection: keep-aliveETag: "62447a66-35db"Expires: Fri, 08 Apr 2022 09:19:09 GMT # 示意资源过期工夫,由以后拜访工夫加上max-age指令值所得Cache-Control: max-age=604800          # 应用max-age指令指定组件被缓存多久,正数示意no-cache,负数或零示意max-age=timeAccess-Control-Allow-Origin: *.weiyigeek.topAccess-Control-Allow-Methods: GET,POSTAccess-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: httpSyntax: 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 [code ...] 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.473 42.192.96.3594 139.155.14.45221 223.202.212.140
  • Step 2.自动化脚本简略实现拜访申请次数多的IP将进行封禁,
#! /bin/bashlog_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.txtfor 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  fifidone #重启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】分割我哟!