综合架构网站服务-nginx负载均衡代理模块详解
- 负载均衡代理模块 proxy模块的应用
- 负载均衡企业应用
- 用户访问网站的原理
问题一:将lb01的主配置文件改为.conf的时,访问www.oldboy.com,返回的是bbs虚拟主机的站点信息.
原因:访问www.oldboy.com的时候,访问到负载均衡服务器的时候,请求头信息变为了调用的负载均衡的集群的信息。负载均衡服务器再向下访问的时候会封装80端口,根据扩展目录下的文件会加载第一个配置文件,也就是bbs.conf,所以会显示出bbs的信息。
[root@nfs001 conf.d]# ll
total 20
-rw-r--r-- 1 root root 262 Aug 3 15:09 bbs.conf
-rw-r--r-- 1 root root 274 Aug 2 09:03 blog.conf
-rw-r--r-- 1 root root 1093 Apr 23 22:34 default.conf
-rw-r--r-- 1 root root 3 Aug 2 11:55 oldboy.html
-rw-r--r-- 1 root root 515 Aug 4 16:19 www.conf
解决办法:
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy;
proxy_set_header Host $host;
}
}
请求头信息做了变化
问题二: 如何让web服务器记录用户客户端真实IP地址
$http_x_forwarded_for --- 用于收集用户真实IP地址
upstream oldboy {
ip_hash;
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr; #日志中带有访问网站的源公网IP地址
}
}
PS; 304状态表示走缓存,没有让网站消耗流量
304代码解释
问题三: 如何让用户看到的永远是正确页面
现象:当web集群中有一台服务器的首页文件损坏时,这时访问web的页面会时而能正常访问,时而访问出错。
PS: 健康检查: 检查web服务网络通讯是否正常 不能检测页面是否正常
指令信息:
proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off
error --- 异常错误
timeout --- 超时信息
invalid_header --- 无效信息
http_xxx --- 异常状态码
upstream oldboy {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout invalid_header http_404;
}
}
负载均衡企业应用:
01. 架构动静分离
图示:
根据uri去判断访问不同的集群
环境准备:
集群01 动态集群dynamic web01 uri /dynamic/oldboy.html --- dynamic page
集群02 静态集群static web02 uri /static/oldboy.html --- static page
集群03 默认集群default web03 uri oldboy.html --- default page
配置过程:
第一个历程: web节点信息
web01
站点目录中:
mkdir dynamic/; echo "dynamic page" >dynamic/oldboy.html
web02
站点目录中:
mkdir static/; echo "static page" >static/oldboy.html
web03
站点目录中:
echo "default page" >oldboy.html
第二个历程: 配置负载均衡
准备工作: 配置proxy参数文件
[root@lb01 nginx]# cat proxy_params
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout invalid_header http_404;
upstream dynamic {
server 10.0.0.7:80;
}
upstream static {
server 10.0.0.8:80;
}
upstream default {
server 10.0.0.9:80;
}
include proxy_params;
location /dynamic/ {
proxy_pass http://dynamic;
}
location /static/ {
proxy_pass http://static;
}
location / {
proxy_pass http://default;
}
**nginx负载均衡完整配置文件**
[root@lb01 nginx]# cat nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
upstream dynamic {
server 10.0.0.7:80;
}
upstream static {
server 10.0.0.8:80;
}
upstream default {
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
include proxy_params;
location /dynamic/ {
proxy_pass http://dynamic;
}
location /static/ {
proxy_pass http://static;
}
location / {
proxy_pass http://default;
}
}
}
02. 根据用户访问客户端不同显示不同页面
准备环境:
手机端集群 iphone集群 web01 www.oldboy.com---oldboy.jpg
电脑端集群 chrome集群 web02 www.oldboy.com---oldgirl.jpg
默认集群 default集群 web03 www.oldboy.com---oldboy.html
第一个历程: 配置web服务器
web01:
站点目录---oldboy.jpg
server {
location / {
root /html/www;
index oldboy.jpg;
}
}
web02:
站点目录---oldgirl.jpg
server {
location / {
root /html/www;
index oldgirl.jpg;
}
}
web03:
站点目录---oldboy.html
server {
location / {
root /html/www;
index oldboy.html;
}
}
第二个历程: 编写负载均衡配置文件
upstream iphone {
server 10.0.0.7:80;
}
upstream chrome {
server 10.0.0.8:80;
}
upstream default {
server 10.0.0.9:80;
}
location / {
include proxy_params;
if ($http_user_agent ~* iphone) {
proxy_pass http://iphone;
}
if ($http_user_agent ~* chrome|firefox) {
proxy_pass http://chrome;
}
proxy_pass http://default;
}
** 完整配置信息**:
[root@lb01 nginx]# cat nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
upstream iphone {
server 10.0.0.7:80;
}
upstream chrome {
server 10.0.0.8:80;
}
upstream default {
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
include proxy_params;
location / {
if ($http_user_agent ~* iphone) {
proxy_pass http://iphone;
}
if ($http_user_agent ~* chrome|firefox) {
proxy_pass http://chrome;
}
proxy_pass http://default;
}
}
}
用户访问网站的原理
原理步骤图
步骤 | 解释 | 注意 |
---|---|---|
01 | DNS域名解析 | 本地解析,公网DNS解析,以及linux系统解析(浏览器访问域名无效) |
02 | 网络通讯的过程(tcp的三次握手) | IP地址和端口匹配 |
03 | http的报文请求 | 关注:请求方法,请求内容(uri),默认为首页文件 请求头:UA |
04 | 推送给哪些集群 | prox_pass模块 |
05 | 负载均衡根据集群内的server进行负载均衡 | upsteram模块 |
06 | 负载均衡和web服务器三次握手 | 重新建立一次通信过程 |
07 | http请求 | 需要配置相应的参数 |
08 | 匹配server信息 | 匹配中了继续匹配,匹配不中,则加载扩展配置文件中的第一个站点信息 |
09 | 匹配location | |
10 | 匹配跳转信息 | 除了break,其他三个跳转的标记会重新发起一次访问。 |
11 | 匹配if判断信息 | 根据请求行和请求头 |
12 | 获取站点下的URI信息 | 默认的情况下会输出首页文件 |
imagePS:申请域名的方式