nginx会进行urlencode(nginx 运行)

http://www.itjxue.com  2023-01-26 19:32  来源:未知  点击次数: 

nginx 是如何处理访问请求的

一、nginx如何选择适当的虚拟服务器来处理请求?(server匹配)

(1)基于主机名匹配来选择合适的虚拟服务器

对比请求头中的host字段与server中的server_name,选择匹配的服务器。如果都不匹配,则选择该端口所对应默认的服务器。如果没有指定默认服务器,默默为服务器列表中的第一个,可以通过listen port default_server来显示指定。值得注意的是,默认服务器是与监听端口相关的,即每个端口都可以指定一个默认服务器。

[html]?view plain?copy

server?{

listen??????80;

server_name?example.org?;

...

}

}

如果希望不处理没有指定host字段的请求,可以通过如下方式来实现:

[html]?view plain?copy

server?{

listen??????80;

server_name?"";

return??????444;

}

server_name也可以不指定,默认就是为“”,匹配没有指定host的请求。

(2)基于IP 和 主机名来选择合适的虚拟服务器

首先按照IP、端口进行匹配,匹配通过的server,再按照主机名进行匹配。如果主机名不匹配,则由默认匹配该IP、端口的默认服务器来进行处理。

[html]?view plain?copy

server?{

listen??????192.168.1.1:80;

server_name?example.org?;

...

}

}

server?{

listen??????192.168.2.1:80?;

server_name?example.net?;

...

}

}

二、nginx如何选择合适的location来处理请求(location匹配)

[html]?view plain?copy

server?{

listen??????80;

server_name?example.org?;

root????????/data/www;

location?/?{

index???index.html?index.php;

}

location?~*?\.(gif|jpg|png)$?{

expires?30d;

}

location?~?\.php$?{

fastcgi_pass??localhost:9000;

fastcgi_param?SCRIPT_FILENAME

$document_root$fastcgi_script_name;

include???????fastcgi_params;

}

}

}

location的匹配方式分两种:a.根据路径前缀来匹配 b.根据正则表达式来匹配

匹配的原则是:首先检测前缀匹配的location,选择有最大前缀的

nginx负载均衡下URL参数重写?

在使用 nginx的 cache时,使用 hash $request_uri; 再加一下行 hash_again 1;

注意,这个是Nginx的的三方模块算法,但是tengine的 consistent_hash 算法是不行的, 还是有连接转到故障后端,

通过nginx将本地请求打到开发机上

现在的工作的由于环境的隔离,所以开发需要在开发机上进行开发。

本地调试时,如果希望将请求打到开发机上起的本地服务,在windows下可以通过fiddler来进行,但是在mac下由于不存在像fiddler般简单易用的软件,所以可以使用比如nginx来进行转发。

配置起来需要如下几部:

对于nginx来讲,配置文件中关键的内容有以下几点:

日志中的内建变量

这篇文章介绍的比较详细

Nginx的日志配置参数详解

转发的规则

具体的转发规则location我们就不赘述了,有很多文章介绍。

dns的问题

在我们的场景中,我们需要一个比较特殊的情况是:我们需要拦截某些请求到本地,而希望其他的请求继续走原始的路径。但是由于我们通过了配置hosts将域名打到了本地127.0.0.1,所以如果在proxy_pass中继续配置 的话,由于仍会走本机的host,所以仍然会打到本机的nginx上。所以我们需要绕过本机的host的配置。为了解决这个问题,我们需要了解下nginx对于域名的解析规则。nginx在加载配置文件的时候,会将host加载到上下文中,然后对于配置文件中的域名会进行解析。而如果我们不希望进行该解析,则需要通过内置变量来进行。比如$http_host。这就是我们在上面的配置文件中看到了:

的原因。

以上的讨论,在文章 Nginx 教程二:利用nginx搭建静态文件服务、正向代理服务器、反向代理服务器 也有讨论,称之为正向代理,与反向代理所区别。可以理解为一个为出,一个为入。

但是,单纯的如此编辑后,仍然会存在问题,比如域名解析不出来等。此时我们需要配上域名解析器,也就是server模块:

那么有个问题就产生了,这个ip是如何产生的呢。

查找域名解析器

我们需要去查找我们的$http_host的dns服务器域名。这时候nslookup就出场了。

使用nslookup查找域名:

于是我们便获得了dns的服务器。实际如果访问的是公网的话,则直接填8.8.8.8,是Google提供的免费DNS服务器的IP地址。

其中stop和quit的区别在于quit是一种较平滑的退出。

http不返回数据,是超出了nginx返回的长度限制?还是有其他原因?

系统为了兼容emoji表情以及其他特殊符号,在数据传入时使用 urlencode() 函数处理了一下数据,并将处理后的数据保存到content字段,将原字符串存到content_bak字段,使用时将content字段先 urldecode() 一下,然后将整组数据 json_encode() 之后返回给前台。

接口一直没有任何数据返回,但http状态码为200

1.超出了nginx返回长度限制?

不对,因为直接使用 var_dump() 数组的时候是可以输出的,此输出也是nginx返回的。

2.发现 json_encode() 数组之后返回false

调试,使用 json_last_error() 函数获取错误码为 5 即对应为 JSON_ERROR_UTF8 ,说明数据里有非 utf8 的字符,是传入了一些不正常的字符吗?但就算不正常的字符也会被 urlencode() 然后存起来,所以应该不是数据内容有错误。

3.发现 json_encode() 之前的数组里有特殊的字符 ? ,在对比content_bak数据看,原因基本已经确定。

因为 content , content_bak 这两个字段是使用 TEXT(MySql) 存的,由于此次数据非常长 urlencode() 之后,长度早已超出TEXT的最长长度 65535 ,所以只存到了 urlencode() 之后字符串的第65535位置,截取了半个字符,所以在 json_encode() 时出现了 JSON_ERROR_UTF8 这种错误。

修改字段类型就可以了从 TEXT 改为参照下表

Nginx相关知识点

Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。

Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。

Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。

自行安装

正向代理: 代理服务器站在客户端那边就是正向代理;

反向代理: 代理服务器站在原始服务器那边就是反向代理;

详解参考点击 Nginx正向代理与反向代理

Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。

Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。

并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。

如果你的nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那么当你的一台机器web程序iis关闭,也就是说web不能访问,那么nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应,对用户来说体验就打打折扣,这里我们怎么避免这样的情况发生呢。这里我配张图来说明下问题。

如果负载均衡中其中web2发生这样的情况,nginx首先会去web1请求,但是nginx在配置不当的情况下会继续分发请求道web2,然后等待web2响应,直到我们的响应时间超时,才会把请求重新分发给web1,这里的响应时间如果过长,用户等待的时间就会越长。

下面的配置是解决方案之一:

如果使用upstream指令配置了一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理。

状态值可以是:error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off

Nginx提供的负载均衡策略有2种:内置策略和扩展策略。

内置策略: 1.轮询;2.加权轮询;3.Ip hash;

扩展策略: 就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他一一找出来做下实现。

Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。

eg:

开启简单的缓存配置,只需要两个指令:proxy_cache_path和proxy_cache。

proxy_cache_path: 配置缓存的存放地址和其他的一些常用配置;

proxy_cache:指令是为了启动缓存;

相关配置说明:

该指令用于定义满足条件的响应不会被保存到缓存中。在条件字符串中至少有一个条件不为空或者0,符合这样条件的响应才不会被缓存。

举例如下

其中,cookie_nocache、arg_nocache...皆为变量,可以根据你访问的匹配策略来设置,其值只有2类,0和非0;

访问匹配策略例如:

如果在此链式配置中,只要有一个值不为0,则不会cache;例如:

则不会被cache.

注:一般会配合proxy_cache_bypass共同使用;

该指令用于定义哪些情况不从cache读取,直接从backend获取资源;配置方式同proxy_no_cache。

给缓存数据定义一个键,例如

该指令用于设置缓存哪些HTTP方法,默认缓存HTTP GET/HEAD方法,不缓存HTTP POST 方法.。

设置不同响应码的缓存时间,当不指定响应码的时候,例如

只对响应码为200,301,302的访问请求资源设置缓存时间,此外可以个性化定制,例如:

此外,还可以在相应header里设置优先级更高的缓存有效时间:

不缓存包含在field的响应header,可以设置的值有:“X-Accel-Redirect”, “X-Accel-Expires”, “X-Accel-Limit-Rate”,“X-Accel-Buffering”, “X-Accel-Charset”, “Expires”, “Cache-Control”, “Set-Cookie” (0.8.44), and “Vary”。

如果上述的header field没有设置为忽略,则header filed中有“X-Accel-Expires”, “Expires”, “Cache-Control”, “Set-Cookie”, and “Vary”的话,响应会被缓存。

该指令用于设置缓存的最小使用次数,默认值为1

源站有问题时,nginx可以通过proxy_cache_use_stale指令开启容错能力,即使用缓存内容来响应客户端的请求。举例如下:

如上配置表示,当作为cache的NGINX收到源站返回error、timeout或者其他指定的5XX错误,并且在其缓存中有请求文件的陈旧版本,则会将这些陈旧版本的文件而不是错误信息发送给客户端。

使用NGINX,不需要建立一个RAID(磁盘阵列)。如果有多个硬盘,NGINX可以用来在多个硬盘之间分割缓存。举例如下:

在这份配置中,使用了3个独立的缓存,每个缓存专用一块硬盘,另外,3个独立的线程池也各自专用一块硬盘。

缓存之间(其结果就是磁盘之间)的负载均衡使用split_clients模块,split_clients非常适用于这个任务。

在 proxy_cache_path指令中设置 use_temp_path=off ,表示NGINX会将临时文件保存在缓存数据的同一目录中。这是为了避免在更新缓存时,磁盘之间互相复制响应数据。

通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息;

通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。

因此,将日志好好利用,你可以得到很多有价值的信息。

打开nginx.conf配置文件:vim /usr/local/nginx/conf/nginx.conf

日志部分内容:

#access_log logs/access.log main;

日志生成的到Nginx根目录logs/access.log文件,默认使用“main”日志格式,也可以自定义格式。

默认“main”日志格式:

参数明细表:

查看日志命令tail -f /usr/local/nginx/logs/access.log

打开nginx.conf配置文件去掉#注释见下图:

自定义某一个server配置的日志,使用“main”日志格式。

日志生成的到Nginx根目录logs/access.log文件,默认使用“main”日志格式,也可以自定义格式。

重新读取加载Nginx配置文件:

执行命令:nginx-s reload

网上一位老师写的log文件分解的脚本

此脚本执行时间根据自己公司情况来定,可以设置默认一天执行一次;

创建crontab设置作业

设置日志文件存放目录crontab -e

*/1 * * * * sh /usr/local/software/nginx/nginx_log.sh

此设置的为一分钟,如果设置一天自行修改;

默认的 nginx 配置文件 nginx.conf 内容如下

示例

几个常见配置项:

注意:

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

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

进入安装目录下的sbin

url被nginx编码了改怎么办

url被nginx编码了改怎么办

看看urldecode 和urlencode 换一个数字呗 再去后台转换 中文和特殊字要用urlencode

(责任编辑:IT教学网)

更多

推荐Flash教程文章