nginx反向代理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx反向代理相关的知识,希望对你有一定的参考价值。
nginx反向代理、负载均衡、缓存、URL重写及读写分离
Nginx配置文件
server {
listen 80;
server_name www.mylinux.com;
location / {
后端服务器:
}
}
反向代理:
proxy_pass
Nginx通过proxy模块实现反向代理,在作为web反向代理服务器时,nginx负责接收客户端请求,并能够根据URI,客户端参数或其他的处理逻辑将用户请求调度至上游服务器上(upstream server),nginx在实现反向代理功能时的最重要指令为proxy_pass,她能够将,location定义为某URI代理至指定的上游服务器(组)上,如下面所示列中,localtion的/forum将被替换为上游服务器上的/bbs
location /forum/ {
proxy_pass http://172.16.100.11:8080/bbs/;
}
http://www/mylinux.com/forum
-->http://172.16.100.11:8080/bbs/;
-----------------------------------------------------
不过,这种处理机制中有两个例外,一个是如果location的URI是通过模式匹配定义的,其URI将直接被传递至上游服务器,而不能为其指定转换的另一个URI,列如下面
location ~* ^/forum {
proxy_pass http://172.16.100.11:8080/;
}
http://www/mylinux.com/forum
-->http://172.16.100.11:8080/forum/;
-----------------------------------------------------
第二个列外是,如果在location中使用URL重定向,那么nginx将使用重定向后的URI处理请求,而不再考虑上游服务器定义URI,如下面所示的列子中,传送给上游服务器的URI为index.php?page=<match>,而不是/index.
location / {
rewrite / (.*)$ /index.php?page=$1 break;
proxy_pass http://localhost:8080/index;
}
--------------------------------------------------
实验:
在192.168.1.11上转上web服务 作为后端服务器;
通过192.168.1.10上的nginx代理;
192.168.1.11:
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# mkdir /var/www/html/bbs
[[email protected] ~]# vim /var/www/html/bbs/index.html
[[email protected] ~]# service httpd start
192.168.1.10:
location /forum/ {
proxy_pass http://192.168.1.11/bbs/;
}
----------------------------------------------------
实验2:
192.168.1.11:
[[email protected] html]# mv bbs forum
192.168.1.10:
location ~* ^/forum {
proxy_pass http://192.168.1.11;
}
[[email protected] ~]# service httpd restart
----------------------------------------------------
让后台的http服务器日志信息记录客户端访问ip而不是nginx的ip
192.168.1.10:
location ~* ^/forum {
proxy_pass http://192.168.1.11;
proxy_set_header X-Real-IP $remote_addr;
}
192.168.1.11:
[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
h%代表客户端ip地址。替换成X-Real-IP}i i表示引用这个值
---------------------------------------------------
把整个网页全部转向后端:
192.168.1.10:
location / {
proxy_pass http://192.168.1.11/;
proxy_set_header X-Real-IP $remote_addr;
}
192.168.1.11:
[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
--------------------------------------------------------------
nginx实现负载均匀,以及后台健康状态检查:
upstream:定义一个组 实现负载均匀:
192.168.1.11 http
192.168.1.12 http
192.168.1.10 nginx
一.192.168.1.10: 定义upstream,必须在server以外,weight=权重
#gzip on;
upstream websrvs {
ip_hash;将同一个客户端请求始终定义到同一台服务器(此时权重就没多大意义了)
server 192.168.1.11 weight=1 max_fails=2 fail_timeout=2; max_fails最多检查几次
server 192.168.1.12 weight=1 max-fails=2 fail_timeout=2; fail_timeout几秒后检查超时,直接切换
#server 127.0.0.1:8080 backup;错误页面(在ip_hash模式下不允许使用此项)
}
server {
二.反向代理不再是某一个主机,而是定义的upstream组
location / {
proxy_pass http://websrvs/;
proxy_set_header X-Real-IP $remote_addr;
}
############################################
在server以外重新定义一个server用作错误页面。
upstream
#server 127.0.0.1:8080 backup;错误页面(在ip_hash模式下不允许使用此项)
server {
listen 8080;
server_name localhost;
root /web/errorpages;
index index.html;
}
[[email protected] ~]# mkdir /web/errorpages
[[email protected] ~]# vim /web/errorpages/index.html
-------------------------------------------
nginx: 三种负载均衡算法
round-robin 加权循环调度算法(默认)
ip_hash 同一个客户端请求始终定义到一台服务器
least_conn 挑选当前连接数最少的服务器来响应
-------------------------------------------------------
[[email protected] ~]# netstat -ant |awk ‘/:80\>/{S[$NF]++}END{for(A in S){print A,S[A]}}‘
LISTEN 1
------------------------------------------------------------------
nginx使用缓存
cache:共享内存(存储键和缓存对象元数据)
磁盘空间:存储数据
proxy_cache_path:不能定义在server{}上下文中:
缓存目录的子目录级别
proxy_cache_path /nginx/cache/first levels=1:2:1 keys_zone=first:20m max_size=1g;
cache_manager: LRU 清除缓存
/nginx/cache/first 缓存目录
levels:定义有三级缓存,名称长度:1级缓存目录1个字符,2级缓存目录2个字符,3级缓存目录1个字符,最多只能有3级,每一级目录字符最多只能有2个
keys_zone 给共享内存命名,用来存储键的区域,定义内存区域有多大,可以定义多个共享内存。
max_size 最大使用多少空间来存储缓存对象(/nginx/cache/first)
实验:
location / {
proxy_pass http://websrvs/;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache first;定义使用缓存
proxy_cache_valid 200 10m; 定义返回值为200的网页缓存10分钟
}
。。。。。
proxy_cache_path /nginx/cache/first levels=1:2 keys_zone=first:20m max_size=1g;
add_header X-Cache "$upstream_cache_status from $server_addr";显示缓存是否命中
[[email protected] nginx]# mkdir -pv /nginx/cache/first
[[email protected] nginx]# service nginx reload
-------------------------------------------
proxy_cache_valid any 1m 指定某些页面缓存的时间,any 1m表示多有都缓存1分钟
404 1h
----------------------------------------------------------------------------------------
另外三种缓存:
open_log_cache 日志文件的缓存,可以先把日志保存在内存 之后在同步到磁盘,降低磁盘IO
open_file_cache 将打开的文件直接缓存到内存中。
fastcgi_cache fastcgi的缓存,慎用。
---------------------------------------
51:30
本文出自 “运维成长路” 博客,谢绝转载!
以上是关于nginx反向代理的主要内容,如果未能解决你的问题,请参考以下文章