Nginx 反向代理操作案例

Nginx反向代理的组件模块

upstream模块介绍->点我<

http_proxy_module模块介绍->点我<

环境准备

1)四台服务器都需操作如下步骤:

# systemctl stop firewalld        //关闭防火墙
# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux //关闭selinux,重启生效
# setenforce //关闭selinux,临时生效
# ntpdate .centos.pool.ntp.org //时间同步

2)LB节点源码安装nginx:

# yum install openssl openssl-devel pcre pcre-devel gcc gcc-c++ make autoconf automake -y        //安装依赖工具包

//编写安装脚本
# cat >installNginx.sh<<EOF    
mkdir /home/tools
cd /home/tools
wget -q http://nginx.org/download/nginx-1.12.2.tar.gz
ls -l nginx-1.12..tar.gz
useradd nginx -s /sbin/nologin -M
tar xf nginx-1.12..tar.gz
cd nginx-1.12.
./configure --user=nginx --group=nginx --prefix=/application/nginx-1.12. --with-http_stub_status_module --with-http_ssl_module
make
make install
ln -s /application/nginx-1.12./ /application/nginx
EOF
# bash installNginx.sh //执行安装脚本

说明:上面源码安装的nginx,配置文件路径:/application/nginx/conf/nginx.conf    二进制启动命令路径:/application/nginx/sbin/nginx

3)web节点yum安装nginx及准备测试文件:

# yum install nginx -y        //安装nginx
# mkdir /application/nginx/html/{www,bbs,blog} -p //创建web站点目录
# for dir in www bbs blog; do echo "`hostname` $dir" >/application/nginx/html/$dir/index.html;done //创建站点目录测试文件
# vim /etc/nginx/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;
include /etc/nginx/conf.d/*.conf; server {
listen 80;
server_name www.etiantian.org; location / {
root /application/nginx/html/www;
}
access_log /var/log/nginx/access_www.log main;
} server {
listen 80;
server_name bbs.etiantian.org; location / {
root /application/nginx/html/bbs;
}
access_log /var/log/nginx/access_bbs.log main;
}
server {
listen 80;
server_name blog.etiantian.org; location / {
root /application/nginx/html/blog;
}
access_log /var/log/nginx/access_blog.log main;
}
}
# systemctl start nginx        //启动nginx
# systemctl enable nginx //加入开机自启动

4)web站点配置hosts解析及测试nginx是否能够正常访问

//web1站点编辑后的/etc/hosts文件
[root@centos7- ~]# tail - /etc/hosts
192.168.3.103 www.etiantian.org
192.168.3.103 bbs.etiantian.org
192.168.3.103 blog.etiantian.org //web2站点编辑后的/etc/hosts文件
[root@centos7- ~]# tail - /etc/hosts
192.168.3.104 www.etiantian.org
192.168.3.104 bbs.etiantian.org
192.168.3.104 blog.etiantian.org //web1站点测试
[root@centos7- ~]# curl www.etiantian.org
centos7- www
[root@centos7- ~]# curl bbs.etiantian.org
centos7- bbs
[root@centos7- ~]# curl blog.etiantian.org
centos7- blog //web2站点测试
[root@centos7- ~]# curl www.etiantian.org
centos7- www
[root@centos7- ~]# curl bbs.etiantian.org
centos7- bbs
[root@centos7- ~]# curl blog.etiantian.org
centos7- blog

案例

完成上面的lb节点的软件安装及web节点的测试文件准备后,下面开始配置案例,说明,先配置单节点的lb,也就是先只在(centos7-1)lb1 上面进行配置。

案例一:最基本的负载均衡

编辑lb1(192.168.3.101)配置文件,编辑之前记得将默认配置文件进行备份

# cp /application/nginx/conf/nginx.conf /application/nginx/conf/nginx.conf.default        //备份配置文件
# sed -i '/^[ ]*$/d' /application/nginx/conf/nginx.conf //去掉配置文件中的注释及空行
# vim /application/nginx/conf/nginx.conf        //编辑配置文件
worker_processes ;
events {
worker_connections ;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout ; upstream myapp1 {
#<== upstream 是关键字必须要有,后面的myapp1为一个Upstream集群组的名字,可以自定义,调用时就用这个名字。
server 192.168.3.103 weight=1;
#<==server 关键字是固定的,后面可以接域名或IP,如果不指定端口,默认是80端口。weight 代表权重,数值越大被分配到请求越多,默认值为1,所以此处可写可不写。结尾有分号,别忘了;
server 192.168.3.104 weight=1;
}
server {
listen ;
server_name localhost;
location / {
proxy_pass http://myapp1;
}
}
}
# /application/nginx/sbin/nginx -t        //检查语法是否错误
# /application/nginx/sbin/nginx -s reload //重新加载配置文件

我们用lb2机器来测试(用任何一台都可以),测试结果可以看出,会轮循调度到后端web节点上

[root@centos7- ~]# curl 192.168.3.101
centos7- www
[root@centos7- ~]# curl 192.168.3.101
centos7- www
[root@centos7- ~]# curl 192.168.3.101
centos7- www
[root@centos7- ~]# curl 192.168.3.101
centos7- www

案例二:基于权重(wrr)

修改配置文件 upstream 段为以下内容

upstream myapp1 {
server 192.168.3.103 weight=1;
server 192.168.3.104 weight=2;
}

同样使用lb2机器来进行测试,可以发现调度后端节点编程了1:2,调度到web2节点上面总是会多一次。

[root@centos7- ~]# curl 192.168.3.101
centos7- www
[root@centos7- ~]# curl 192.168.3.101
centos7- www
[root@centos7- ~]# curl 192.168.3.101
centos7- www
[root@centos7- ~]# curl 192.168.3.101
centos7- www
[root@centos7- ~]# curl 192.168.3.101
centos7- www
[root@centos7- ~]# curl 192.168.3.101
centos7- www

案例三:较完整的 upstream 配置案例

修改配置文件 upstream 段为以下内容

upstream myapp1 {
server 192.168.3.103 weight=1 max_fails=3 fail_timeout=20s;
server 192.168.3.104 weight=1 max_fails=3 fail_timeout=20s;
}
//max_fails 尝试连接后端主机失败的次数; fail_timeout 在max_fails定义的失败次数后,距离下次检查的间隔时间。

同样使用lb2机器来进行测试,在测试过程中,关闭其中一个web节点,会发现只是调度到另外一个节点上面,然后再重启关闭的节点,观察测试输出内容,会发现尝试的时间。

[root@centos7- ~]# for n in {..}; do curl 192.168.3.101 ; date +%T; sleep ; done

案例四:基于域名的负载

修改配置文件为以下内容

worker_processes  ;
events {
worker_connections ;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout ; upstream myapp1 {
server 192.168.3.103 weight=1 max_fails=3 fail_timeout=20s;
server 192.168.3.104 weight=1 max_fails=3 fail_timeout=20s;
} server {
listen ;
server_name www.etiantian.org;
location / {
proxy_pass http://myapp1;
proxy_set_header Host $host;
}
} server {
listen ;
server_name bbs.etiantian.org;
location / {
proxy_pass http://myapp1;
proxy_set_header Host $host;
}
} server {
listen ;
server_name blog.etiantian.org;
location / {
proxy_pass http://myapp1;
proxy_set_header Host $host;
}
}
}

编辑/etc/hosts文件,进行域名解析,此处为了方便,直接在lb1节点上面编辑并测试(如果需要在别的节点进行测试,那么进行域名解析即可)

# vim /etc/hosts
192.168.3.101 www.etiantian.org bbs.etiantian.org blog.etiantian.org

测试发现基于域名ok,因为上面配置的权重都为1,所以不论我们访问哪一个域名,都会轮循去调度后端web节点。

[root@centos7- ~]# curl www.etiantian.org
centos7- www
[root@centos7- ~]# curl www.etiantian.org
centos7- www
[root@centos7- ~]# curl bbs.etiantian.org
centos7- bbs
[root@centos7- ~]# curl bbs.etiantian.org
centos7- bbs
[root@centos7- ~]# curl blog.etiantian.org
centos7- blog
[root@centos7- ~]# curl blog.etiantian.org
centos7- blog

案例五:记录客户端真实IP

先到web节点上面查看访问日志

[root@centos7- ~]# tailf /var/log/nginx/access_www.log
192.168.3.101 - - [/Apr/::: +] "GET / HTTP/1.0" "-" "curl/7.29.0" "-"
192.168.3.101 - - [/Apr/::: +] "GET / HTTP/1.0" "-" "curl/7.29.0" “-"

通过观察日志发现,记录的都负载均衡器节点的IP,实际生产环境中都是记录真实客户端IP。

进行修改配置文件(lb节点)将location 段加上 proxy_set_header X-Forwarded-For $remote_addr;

location / {
proxy_pass http://myapp1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}

使用lb2节点进行测试(我们将lb2当做一个客户端访问),然后我们再去查看日志就可以发现,记录了客户端的真实IP地址。

[root@centos7- ~]# tailf /var/log/nginx/access_www.log
192.168.3.101 - - [/Apr/::: +] "GET / HTTP/1.0" "-" "curl/7.29.0" "192.168.3.102"
192.168.3.101 - - [/Apr/::: +] "GET / HTTP/1.0" "-" "curl/7.29.0" "192.168.3.102"

案例六:根据不同的URI 调度到不同的服务器

常见架构图

梳理:1、当用户请求 www.etiantian.org/upload/xx 地址时,实现由upload上传服务器池处理请求;2、当用户请求 www.etiantian.org/static/xx 地址时,实现由静态服务器池处理请求;3、除此之外,对于其它访问请求,全部由默认的动态服务器池处理请求。如下图:

在wab服务器上面准备测试文件

//准备测试文件web1的80 upload
[root@centos7- ~]# mkdir /application/nginx/html/www/upload
[root@centos7- ~]# echo "upload web01 192.168.3.103 " > /application/nginx/html/www/upload/index.html
//准备测试文件web2的80 static
[root@centos7- ~]# mkdir /application/nginx/html/www/static
[root@centos7- ~]# echo "static web02 192.168.3.104 " > /application/nginx/html/www/static/index.html
//准备测试文件web2的8080 default
[root@centos7- ~]# mkdir /application/nginx/www_8080
[root@centos7- ~]# vim /etc/nginx/conf.d/www_8080.conf
server {
listen ;
server_name localhost;
access_log /var/log/nginx/access.log main;
location / {
root /application/nginx/www_8080;
index index.html index.htm;
}
}
[root@centos7- ~]# echo "default web02 192.168.3.104 " > /application/nginx/www_8080/index.html //在lb1服务器测试后端web服务器是否能够正常访问
[root@centos7- ~]#curl 192.168.3.103/upload/index.html
upload web01 192.168.3.103
[root@centos7- ~]# curl 192.168.3.104/static/index.html
static web02 192.168.3.104
[root@centos7- ~]# curl 192.168.3.104:/index.html
default web02 192.168.3.104

配置LB,修改lb1配置文件进行配置

sendfile        on;
keepalive_timeout ; upstream upload_pools {
server 192.168.3.103:;
}
upstream static_pools {
server 192.168.3.104:;
}
upstream default_pools {
server 192.168.3.104:;
} server {
listen ;
server_name www.etiantian.org;
location / {
proxy_pass http://default_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /upload {
proxy_pass http://upload_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /static {
proxy_pass http://static_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}

在lb2(模拟客户端)节点上面进行测试,结果可以看到根据不同的url调度到不同的服务器上面了。

[root@centos7- ~]# curl 192.168.3.101
default web02 192.168.3.104
[root@centos7- ~]# curl 192.168.3.101/upload/index.html
upload web01 192.168.3.103
[root@centos7- ~]# curl 192.168.3.101/static/index.html
static web02 192.168.3.104

  

Nginx-反向代理实现的更多相关文章

  1. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  2. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...

  3. Nginx反向代理部署指南

    一.反向代理 我们都知道,80端口是web服务的默认端口,其他主机访问web服务器也是默认和80端口进行web交互,而一台服务器也只有一个80端口,这是约定俗成的标准. 我们来看下面两个场景: 1.服 ...

  4. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  5. Nginx反向代理和负载均衡

    一.Nginx反向代理设置 从80端口转向其他端口反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的 ...

  6. nginx 反向代理

    nginx 反向代理 vim nginx.conf http { ..... upstream "tomcatweb" { server 172.30.13.199:8080; s ...

  7. 关于nginx反向代理后获取不到客户端的真实ip地址问题

    前段时间在我的网站上用nginx做了一下反向代理,最近发现不能获取客户端ip了,都是拿到的127.0.0.1的本地ip... 通过查资料后,再去看了看我的配置文件,结果发现我没有如下配置: nginx ...

  8. Nginx反向代理配置可跨域

    由于业务需要,同一项目中的前端代码放在静态环境中,而后端代码放在tomcat中,但此时问题却出现了:前端使用ajax请求后端获取数据时出现如下报错 XMLHttpRequest cannot load ...

  9. Nginx反向代理搭建配置

    1.反向代理方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将服务器上得到的结果返回给internet 上请求连接的客户端,此时代理服务器对外就表现为一个 ...

  10. nginx反向代理docker registry报”blob upload unknown"解决办法

    问题症状:keepalived+nginx反向代理后端docker registry群集时,使用docker客户机向registry push镜像时出现 "blob upload unkno ...

随机推荐

  1. WIN10安装不上IIS,使用IISExpress作为发布服务

    [背景] 本人开发Win程序,需要调用网站资源作为Win程序的辅助功能,为此需要本地开发环境支持IIS.最近重装系统,VS安装完后,接着再安装IIS,可以在添加删除程序中反复尝试,均告安装失败提示.最 ...

  2. spring boot 2.0 ribbon 负载均衡配置

    1.pom.xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId ...

  3. Java内存区域和内存溢出异常

    前言 对于java程序员来说,在虚拟机自动内存管理的机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出的问题,由虚拟机管理内存,这一切看起来都很 ...

  4. 《全栈营销之如何制作个人博客》之一:用什么开发语言和CMS系统

    现在的互联网,已经不再是初级互联时代,是需要全方位营销,自建粉丝池的时代,云码素材从提出全栈营销,到实践分析,总结出全栈营销第一步,先制作一个个人博客是最好的开始.今天开始就跟我一起学习如何制作一个精 ...

  5. thinkphp5路由心得

    路由的作用:1. 简化URL地址,方便大家记忆2. 有利于搜索引擎的优化,比如可以被百度的爬虫抓取到 优化URl1. 前后端分离修改入口文件,在public下新建admin.php文件,将下面的代码添 ...

  6. 为Jekyll+GitHub Pages添加全文搜索功能

    动态演示如下: [上传失败, 请自行搜索原文] 源码库: program-in-chinese/team_website 找到此JS工具: christian-fei/Simple-Jekyll-Se ...

  7. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  8. Android为TV端助力 使用shared注意事项

    不要存放大的key和value!我就不重复三遍了,会引起界面卡.频繁GC.占用内存等等,好自为之! 毫不相关的配置项就不要丢在一起了!文件越大读取越慢,不知不觉就被猪队友给坑了:蓝后,放进defalu ...

  9. 荣耀7.0系统手机最简单激活Xposed框架的步骤

    对于喜欢玩手机的小伙伴来说,很多时候会使用到Xposed框架及各类功能彪悍的模块,对于5.0以下的系统版本,只要手机能获得Root权限,安装和激活Xposed框架是比较简便的,但随着系统版本的不断更新 ...

  10. VS OpenCV imread imwrite nameWindow等相关报错问题

    排查过程 1. 项目属性C++目录中,包含库include 和 lib 目录了吗? 去自己的opencv安装目录中找到include 和 lib(一般在x64下有两个vc14/vc15, 我的是4.0 ...