--
1,四台机器,单网卡同网段(先不讨论跨网段)
2,web1我这里用的是上次课搭建好的lnmp,为了后面方便测试
3,web2这里简单的安装并启动rpm版的apache,并做一个简单主页就好
4,nginx这台需要按下面的第一步过程进行安装,这次只安装nginx就好,不用安装php,mysql等(因为是主要做代理)
5,客户端最好有图形界面,并安装firefox浏览器
nginx 反向代理
client 10.1.1.x
nginx(虚拟机1) 10.1.1.8
web1(宿主机) web2(虚拟机2)
10.1.1.9:8000 10.1.1.12
第一步,在nginx反向代理服务器上安装nginx,过程可以和装lnmp时几乎一模一样
# yum install pcre-devel -y
# useradd -r -d /dev/null -s /bin/false nginx --我这里建立一个用户来跑nginx,不做也可以,它默认是用daemon用户来跑
# id nginx --nginx的uid,gid无所谓是多少
uid=517(nginx) gid=518(nginx) groups=518(nginx)
# tar xf nginx-1.8.0.tar.gz -C /usr/src/
# cd /usr/src/nginx-1.8.0/
# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module --with-http_stub_status_module
# make ;make install
----------------------------------------------------------------
--注意:下面这五个例子,是以静态页面来做测试,如果现在讨论动态页面(比如登录相关),下面的配置并不完整;并且这五个例子都是同网段做,如果换成双网段(后台web在内网)则会出现问题,需要使用后面综合例子里的proxy_set_header等指令来辅助
例一:使用前端nginx代理后面一台web
client 10.1.1.x
nginx 10.1.1.8 (缓存加速,但nginx默认没有;七层数据切分,负载均衡;做CDN)
web1
10.1.1.9:8000
[root@li nginx]# cat /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 4;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 65535;
}
http {
server {
listen 80;
server_name 10.1.1.8;
root /nginxroot/;
location /web1/ {
proxy_pass http://10.1.1.9:8000/;
}
}
}
# mkdir /nginxroot/
# echo "nginx main page" > /nginxroot/index.html
--启动
# ulimit -SHn 65535
# /usr/local/nginx/sbin/nginx
--验证
找另一台客户端机器验证
# elinks 10.1.1.8 --得到10.1.1.8上nginx的主页
# elinks 10.1.1.8/web1/ --得到10.1.1.9上8000端口的web1主页(但你可以去尝试做一下登录操作是不可以的。或者点注册,会发现它的路径跳转到了10.1.1.9:8000;也就是说这个做法只是简单测试,并不实用。在后面的综合例子里我们再讨论)
--扩展:此写法在apache里也有类似的配置方式,一个是apache里的Alias配置,另一个是apache的proxypasss指令(有兴趣的人可以网上搜一下)
例二:使用前端nginx代理后端两台web,一个代理后台10.1.1.9的8000端口的web1,一个代理后台10.1.1.12的80端口的web2
client 10.1.1.x
nginx 10.1.1.8:80
web1 web2
10.1.1.9:8000 10.1.1.12:80
# cat /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 4;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 65535;
use epoll;
}
http {
server {
listen 80;
server_name 10.1.1.8;
root /nginxroot/;
location /web1/ {
proxy_pass http://10.1.1.9:8000/;
}
location /web2/ {
proxy_pass http://10.1.1.12/;
}
}
}
重启
[root@li nginx]# /usr/local/nginx/sbin/nginx -s stop
[root@li nginx]# /usr/local/nginx/sbin/nginx
验证
# elinks 10.1.1.8
# elinks 10.1.1.8/web1/
# elinks 10.1.1.8/web2/
--这可以实现类似sports.sina.com/nba/和sports.sina.com/cba/这样的数据切分(七层代理)
-------------------------------------------------------------------------------
什么是动静分离?
其实就是七层调度,把动态文件的请求和静态文件的请求分别调到不同的后台服务器
什么是网站数据切分?
其实也是七层调度
比如我要把新浪新闻,新浪体育给分开
方法1:
用dns的二级域名(直接dns解析成不同的ip)
新浪新闻 news.sina.com 新浪国内新闻 news.sina.com/china/ --说明没有用二级域名
新浪国际新闻 news.sina.com/world/
新浪国内新闻 china.news.sina.com --用了二级域名
新浪国际新闻 world.news.sina.com
新浪体育 sports.sina.com 新浪体育nba sports.sina.com/nba/
新浪体育nba nba.sports.sina.com
方法2:
前端使用代理(squid,varnish,apache,nginx,haproxy)
通过代理软件七层调度来分离
--------------------------------------------------------------------------------
例三:基于文件类型的反向代理(可用于做动静分离)
[root@li nginx]# cat conf/nginx.conf
user nginx nginx;
worker_processes 4;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 65535;
}
http {
server {
listen 80;
server_name 10.1.1.8;
root /nginxroot/;
location /images/ {
proxy_pass http://10.1.1.12/; --这里后面得加/
}
location ~ \.(txt|php)$ {
proxy_pass http://10.1.1.9:8000; --这里后面不能加/
}
}
}
--这里是做的七层代理,上面的配置表示访问10.1.1.8/images/时会调给后面的10.1.1.12的80端口;访问任何以.txt或.php结尾的文件时会调给10.1.1.9的8000端口;其它的由10.1.1.8的nginx自己解析
重启 (省略)
验证 (省略)
例四:代理后端时使用负载均衡
# cat /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 4;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 65535;
use epoll;
}
http {
upstream backendweb {
server 10.1.1.9:8000 weight=1 max_fails=2 fail_timeout=1s;
server 10.1.1.12:80 weight=1 max_fails=2 fail_timeout=1s;
}
server {
listen 80;
server_name 10.1.1.8;
root /nginxroot/;
location ~ \.(txt|php)$ {
proxy_pass http://backendweb;
}
}
}
--上面配置的意思是:.txt或.php结尾的文件都去均衡的调度给10.1.1.9的8000端口和10.1.1.12的80端口;其它的由10.1.1.8的nginx自己解析
--upstream指令不要加到http {} 外面,也不要加到server{}里面
重启 (省略)
验证 (省略)
--验证时,会发现客户端针对同一个URL的访问也会一次web1一次web2,这说明nginx默认并没有squid或varnish那样的缓存功能
负载均衡(lb load banlance)一般要注意四个方面:
1,算法 round-robin
2,健康检查
3,会话保持
4,数据一致
client request
LB
web1 web2
100 客户 100
接待
张三 李四
例五:使用ip_hash,实现同一IP客户端一旦调到一台,就一直调那一台
# cat /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 4;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 65535;
use epoll;
}
http {
upstream backendweb {
ip_hash; --加上这句
server 10.1.1.9:8000 weight=1 max_fails=2 fail_timeout=1s;
server 10.1.1.12:80 weight=1 max_fails=2 fail_timeout=1s;
}
server {
listen 80;
server_name 10.1.1.8;
root /nginxroot/;
location ~ \.(txt|php)$ {
proxy_pass http://backendweb;
}
}
}
--nginx的ip_hash的意思是,如果一个客户端的访问被调度到其中一台后台服务器,那么同一个IP来的访问都只会被调到这个后台服务器;这里测试时,如果都用同一个网段的内网IP来做客户端测试,可能会都只转到一个后台(因为nginx的hash算法是按网段来算的,如果是公网不同网段的客户端IP就不一样了)
重启 (省略)
验证 (省略)
对于nginx的upstrem算法总结:
1,round-robin 轮循(平均分配)
2,weight 权重(人为地分配权重,用于后台服务器性能不均的情况)
3,fair 响应时间(按后台的响应时间来分配,需要第三模块,但如果后台服务器都在内网,就没太大必要使用这种算法了)
4,url_hash 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为多台缓存时比较有效,提高缓存命中率(后面例子会讲)
5,ip_hash 在负载均衡的基础上加上会话保持(优点是配置方便,缺点是不能完全的负载均衡)
===============================================================================
nginx 代理
最新推荐文章于 2024-05-31 10:51:59 发布