您的位置:首页 > 运维架构 > Nginx

### Nginx代理

2017-01-07 15:03 134 查看

Nginx代理

代理其实细分为三种,分别为正向代理、反向代理,透明代理,而我们经常说的“代理”,其实是指的正向代理

正向代理

当我们要访问Google时,因为GFW缘故,所以国内的主机是访问不了的,而这时有一台主机能够访问到,这时就可以通过这台主机代理来访问,这就是简单理解正向代理的含义。

所以客户端是知道正向代理服务器存在的,而且客户端要进行一些设置才能使用正向代理的

正向代理优点:

1、访问无法访问的资源,例如翻墙

2、控制访问权限,例如限制不同用户访问不同的资源

nginx正向代理实现:

server {
resolver 8.8.8.8;

listen 8080;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
}
}
1、配置解析服务器地址
2、不能配置server_name
3、proxxy_pass指令需要注意

目前不支持代理https,nginx是可以处理https请求的,但是正向代理不支持https,因为客户端同nginx代理服务器之间建立连接失败,可以是squid实现。


nginx正向代理踩的坑:

server {
listen       80;
resolver 223.5.5.5;
location / {
root   html;  记得要注释掉
index  index.html index.htm;  要注释掉
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
}
}

设置的代理端口是80端口,但是没有将root和index去掉,当客户端设置好了代理后,因为此时服务器80端口的请求因为root和index的原因,还是会去html这个目录下寻找文件,导致出现解析不了的问题,所有记得要注释掉这两行。

如果代理是正确的,可以去查看access.log日志文件,会有相关的记录,例如:
222.73.202.226 - - [07/Jan/2017:11:05:54 +0800] "GET http://www.tony9.cn/?p=83 HTTP/1.1" 200 19831 "http://www.tony9.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"


总结:

nginx总体来说正向代理的性能是不高的,因为首先nginx不支持CONNECT,所有不支持https,然后nginx正向代理需要dns解析,而nginx的设计者当初也不是用于正向代理的,所有如果追求正向代理高性价,可以去尝试使用squid。

反向代理

反向代理正好相反,客户端不知道反向代理服务器的存在,反向代理服务器相对而言更像客户端要访问的原始服务器

作用:

1、保护并隐藏原始服务器,例如原始服务器的防火墙只允许反向代理服务器进行访问

2、实现负载均衡

3、实现缓存

1、nginx 反向代理实现:

location / {
proxy_pass http://test10.tony9.cn; 后端服务器
proxy_set_header X-Real-IP $remote_addr; 设置日志为客户端IP,不是代理服务器IP
}


2、nginx 负载均衡实现:

upstream test10.tony9.cn{
server 192.168.0.236; 后端服务器IP
server 192.168.0.79;
}
server {
location / {
proxy_pass  http://test10.tony9.cn; 负载均衡的名称为test10.tony9.cn
}
}


upstream支持的状态参数:

1、down,表示当前的server暂时不参与负载均衡。

2、backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

3、max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

4、fail_timeout,在经历了max_fails次失败后,暂停服务的时间。

当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能backup。

例如进行健康状态检查,max_fails可以和fail_timeout一起使用:

upstream webservers {
server 192.168.0.236 max_fails=2 fail_timeout=2;
server 192.168.0.79 max_fails=2 fail_timeout=2;
}


配置sorry_server,当后端两台都不能访问时,可以让其访问backup

upstream webtest {
server 192.168.0.236 max_fails=2 fail_timeout=2;
server 192.168.0.79 max_fails=2 fail_timeout=2;
server 127.0.0.1:8000 backup;
}
location / {
proxy_pass http://webtest; }
在代理服务器上在创建一个虚拟server:
server {
listen 8000;
server_name  localhost;

location / {
root   /usr/local/nginx/html2;
index  index.html index.htm;
}
}
创建8000服务器的根目录:
mkdir /usr/local/nginx/html2
echo "<h1>sorry</h1>" /usr/local/nginx/html2/index.html


负载均衡算法:

1、轮询(默认),每个请求按时间顺序逐一分配到不同的后端服务器,Weight值越大,分配到的访问机率越高

2、ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。

3、nginx缓存实现:

upstream webtest {
server 192.168.0.236 max_fails=2 fail_timeout=2;
server 192.168.0.79 max_fails=2 fail_timeout=2;
server 127.0.0.1:8000 backup;
}
proxy_cache_path /data/nginx/cache/webtest levels=1:2 keys_zone=webtest:10m max_size=1g ;  指定缓存的路径和一些其他参数
server {
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
location / {
proxy_cache my_cache;  启用缓存
proxy_pass http://webtest; proxy_cache_valid 200 10m;
}
}
proxy_cache_valid一定要设置,这个是为不同的应答设置不同的缓存时间,不设置将不会缓存
还有要检测缓存状态,可以添加http头部,add_header

之后需要将缓存目录建起来:mkdir /path/to/cache/my_cache
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息