Nginx是一个高性能的HTTP和反向代理WEB服务器。Nginx具有占用内存小,并发能力强的特点,是搭建WEB服务的常用工具。
我们在开发板上实践Nginx反向代理配置。
1.关于代理
代理分为正向代理和反向代理。
1.1 正向代理(Forward Proxy)
正向代理是位于客户端和应用服务器之间的代理服务器,为了从应用服务器获取内容,客户端向代理服务器发送请求,然后代理服务器向应用服务器转交请求并将获取的内容返回给客户端。客户端需要配置代理才能使用正向代理。
1.2 反向代理(Reverse Proxy)
反向代理与正向代理相反,对于客户端而言,代理服务器就像是应用服务器,客户端向反向代理发送请求,反向代理向隐藏在反向代理后面真正的应用服务器转发请求,最后将获得的内容返回给客户端。客户端不需要进行任何代理相关的设置。
通常来看,反向代理的作用主要有两个:
1. 隐藏和保护应用服务器
这个很容易理解,在客户端请求过程中,客户端并不访问真正的应用服务器,只是跟反向代理交互,反向代理很好的屏蔽了应用服务器。
2. 负载均衡
受硬件条件的限制,一台应用服务器的响应能力是有限的。当用户的访问量超过了一台应用服务器的处理能力时,就需要增加应用服务器,或者搭建应用服务器集群。这时,反向代理就可以根据配置的权重向多台应用服务器转发请求,避免单台服务器能力不足的问题。如果用户的访问量超过了一台反向代理服务器的处理能力时,还需要搭建反向代理服务器集群。
2.配置反向代理
在sites-enabled新增两个虚拟主机,分别为监听8080端口和8090端口的WEB服务器,可以直接拷贝default配置进行修改。目录结构如下:
jishu@Jishu:/etc/nginx/sites-enabled$ ls
8080 8090 default
8080端口的WEB服务器配置为:
server {
listen 8080 default_server;
root /usr/share/nginx/html/8080;
index index.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
修改8080端口的WEB服务器的根目录,并在目录中添加index.html文件。
jishu@Jishu:~$ cd /usr/share/nginx/html
jishu@Jishu:/usr/share/nginx/html$ sudo mkdir 8080
jishu@Jishu:/usr/share/nginx/html$ cd 8080
jishu@Jishu:/usr/share/nginx/html/8080$ sudo vim index.html
aaaaaaaaa
为了测试简单,直接打印10个a字符。
8090端口的WEB服务器配置为:
server {
listen 8090 default_server;
root /usr/share/nginx/html/8090;
index index.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
修改8090端口的WEB服务器的根目录,并在目录中添加index.html文件。
jishu@Jishu:/usr/share/nginx/html$ sudo mkdir 8090
jishu@Jishu:/usr/share/nginx/html$ cd 8090
jishu@Jishu:/usr/share/nginx/html/8090$ sudo vim index.html
bbbbbbbbbb
同样,为了测试简单,直接打印10个b字符。
修改default配置文件,在文件中添加8080端口和8090端口WEB服务器的映射。
......
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
location /8080/ {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://localhost:8080/;
}
location /8090/ {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://localhost:8090/;
}
......
Nginx需要从HTTP请求中读取参数,设置到发给应用服务器的HTTP头中,其中最重要的是Host和X-Forward-For。
Host的含义是表明请求的主机名,如果作为反向代理的Nginx不重写请求头中的host字段,当后端应用服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能时,会导致请求失败。
X-Forward-For字段表示该条http请求是由谁发起。如果Nginx不重写该请求头的话,应用服务器在处理请求时会认为所有的请求都来在Nginx反向代理服务器。如果应用服务器有防攻击策略的话,那么反向代理Nginx很容易被封掉。
3.验证反向代理
配置修改好之后,需要重启Nginx服务。
sudo service nginx restart
服务重启后,来验证一下反向代理功能。
jishu@Jishu:~$ curl http://localhost:8080 #直接访问8080端口的WEB服务
aaaaaaaaa
firefly@firefly:~$ curl http://localhost/8080/ #通过反向代理映射访问
aaaaaaaaa
jishu@Jishu:~$ curl http://localhost:8090 #直接访问8090端口的WEB服务
bbbbbbbbbb
firefly@firefly:~$ curl http://localhost/8090/ #通过反向代理映射访问
bbbbbbbbbb
反向代理功能配置成功。