Nginx 配置详解

2023-05-16

Nginx 配置

文章目录

  • Nginx 配置
      • 文件结构
      • 全局配置
      • events 配置
      • http 配置
      • server 配置
  • Rewrite
      • 一、地址重写,地址转发,重定向
      • 二、URL 重写
            • 语法:
            • 使用:
      • 三、if 指令使用
          • 1、变量匹配
          • 2、判断请求的文件是否存在
          • 3、判断手机访问
          • 4、其他
      • 四、防盗链
          • 1. 根据请求文件类型实现防盗链配置实列如下:

文件结构

整体结构为嵌套结构:

  • 全局块:配置影响全局,包括运行 nginx 的用户组,进程存放,日志,配置文件等
  • events:配置影响 nginx 服务器与客户端的网络连接,包括进程最大连接数,数据驱动模型,序列化等
  • http:配置代理,缓存,日志,第三方模块等,可嵌套多个 server
    • server:配置虚拟主机的参数
      • location:配置请求路由,页面处理

举个栗子:

#全局配置------------------------------------------------------------------------
...              

#events 配置--------------------------------------------------------------------
events {
   ...
}
#http 配置----------------------------------------------------------------------
http
{
	#http 全局配置
    ...
    #server 全局配置
    server
    { 
    	#server全局配置
        ...       
        #location配置
        location [PATTERN]   
        {
            ...
        }
    }
}

惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。

全局配置

#全局配置-------------------------------------------------------------
#指定nginx运行的用户及用户组,默认为nobody
#user  nobody nobody;

#开启线程数,最大值可设逻辑CPU核数
#worker_processes  1; 

#定位全局错误日志文件,级别以notice显示,还有debug,info,warn,error,crit模式,debug输出最多,crir输出最少,根据实际环境而定
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#指定进程id的存储文件位置
#pid        logs/nginx.pid;

#指定一个nginx进程打开的最多文件描述符数目,受系统进程的最大打开文件数量限制
#worker_rlimit_nofile 65535

#envents 配置----------------------------------------------------------
events {
    ...
}

#http 配置-------------------------------------------------------------
http {
    ...
}

events 配置

events {
    #设置工作模式为epoll,除此之外还有select,poll,kqueue,rtsig和/dev/poll模式
    use epoll;
    #定义每个进程的最大连接数,受系统进程的最大打开文件数量限制
    worker_connections  1024;
}

http 配置

http {
    #主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度
    include       mime.types;
    
    #核心模块指令,默认设置为二进制流,也就是当文件类型未定义时使用这种方式
    default_type  application/octet-stream;
    
    #下面代码为日志格式的设定,main为日志格式的名称,可自行设置,后面引用
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
	                  '$status $body_bytes_sent "$http_referer" '
	                  '"$http_user_agent" "$http_x_forwarded_for"';
	#引用日志main格式
	access_log  logs/access.log  main;

    #设置允许客户端请求的最大的单个文件字节数
    client_max_body_size 20M;
    #指定来自客户端请求头的headebuffer大小
    client_header_buffer_size  32k;
    #指定连接请求试图写入缓存文件的目录路径
    client_body_temp_path /dev/shm/client_body_temp;
    #指定客户端请求中较大的消息头的缓存最大数量和大小,目前设置为4个32KB
    large client_header_buffers 4 32k;

    #开启高效文件传输模式
    sendfile        on;
    #开启防止网络阻塞
    tcp_nopush     on;
    #开启防止网络阻塞
    tcp_nodelay    on;

    #设置客户端连接保存活动的超时时间
    #keepalive_timeout  0; # 无限时间
    keepalive_timeout  65;

    #设置客户端请求读取header超时时间
    client_header_timeout 10;
    #设置客户端请求body读取超时时间
    client_body_timeout 10;

    #HttpGZip模块配置
    #开启gzip压缩
    gzip  on;
    #设置允许压缩的页面最小字节数
    gzip_min_length 1k;
    #申请4个单位为16K的内存作为压缩结果流缓存
    gzip_buffers 4 16k;
    #设置识别http协议的版本,默认为1.1
    gzip_http_version 1.1;
    #指定gzip压缩比,1-9数字越小,压缩比越小,速度越快
    gzip_comp_level 2;
    #指定压缩的类型
    gzip_types text/plain application/x-javascript text/css application/xml;
    #让前端的缓存服务器进过gzip压缩的页面
    gzip_vary on; 
    
    # server配置
    server {
        
    }    
}

server 配置

server {
    #单连接请求上限次数
    keepalive_requests 120; 
    #监听端口
    listen       88;
    #监听地址,可以是ip,最好是域名
    server_name  111.222.333.123;
    #server_name  www.123.com;
    #设置访问的语言编码
    charset utf-8;
    #设置虚拟主机访问日志的存放路径及日志的格式为main
    access_log  /www/wwwlogs/111.222.333.123.log main; #响应日志
    error_log  /www/wwwlogs/111.222.333.123.log main; #错误日志
    
    #PHP-INFO-START  PHP引用配置,可以注释或修改
    include enable-php-74.conf;
    #PHP-INFO-END
    
    #REWRITE-START URL重写规则引用
    include /www/server/panel/vhost/rewrite/111.222.333.123.conf;
    #REWRITE-END
    
    #设置主机基本信息
    #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
    location  ~*^.+$ {
    	#根目录
        root html;  
        #设置默认页
        index  index.html index.htm;
        #拒绝的ip,黑名单
        deny 127.0.0.1;  
        #允许的ip,白名单
        allow 172.18.5.54; 
    } 
    
    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }
    
    #SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }
    
	#图片资源配置
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log /dev/null;
        access_log off;
    }
    
    #网站js与css资源配置
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log off; 
    }
    
    #访问异常页面配置
    error_page  404              /404.html;
    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
		root   html;
	}
}

Rewrite

一、地址重写,地址转发,重定向

地址重写:为了标准化网址,比如输入baidu.com和www.baidu.com,都会被重写到www.baidu.com,而且我们在浏览器看到的也会是 www.baidu.com

地址转发:指在网络数据传输过程中数据分组到达路由器或桥接器后,该设备通过检查分组地址并将数据转发到最近的局域网的过程。

不同点:

  • 地址重写会改变浏览器中的地址,使之变成重写成浏览器最新的地址。而地址转发他是不会改变浏览器的地址的。
  • 地址重写会产生两次请求,而地址转发只会有一次请求。
  • 地址转发一般发生在同一站点项目内部,而地址重写且不受限制。
  • 地址转发的速度比地址重定向快。

二、URL 重写

在 Nginx 中通过在 server 或 location 中配置 rewrite 指令实现:

语法:

rewrite regex replacement [flag];

  • rewrite:该指令是实现URL重写的指令
  • regex:用于匹配URI的正则表达式
  • replacement:将regex正则匹配到的内容替换成 replacement。
  • flag:标记
    • last: 本条规则匹配完成后,继续向下匹配新的location URI 规则。(不常用)
    • break: 本条规则匹配完成即终止,不再匹配后面的任何规则(不常用)。
    • redirect: 返回302临时重定向,浏览器地址会显示跳转新的URL地址。
    • permanent: 返回301永久重定向。浏览器地址会显示跳转新的URL地址。
使用:

rewrite ^/(.*) http://www.baidu.com/$1 permanent;

  • rewrite :指令。
  • regex:正则表达式,匹配完整的域名和后面的路径地址。
  • replacement:$1是取regex部分()里面的内容。如果匹配成功后跳转到的URL。
  • **flag;**permanent,代表永久重定向的含义,即跳转到 http://www.baidu.com/$1 地址上。

正则表达式

字符描述
\转义字符标记,如 \n匹配一个换行符,而\$则匹配$
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次。如ol*能匹配oololl
+匹配前面的字符一次或多次。如ol+能匹配ololloll,但不能匹配o
?匹配前面的字符零次或一次,例如do(es)?能匹配do或者does?等效于{0,1}
.匹配除“\n之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如[.\n]之类的模式。
(pattern)匹配括号内pattern并可以在后面获取对应的匹配,常用$0...$9属性获取小括号中的匹配内容,要匹配圆括号字符需要\(Content\)

三、if 指令使用

语法:

if (condition) {
  // ....
}

Rewrite 可以使用的全局变量

  • $args: 该变量中存放了请求URL中的请求指令。比如 http://127.0.0.1:3001?arg1=value1&arg2=value2 中的 arg1=value1&arg2=value2
  • $content_length: 该变量中存放了请求头中的Content-length字段
  • $content_type: 该变量中存放了请求头中的 Content-type字段
  • $document_root: 该变量中存放了针对当前请求的根路径
  • $document_uri: 该变量中存放了请求的当前URI, 但是不包括请求指令。比如 http://xxx.abc.com/home/1?arg1=value1& arg2=value2; 中的 /home/1
  • $host: 变量中存放了请求的URL中的主机部分字段,比如http://xxx.abc.com:8080/home中的 xxx.abc.com
  • ** h t t p h o s t ∗ ∗ : 该 变 量 与 http_host**: 该变量与 httphost:host唯一区别带有端口号:比如上面的是 xxx.abc.com:8080
  • $http_user_agent: 变量中存放客户端的代理信息
  • $http_cookie, 该变量中存放客户端的cookie信息
  • $remote_addr 该变量中存放客户端的地址
  • $remote_port 该变量中存放了客户端与服务器建立连接的端口号
  • $remote_user 变量中存放客户端的用户名
  • $request_body_file 变量中存放了发给后端服务器的本地文件资源的名称
  • $request_method 变量中存放了客户端的请求方式,比如 ‘GET’、'POST’等
  • $request_filename 变量中存放了当前请求的资源文件的路径名
  • $request_uri 变量中存放了当前请求的URI,并且带请求指令
  • ** q u e r y s t r i n g ∗ ∗ 和 变 量 query_string** 和变量 querystringargs含义一样
  • $scheme 变量中存放了客户端请求使用的协议,比如 ‘http’, 'https’等
  • $server_protocol 变量中存放了客户端请求协议的版本, 比如 ‘HTTP/1.0’、‘HTTP/1.1’ 等

正则表达式:

1、变量匹配
  • ~:表示匹配过程中对大小写敏感
  • ~*:表示匹配过程中对大小写不敏感
  • !~ :如果~匹配失败时,那么该条件就为true
  • !~*':如果 ~* 匹配失败时,那么该条件就为true

举个栗子:

if ($http_user_agent ~ MSIE) {
	...
}

含义:$http_user_agent值中是否含有 MSIE 字符串,如果包含为true,否则为false

2、判断请求的文件是否存在
if (-f $request_filename) {
  # 判断请求的文件是否存在
}

if (!-f $request_filename) {
  # 判断请求的文件是否不存在
}

其他指令:

  • -f和!-f用来判断请求文件是否存在
  • -d和!-d用来判断请求目录是否存在
  • -e和!-e用来判断是请求的文件或者目录否存在
  • -x和!-x用来判断请求的文件是否可执行
3、判断手机访问
if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" ){
  rewrite ^/$  http://www.cnblogs.com  permanent;
}
4、其他

现在我们使用if指令来对nginx加一些判断;比如说我们访问http://xxx.abc.com:8080/home时候,如果$host = ‘xxx.abc.com’ 的时候,就做重定向跳转,nginx配置代码如下:

server {
  listen 8088;
  server_name xxx.abc.com;
  location / {
    proxy_pass http://127.0.0.1:3001;
    if ($host = 'xxx.abc.com') {
      rewrite ^/(.*) http://www.cnblogs.com redirect;
    }
  }
}

四、防盗链

https://www.cnblogs.com/tugenhua0707/p/10798762.html

什么是防盗链?

盗链可以理解盗图链接,也就是说把别人的图片偷过来用在自己的服务器上,那么防盗链可以理解为防止其他人把我的图片盗取过去。

防盗链的实现原理:

客户端向服务器端请求资源时,为了减少网络带宽,提高响应时间,服务器一般不会一次将所有资源完整地传回客户端。比如请求一个网页时,首先会传回该网页的文本内容,当客户端浏览器在解析文本的过程中发现有图片存在时,会再次向服务器发起对该图片资源的请求,服务器将存储的图片资源再发送给客户端。但是如果这个图片是链接到其他站点的服务器上去了呢,比如在我项目中,我引用了的是淘宝中的一张图片的话,那么当我们网站重新加载的时候,就会请求淘宝的服务器,那么这就很有可能造成淘宝服务器负担。因此这个就是盗链行为。因此我们要实现防盗链。

实现防盗链:

使用http协议中请求头部的Referer头域来判断当前访问的网页或文件的源地址。通过该头域的值,我们可以检测访问目标资源的源地址。如果目标源地址不是我们自己站内的URL的话,那么这种情况下,我们采取阻止措施,实现防盗链。但是注意的是:Referer头域中的值是可以被更改的。因此该方法也不能完全安全阻止防盗链。

使用Nginx服务器的Rewrite功能实现防盗链。

Nginx中有一个指令 valid_referers. 该指令可以用来获取 Referer 头域中的值,并且根据该值的情况给 Nginx全局变量 invalidreferer赋值。如果Referer头域中没有符合validreferers指令的值的话,invalidreferer赋值。如果Referer头域中没有符合validreferers指令的值的话,invalid_referer变量将会赋值为

valid_referers 指令基本语法如下:

valid_referers none | blocked | server_names | string

none: 检测Referer头域不存在的情况。

blocked: 检测Referer头域的值被防火墙或者代理服务器删除或伪装的情况。那么在这种情况下,该头域的值不以"http://" 或 “https://” 开头。

server_names: 设置一个或多个URL,检测Referer头域的值是否是URL中的某个。

因此我们有了 valid_referers指令和$invalid_referer变量的话,我们就可以通过 Rewrite功能来实现防盗链。
下面我们介绍两种方案:第一:根据请求资源的类型。第二:根据请求目录。

1. 根据请求文件类型实现防盗链配置实列如下:
server {
  listen 8080;
  server_name xxx.abc.com
  location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
    valid_referers none blocked www.xxx.com www.yyy.com *.baidu.com  *.tabobao.com;
    if ($invalid_referer) {
      rewrite ^/ http://www.xxx.com/images/forbidden.png;
    }
  }
}

如上基本配置,当有网络连接对以 gif、jpg、png为后缀的图片资源时候、当有以swf、flv为后缀的媒体资源时、或以 rar、zip为后缀的压缩资源发起请求时,如果检测到Referer头域中没有符合 valid_referers指令的话,那么说明不是本站的资源请求。

location ~* ^.+.(gif|jpg|png|swf|flv|rar|zip)$ 该配置的含义是 设置防盗链的文件类型。

valid_referers none blocked www.xxx.com www.yyy.com *.baidu.com *.tabobao.com; 可以理解为白名单,允许文件链出的域名白名单,如果请求的资源文件不是以这些域名开头的话,就说明请求的资源文件不是该域下的请求,因此可以判断它是盗链。因此如果不是该域下的请求,就会使用 Rewrite进行重定向到 http://www.xxx.com/images/forbidden.png 这个图片,比如这张图片是一个x或其他的标识,然后其他的网站就访问不了你这个图片哦。

  1. 根据请求目录实现防盗链的配置实列如下:
server {
  listen 8080;
  server_name xxx.abc.com
  location /file/ {
    root /server/file/;
    valid_referers none blocked www.xxx.com www.yyy.com *.baidu.com  *.tabobao.com;
    if ($invalid_referer) {
      rewrite ^/ http://www.xxx.com/images/forbidden.png;
    }
  }
}

其他栗子

例子一(域名跳转):
    server {
            listen 80;
            server_name   abc.com;
            rewrite   ^/(.*)     http://www.ab c.com/$1 permanent;  # 跳转到www.abc.com网址上
        }
例子二:
  server {
            listen 80;
            server_name   www.myweb.com www.web.info
            if($host ~ myweb\.info){                        #"."需要使用“\”转义,这里是匹配到www.web.info时
                     rewrite ^(.*)  http://www.myweb.com/&1 permanent;   #永久重定向到http://www.myweb.com网址上&1是匹配的uri
            }
        }
例子三(防盗链):
location ~* \.(gif|jpg|png|swf|flv)$ {
    valid_referers none blocked www.vison.com www.wsvison.com;  #这里表示Referer头域中的值是none或者blocked或者后面这些网址才会返回去正常的gif|jpg|png|swf|flv文件,否则执行下面if块代码
    if ($invalid_referer) {  #上面没有匹配成功,$invalid_referer值为1,否则为0
        return 404;
    } //防盗链
}       
其他例子:    
if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
} //如果UA包含"MSIE",rewrite请求到/msid/目录下

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
 } //如果cookie匹配正则,设置变量$id等于正则引用部分

if ($request_method = POST) {
    return 405;
} //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302

if ($slow) {
    limit_rate 10k;
} //限速,$slow可以通过 set 指令设置

if (!-f $request_filename){
    break;
    proxy_pass  http://127.0.0.1; 
} //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查

if ($args ~ post=140){
    rewrite ^ http://example.com/ permanent;
} //如果query string中包含"post=140",永久重定向到example.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx 配置详解 的相关文章

随机推荐

  • C中需要检验其执行是否成功的函数(检验返回值)

    一 malloc xff08 xff09 因为当内存分配完了后 xff0c 就无法再分配空间了 xff0c 所以malloc失败也是有的是 xff0c 当malloc失败时返回NULL char s 61 void malloc SIZE
  • 《Java核心技术 卷1》

    目录 第4章 对象和类 lt 1 gt 静态字段和静态方法 lt 2 gt 初始化块 lt 3 gt 定义抽象类的对象变量 lt 4 gt hashCode方法得到散列码 lt 5 gt 虚拟机中的泛型类型信息 第五章 继承 第6章 接口
  • Kalibr 之 Camera-IMU 标定 (总结)

    Overview 欢迎访问 持续更新 xff1a https cgabc xyz posts db22c2e6 ethz asl kalibr is a toolbox that solves the following calibrati
  • VMware Workstations Pro 14 建立的虚拟机目录无法删除

    起因 通过VMware新建的RedHat虚拟机 xff0c 无意间的强制关机 xff0c 导致该虚拟机开机黑屏无法正常开启 xff0c 而且也关不掉 尝试删除自己创建的虚拟机目录文件 xff0c 提示文件被占用 通过任务管理器想要结束相关进
  • 矩形目标检测

    身份证 名片 书籍 考试试卷 答题卡这些检测目标都属于矩形目标检测 一 xff0c 现有技术 传统检测方法思路 xff1a 第一步 xff0c 采用滑动窗口 xff0c 设置不同的大小 xff0c 遍历图像 xff0c 得到一些目标的候选框
  • 几种常用通信协议

    通信可以形象的比喻成两个人讲话 xff1a 1 你说的别人得能听懂 xff1a 双方约定信号的协议 2 你的语速别人得能接受 xff1a 双方满足时序要求 一 IIC协议 xff1a 2C串行总线一般有两根信号线 xff0c 一根是双向的数
  • 基础篇——树莓派远程连接工具VNC不显示视频或摄像头画面解决方式

    背景故事 在树莓派上打开摄像头 xff0c 发现HDMI输出的桌面有画面 xff0c 但VNC这边没有画面 xff1b 之前有一次使用播放器播放视频也出现这个问题 xff0c 现记录解决方式 原因分析 VNC远程桌面并不是使用画面传输的方式
  • 穿越机(无人机航模)电池组装教程-电线接口

    对于动手能力强 xff0c 或者穷逼来说 xff0c 购买品牌电池玩穿越机 xff0c 或者其他航模 是非常浪费钱的 本着能自己干就不需要厂商辛苦的原则 电池组装 xff0c 我们可以自己做 非航模圈的电池 xff0c 一般都需要自带平衡电
  • UITextView

    闪退问题 scrollViewDidScroll 改为 scrollViewWillBeginDragging 禁止编辑 text setEditable NO 光标位置输入 64 param emoji 要输入的内容emoji和字符 vo
  • iView 滚动条样式

    滚动条样式 webkit scrollbar width 6px height 6px webkit scrollbar thumb background ccc webkit scrollbar track background e1e1
  • 英特尔 RealSense D415 + OpenCV 4.0 + VS2017 配置方法

    首先是Opencv 4 0 43 VS2017的配置过程 xff0c 网上已经有很多类似教程 xff0c 这里不再累赘 xff1a https www cnblogs com xinxue p 5766756 html 接下来开始配置D41
  • Android 系统调用实现函数功能--SVC指令的实现与检测

    0x0 简述 xff1a arm android中通过一些反编译的工具分析ELF文件时 xff0c 根据一些导入的系统函数可以很轻松的找到一些功能代码的实现 xff1a 查看libc中分析这些函数的实现 xff1a arm中通过SVC指令实
  • Docker学习笔记(九):Docker +Jenkins +Github持续集成

    本次配置时 xff0c jenkins需要配置在外网可访问的服务器上 xff0c 因为在git push内容到github时 xff0c 触发Webhooks并推送到jenkins服务器上 1 配置Github xff08 通过秘钥登录 x
  • opencv-python 常用函数介绍

    目录 imread xff1a 读取图片 imshow xff1a 展示图片 resize xff1a 图片等比例缩放 split xff1a 获取所有像素的颜色值 merge xff1a 根据颜色值合成图片 VideoCapture xf
  • redis 内存占用分析

    在Redis命令行中 xff0c 执行MEMORY STATS命令查询内存使用详情 Redis实例的内存开销主要由两部分组成 xff1a 业务数据的内存开销 xff0c 该部分一般作为重点分析对象 非业务数据的内存开销 xff0c 例如主备
  • php laravel 分析 redis 各个key的内存占用情况

    lt php namespace App Console Commands Tools use Illuminate Console Command use Illuminate Support Facades DB class Redis
  • centos7手动修改dns

    DNS是计算机域名系统 Domain Name System 或Domain Name Service 的缩写 xff0c 它是由域名解析器和域名服务器组成的 域名服务器是指保存有该网络中所有主机的域名和对应IP地址 xff0c 并具有将域
  • 查看并关闭占用端口

    查看占用端口 sudo lsof i 8888 关闭占用端口 sudo kill 9 2558243
  • 从水果连连看到两条序列比对

    一 序列比对 Sequence Alignment 序列比对 xff08 sequence alignment xff09 xff0c 目前是生物信息学的基本研究方法 算法类似于连连看 xff0c 规则是上下两个水果一样 xff0c 就可以
  • Nginx 配置详解

    Nginx 配置 文章目录 Nginx 配置文件结构全局配置events 配置http 配置server 配置 Rewrite一 地址重写 xff0c 地址转发 xff0c 重定向二 URL 重写语法 xff1a 使用 xff1a 三 if