什么是端口转发

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

转载原文链接:https://www.cnblogs.com/chanshuyi/p/5113424.html,感谢原作者,本文仅供学习 存档备用

当我们在服务器上搭建一个图书以及一个电影的应用,其中图书应用启动了 8001 端口,电影应用启动了 8002 端口。此时如果我们可以通过:

localhost:8001    //图书
localhost:8002 //电影

但我们一般访问应用的时候都是希望不加端口就访问域名,也即两个应用都通过 80 端口访问。但我们知道服务器上的一个端口只能被一个程序使用,这时候如何该怎么办呢?一个常用的方法是用 Nginx 进行端口转发。Nginx 的实现原理是:用 Nginx 监听 80 端口,当有 HTTP 请求到来时,将 HTTP 请求的 HOST 等信息与其配置文件进行匹配并转发给对应的应用。例如当用户访问 book.douban.com 时,Nginx 从配置文件中知道这个是图书应用的 HTTP 请求,于是将此请求转发给 8001 端口的应用处理。当用户访问 movie.douban.com 时,Nginx 从配置文件中知道这个是电影应用的 HTTP 请求,于是将此请求转发给 8002 端口的应用处理。一个简单的 Nginx 配置文件(部分)如下面所示:

#配置负载均衡池
#Demo1负载均衡池
upstream book_pool{
server 127.0.0.1:8001;
}
#Demo2负载均衡池
upstream movie_pool{
server 127.0.0.1:8002;
}

Demo1端口转发

server {

listen 80;

server_name book.chanshuyi.com;

access_log logs/book.log;

error_log logs/book.error;
#将所有请求转发给demo_pool池的应用处理
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://book_pool;
}

}

Demo2端口转发

server {

listen 80;

server_name movie.chanshuyi.com;

access_log logs/movie.log;

error_log logs/movie.error;

#将所有请求转发给demo_pool池的应用处理
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://movie_pool;
}

}

上面这段配置实现了:

1、当用户访问的域名是:http://book.chanshuyi.com 时,我们自动将其请求转发给端口号为 8001 的 Tomcat 应用处理。

2、当用户访问的域名是:http://movie.chanshuyi.com 时,我们自动将其请求转发给端口号为 8002 的 Tomcat 应用处理。

上面的这种技术实现就是端口转发。端口转发指的是由软件统一监听某个域名上的某个端口(一般是80端口),当访问服务器的域名和端口符合要求时,就按照配置转发给指定的 Tomcat 服务器处理。我们常用的 Nginx 也有端口转发功能。

用 Nginx 实现端口转发

下面我们将从零开始,讲解如何配置端口转发。

首先去 Nginx 官网下载一个 Windows 版本的 Nginx,或者直接点击这里下载。这里我们用的是 Nginx1.8

下载解压之后的目录结构如下:

其中 conf 目录存放的是 Nginx 的配置文件,logs 存放的是 Nginx 的日志文件。

下面我们先模拟两个 tomcat 应用。到这里下载 tomcat604401.zip 和 tomcat604402.zip,它们是两个简单的Web项目,我们将通过他们来测试 Nginx 的配置是否成功。

下载之后直接运行两个 tomcat 下面的 bin/startup.bat,然后访问下面的链接看是否应用是否正常启动:

http://localhost:8001/

http://localhost:8002/

正常情况下会访问到具体的页面:

如果能看到上面的页面,那说明 tomcat 启动成功了。

下面我们进行 Nginx 配置,来实现端口转发。把下面的内容复制并覆盖 conf/nginx.conf 文件:

#user  nobody;
worker_processes 1;

error_log logs/error.log;

error_log logs/error.log notice;

error_log logs/error.log info;

pid logs/nginx.pid;

events {

worker_connections 1024;

} http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;
#配置负载均衡池
#Demo1负载均衡池
upstream book_pool{
server 127.0.0.1:8001;
}
#Demo2负载均衡池
upstream movie_pool{
server 127.0.0.1:8002;
} #Demo1端口转发
server {
listen 80;
server_name book.chanshuyi.com;
access_log logs/book.log;
error_log logs/book.error; #将所有请求转发给demo_pool池的应用处理
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://book_pool;
}
}
#Demo2端口转发
server {
listen 80;
server_name movie.chanshuyi.com;
access_log logs/movie.log;
error_log logs/movie.error; #将所有请求转发给demo_pool池的应用处理
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://movie_pool;
}
}

}

之后双击 nginx.exe 启动 Nginx。打开 Windows 任务管理器,如果看到 nginx 的进程,那么说明启动成功了,否则根据 logs 文件夹下的日志文件进行修改。

之后打开 C:\Windows\System32\drivers\etc\hosts 文件,添加以下配置:

# Set the Domain Redirect
127.0.0.1 book.chanshuyi.com movie.chanshuyi.com

(设置 host 主要是为了使域名重定向。进行了上述配置之后,在本机访问  book.chanshuyi.com movie.chanshuyi.com 的时候,系统会将请求转发给指定IP的服务器,而不是通过DNS服务器解析。通过设置 HOST,我们即使没有域名,也可以在本机用域名的方式访问自己启动的应用程序。)

之后我们打开浏览器,输入如下地址访问:

http://book.chanshuyi.com

http://movie.chanshuyi.com

[MARK PIC1]

[MARK PIC2]

如果你成功看到以上页面,那说明 Nginx 成功启动并配置成功了。

Nginx 端口转发原理

下面我们来看看从发送 HTTP 请求到具体的 tomcat 应用处理的整个流程。

在本例中,当我们启动 Nginx 时, Nginx 就启动线程不断地监听 80 端口。用户浏览器发送 book.chanshuyi.com 请求,服务器接收到用户的 HTTP 请求时 Nginx 也监听到了这一时间。于是 Nginx 从 HTTP 请求头中取出用户请求的 server_name,并与配置文件中配置的进行匹配,如果匹配成功,那么就将请求转发给对应的应用服务器处理。否则 Nginx 将此次请求转发给配置文件中配置的第一个 server。

例如:用户通过浏览器发送 book.chanshuyi.com 请求,Nginx 监听到服务器 80 端口上的请求,并根据配置文件寻找对应的server。

#Demo1端口转发
server {
listen 80;
server_name book.chanshuyi.com;
access_log logs/book.log;
error_log logs/book.error;
#将所有请求转发给demo_pool池的应用处理
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://book_pool;
}

}

Nginx 找到了对应的server,并发现对应的 server 配置了一个负载均衡池 book_pool。于是它将此请求分配给负载均衡池的应用服务器处理,即本机上端口为 8001 的应用服务器。

#Demo1负载均衡池
upstream book_pool{
server 127.0.0.1:8001;
}

到这里关于端口转发就结束了。我们将在下一篇中介绍如何进行负载均衡的配置。

参考资料:

1.http://blog.csdn.net/agangdi/article/details/40921199

windows下nginx中配置端口转发 ----本文来自转载的更多相关文章

  1. linux中nginx中配置端口转发

    域名指向主机IP地址,通过域名:8080才能访问网站,去掉后面的8080:或者其他的端口号,直接使用域名访问网站 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处 ...

  2. 【Windows】netsh动态配置端口转发

    文章转载自傲风 使用多个虚拟机,将开发环境和工作沟通环境分开(即时通,办公系统都只能在windows下使用-),将开发环境的服务提供给外部访问时,需要在主机上通过代理配置数据转发. VirtualBo ...

  3. Windows下Nginx的配置及配置文件部分介绍

    一.在官网下载 nginx的Windows版本,官网下载:http://nginx.org/download/ 选择你自己想要的版本下载,解压 nginx(例如nginx-1.6.3) 包到你的win ...

  4. windows下nginx的配置

    这里做的nginx的配置主要的功能是: 能够用localhost访问本地文件夹中的项目 输入ip地址访问本地文件夹中的项目 反向代理其他地址访问本地文件 1.nginx安装地址 2.解压之后的文件如下 ...

  5. Linux中配置端口转发(反向代理)

    在conf.d目录下建一个文件, 以conf为结尾(如果没有conf.d目录,就自己新建一个) server { listen 80; server_name 127.0.0.1; #这个IP是你服务 ...

  6. Windows下nginx+php配置

    1. 首先,将 nginx.conf 中的 PHP 配置注释去掉. # pass the PHP scripts to FastCGI server listening on # #location ...

  7. 使用docker安装nginx并配置端口转发

    使用docker安装并运行nginx命令: docker run --name=nginx -p 80:80 -d docker.io/nginx 使用命令: docker exec -it ngin ...

  8. 在windows下codeblocks中配置pthread库

    转自:http://blog.csdn.net/u013172314/article/details/50846198 如果添加方法不正确,可能会出现pthread_create’未定义的引用,所以下 ...

  9. windows下虚拟环境中配置MySQL-python错误问题

    下载mysql 下载mysql-python 这两步基本没有问题怪就怪的 MySQL-python-1.2.3.win-amd64-py2.7 文件只能安装到python27  路径下 然后在虚拟环境 ...

随机推荐

  1. python爬取新浪财经

    我们来获取这里的title和url然后再获取这里面url的编辑作者 可以看到右边的几个就对应的左边不同的div .m-p1-mb2-list.m-list-container ul li a impo ...

  2. 极简 Node.js 入门 - 4.2 初识 stream

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  3. 转载:pycharm IDE 导入自定义模块

    http://www.mamicode.com/info-detail-2241193.html

  4. noSql 的应用场景简述

    选型一定要结合实际情况而不是照本宣科,比如: 企业发展之初,明明一个关系型数据库就能搞定且支撑一年的架构,搞一套大而全的技术方案出来 有一些数据条件查询多,更适合使用ElasticSearch做存储降 ...

  5. ios7.1发布企业证书测试包的问题

    关于升级了ios7.1之后发布企业版证书的测试包不能下载的问题,这个苹果也挺坑的,什么都不说,也不警告一下,直接就不能用了 用xcode的organizer里面的console里发现安装的时候提示这个 ...

  6. Python-py2和py3读写文本区别

    python2和python3的区别? python 2  str             对应      python3 bytes python 2 uincode            对应   ...

  7. java安全编码指南之:方法编写指南

    目录 简介 不要在构造函数中调用可以被重写的方法 不要在clone()方法中调用可重写的方法 重写equals()方法 hashCode和equals compareTo方法的实现 简介 java程序 ...

  8. Serial.begin

    串口波特率的设置:通常我们使用Serial.begin(speed)来完成串口的初始化,这种方式,只能配置串口的波特率. 使用Serial.begin(speed, config)可以配置数据位.校验 ...

  9. 微型直流电机控制基本方法 L298N模块

    控制任务 让单个直流电机在L298N模块驱动下,完成制动.自由停车,正反转,加减速等基本动作 芯片模块及电路设计 图1 L298N芯片引脚 图2 L298N驱动模块 表1 L298N驱动模块的控制引脚 ...

  10. LiteOS-任务篇

    目录 前言 链接 参考 笔录草稿 基本概念 任务相关概念 LiteOS 任务运作机制 内核初始化 创建任务 创建任务有两种方案 任务相关函数 任务开发流程 创建创建任务 部分源码 例子 创建任务的任务 ...