nginx - location 路径映射/反向代理/负载均衡/伪静态 Linux教程 nginx&apache


---反向代理配置

location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_pass  http://127.0.0.1:8181;
   }
   
location ~.*\.(php|jsp|cgi|asp|aspx|flv|swf|xml)?$  {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_pass http://127.0.0.1:8181;
  }

  

---负责均衡配置

-定义集群
upstream demo{
        server localhost: 192.168.0.61;
        server localhost: 192.168.0.62;
}
listen  8080;
server_name  localhost;
location / {
   proxy_pass http://demo; 
}


#  locat 路径映射

= 表示精确匹配,如果找到,立即停止搜索并立即处理此请求。

~ 表示执行一个正则匹配,区分大小写匹配

~* 表示执行一个正则匹配,不区分大小写匹配

!~ 区分大小写不匹配

!~* 不区分大小写不匹配

^~ 即表示只匹配普通字符(空格)。使用前缀匹配,^ 表示 “非”,即不查询正则表达式。如果匹配成功,则不再匹配其他 location。

@ 指定一个命名的 location,一般只用于内部重定向请求。例如 error_page, try_files

uri 是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式;


---优先级

location = / {
    # 精确匹配/,主机名后面不能带任何字符串 /
    # 只匹配http://abc.com
    # http://abc.com [匹配成功]
    # http://abc.com/index [匹配失败]
}
location ^~ /img/ {
      #以 /img/ 开头的请求,都会匹配上
    #http://abc.com/img/a.jpg   [成功]
    #http://abc.com/img/b.mp4  [成功]
    }
location ~* /Example/ {
  # 则会忽略 uri 部分的大小写
  #http://abc.com/test/Example/ [匹配成功]
  #http://abc.com/example/ [匹配成功]
}
location /documents {
    # 如果有正则表达式可以匹配,则优先匹配正则表达式。
    #http://abc.com/documentsabc [匹配成功]
}
location / {
    #http://abc.com/abc [匹配成功]
}


---#禁止访问某个目录

location / {
    allow 192.168.0.0;
    allow 127.0.0.1;
    deny all;
#这段配置值允许192.168.0./24网段和127.0.0.1的请求,其他来源IP全部拒绝。
}


# nginx 访问控制

location ~ \.php$ {
    allow 127.0.0.1;  #只允许127.0.0.1的访问,其他均拒绝
    deny all;


#禁止访问的文件或目录

location ~^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) {
        return 404;
}


# 丢弃不受支持的文件扩展名的请求

location ~ \.(js|css|sql)$ {
    deny all;
}


# 不记录访问日志

-请求favicon.ico时,不记录日志

location /favicon.ico {
access_log off;
return 200;
}

-当有人访问gif、png等资源时,将日志丢入空

location ~* .*\.(gif|jpg|png|css|js)$ {
 access_log /dev/null;
}


# deny_spider

if ($http_user_agent ~* "(majestic12|ahrefs)") {
return 403;
}   
if ($http_user_agent ~* "(HTTrack|harvest|audit|dirbuster|pangolin|nmap|sqln|-scan|hydra|Parser|libwww|BBBike|sqlmap|w3af|owasp|Nikto|fimap|havij|PycURL|zmeu|BabyKrokodil|netsparker|httperf|bench| SF/)") {
return 403;
}


# deny_unsafe_location

location ~* \.(git/|hg/|svn/|sass-cache/|idea/|cache/|project/|htaccess) {
    deny all;
}   
location ~* \.(bak|inc|old|mdb|sql|backup|java|class)$ {
    deny all;
}
location ~ /\. {
    deny all;
}   
location ~* /Runtime/ {
    deny all;
}
location ~* "/(attachments|upimg|images|css|uploadfiles|html|uploads|templets|static|template|data|inc|forumdata|upload|includes|cache|avatar)/.*\.php" {
    deny all;
}

if ($uri ~* "\.(php|jsp|asp|aspx|py|pl|rb|go|do)") {
	return 403;
}

location ~ ^/assets/.*\.php$ {
        deny all;
}


# 配置允许/不允许IP地址

-阻止了一个IP地址列表。
http {
      ...
          deny 192.168.1.100;
      ...
}
-使用地理指令来阻止一个范围的IP地址
http {
      ...
          geo $block_ips {
                    default 0;
                    192.168.1.0/24 1;  # 符合这个ip返回1
                    192.168.2.0/24 1;
          }
          server {
                ...
                        if ($block_ips) {
                                      return 403;
                        }
                ...
          }
      ...
}


# location指令说明

location  [ = | ~ | ~* | ^~] url { 
}

=:用于不含正则表达式的url前,要求字符串与url严格匹配,匹配成功就停止向下搜索并处理请求

~:用于表示url包含正则表达式,并且区分大小写。

~*:用于表示url包含正则表达式,并且不区分大瞎写

^~:用于不含正则表达式的url前,要求ngin服务器找到表示url和字符串匹配度最高的location后,立即使用此location处理请求,而不再匹配

如果有url包含正则表达式,不需要有~开头标识


正则表达式匹配 :
~      为区分大小写的匹配
~*     不区分大小写的匹配(匹配firefox的正则同时匹配FireFox)
!~     区分大小写的不匹配
!~*    不区分大小写的不匹配
 
\      将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用
.      匹配除换行符以外的任意字符,即匹配除"\n"之外的所有单个字符
\w     匹配字母或数字或下划线或汉字
\s     匹配任意的空白符
\d     匹配数字
\b     匹配单词的开始或结束
^      匹配字符串的开始,即匹配输入字符串的起始位置
$      匹配字符串的结束,即匹配输入字符串的结束位置
  
*      重复零次或更多次,即匹配前面的字符零次或者多次
+      重复一次或更多次,即匹配前面字符串一次或者多次
?      重复零次或一次,即匹配前面字符串的零次或者一次
{n}    重复n次
{n,}   重复n次或更多次
{n,m}  重复n到m次
*?     重复任意次,但尽可能少重复
+?     重复1次或更多次,但尽可能少重复
??     重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}?  重复n次以上,但尽可能少重复
  
\W     匹配任意不是字母,数字,下划线,汉字的字符
\S     匹配任意不是空白符的字符
\D     匹配任意非数字的字符
\B     匹配不是单词开头或结束的位置
[^x]   匹配除了x以外的任意字符
  
文件及目录匹配,其中:
-f和!-f   用来判断是否存在文件
-d和!-d   用来判断是否存在目录
-e和!-e   用来判断是否存在文件或目录
-x和!-x   用来判断文件是否可执行
  
flag标记有:
last    相当于Apache里的[L]标记,表示完成rewrite。即本条规则匹配完成后继续向下匹配新的location URI规则
break    终止匹配, 不再匹配后面的规则。即本条规则匹配完成后终止,不在匹配任何规则
redirect    返回302临时重定向 地址栏会显示跳转后的地址
permanent   返回301永久重定向 地址栏会显示跳转后的地址
  
$args    此变量与请求行中的参数相等
$content_length    等于请求行的“Content_Length”的值。
$content_type    等同与请求头部的”Content_Type”的值
$document_root    等同于当前请求的root指令指定的值
$document_uri 与 $uri 一样
$host    与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样
$limit_rate     允许限制的连接速率
$request_method    等同于request的method,通常是“GET”或“POST”
$remote_addr    客户端ip
$remote_port    客户端port
$remote_user    等同于用户名,由ngx_http_auth_basic_module认证
$request_filename    当前请求的文件的路径名,由root或alias和URI request组合而成
$request_body_file
$request_uri    含有参数的完整的初始URI
$query_string 与 $args一样
$server_protocol   等同于request的协议,使用“HTTP/1.0”或“HTTP/1.1”
$server_addr request 到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。
$server_name    请求到达的服务器名
$server_port    请求到达的服务器的端口号
$uri   等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index


---location中的rewrite,不写last和break,那么流程就是依次执行这些rewrite

rewrite btrak:表示url重写后,直接使用当前资源,不再执行location里余下的语句,完成本次请求后,地址url不变。

rewrite last:表示url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到就报500错误,地址栏url不变。

rewrite redirect:表示返回302临时重定向,地址栏显示重定向后的url,爬虫不会重写url,因为是临时。

rewrite permanent:表示返回301永久重定向,地址栏显示重定向后的url,爬虫重写url。


---rewrite重写跳转的应用场景

1.  调整用户浏览的URL,看起来规范

2.  为了让搜索引擎收录网站内容,让用户体验更好

3.  网站更换新域名后

4.  根据特殊的变量、目录、客户端信息进行跳转


---匹配判断

~ 为区分大小写匹配; !~为区分大小写不匹配

~* 为不区分大小写匹配;!~为不区分大小写不匹配


---文件和目录判断

-f和!-f判断是否存在文件

-d和!-d判断是否存在目录

-e和!-e判断是否存在文件或目录

-x和!-x判断文件是否可执行


---禁止执行PHP权限

-多个目录去掉PHP执行权限
location ~ /(attachments|upload)/.*.(php|php5)?$ {
deny all;
}

---禁止attachments和upload目录执行PHP权限

-过滤多个目录url中带PHP的链接
-在server模块中写就行
if ($request_uri ~*  ^/(mm|upload|sher|ce|jd|hb)/(.*)php(.*)$) {
         return 403;
}
-访问上面目录链接中有php就会返回403


---禁止别人访问项目下的一些文件和目录

-排除nginx、logs、config目录下的文件
-排除以.txt .rar .jar结尾的文件(不仅仅是根目录下的,范围是所有
location ~ ^/(nginx|logs|config) {
    deny all;
    return 404;
}
location ~ ^/.*(txt|rar|jar)$ {
    deny all;
    return 404;
}

---nginx 配置图片直接下载不打开

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    add_header Content-Disposition attachment;                   
}

---禁止访问某个目录下的 php 后缀文件

location /directory {
    location ~ .*\.(php)?$ {
    deny all;
    }
}

---禁止访问多个目录下的 php 后缀文件

location ~* ^/(directory1|directory2)/.*\.(php)${
    deny all;
}

---禁止访问目录

location ^~ /test/ {
    deny all;
}

---禁止访问目录下文件

location ^~ /test {
    deny all;
}

---禁止访问某些后缀文件

location ~ \.(ini|conf|txt)$ {
    deny all;
}

---acme-challenge

#acme-challenge
    location ^~ /.well-known/acme-challenge/ {
      alias /data/site/htmltoo.site/acme-challenge/;
      allow all;
      try_files $uri = 404;
    }
#acme-challenge

#动静分离示例

upstream web_servers {
       server localhost:8081;
       server localhost:8082;
}
server {
    listen       80;
    server_name  localhost;
    set $doc_root /usr/local/var/www;
    location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
       root $doc_root/img;
    }
    location / {
        proxy_pass http://web_servers;
        proxy_set_header Host $host:$server_port;
    }
    error_page 500 502 503 504  /50x.html;  #出现 500 502 503 504错误时走内部跳转
    location = /50x.html { 
        root $doc_root;
    }
 }

#deny 、allow 指令

#禁止访问某个目录
location / {
    allow 192.168.0.0;
    allow 127.0.0.1;
    deny all;
#这段配置值允许192.168.0./24网段和127.0.0.1的请求,其他来源IP全部拒绝。
}

#优先级和示例

• [不加] < [~/~*] < [^~] < [=]

• 示例如下:
location = / {
    # 精确匹配/,主机名后面不能带任何字符串 /
    # 只匹配http://abc.com
    # http://abc.com [匹配成功]
    # http://abc.com/index [匹配失败]
}
location ^~ /img/ {
      #以 /img/ 开头的请求,都会匹配上
    #http://abc.com/img/a.jpg   [成功]
    #http://abc.com/img/b.mp4  [成功]
    }
location ~* /Example/ {
  # 则会忽略 uri 部分的大小写
  #http://abc.com/test/Example/ [匹配成功]
  #http://abc.com/example/ [匹配成功]
}
location /documents {
    # 如果有正则表达式可以匹配,则优先匹配正则表达式。
    #http://abc.com/documentsabc [匹配成功]
}
location / {
    #http://abc.com/abc [匹配成功]
}


---可配置 https 的访问

server {
    listen 80;
    server_name one-api.example.com;
    location /{
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        # 流式
        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_cache off;
        # 设置等待响应的时长
        proxy_send_timeout          300;
        # proxy_connect_timeout       300;
        # proxy_read_timeout          300;
        # send_timeout                300;
    }
}


---反向代理

server {
   listen 80;
   server_name your.domain.com;
   location / {
      proxy_pass https://generativelanguage.googleapis.com;
      proxy_set_header Host generativelanguage.googleapis.com;
      proxy_ssl_server_name on;
      proxy_cache off;
      proxy_buffering off;
      proxy_connect_timeout 7200;
   }
}


---huggingface.co 流式反向代理

server {
    listen 80;
    server_name  hf.htmltoo.com;
    charset utf-8; 
    server_tokens off;
    ignore_invalid_headers off;
    client_max_body_size 0;
    access_log  /dev/null;
    error_log  /dev/null crit;
    #HTTP_TO_HTTPS_START
    include /etc/nginx/conf.d/https/tohttps.ini;
    include /etc/nginx/conf.d/https/htmltoo.ini;     
    #HTTP_TO_HTTPS_END
    location / {
        proxy_pass https://huggingface.co;
        proxy_set_header Host huggingface.co;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 反向代理
        expires 0;
        proxy_ssl_server_name on;
        proxy_connect_timeout 7200;
        # 流式
        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_cache off;
        # 设置等待响应的时长
        proxy_send_timeout 300;
    }
    #pagespeed-START
    #include /etc/nginx/conf.d/pagespeed.ini;
    #pagespeed-_END
}


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回