什么是端口转发

当我们在服务器上搭建一个图书以及一个电影的应用,其中图书应用启动了 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. Nginx - Windows下Nginx基本安装和配置

    Nginx 是一个轻量级的高性能 Http WebServer,以事件驱动方式编写,因此相比 Apache 而言,Nginx 更加稳定.性能更好,而且配置简单,资源占用较低. 1. 安装 Nginx ...

  2. windows下nginx的安装和使用

    LNMP的安装与配置 windows下的nginx安装和使用 1.1 去官网下载相应的安装包:http://nginx.org/en/download.html 1.2 解压后进入PowerShell ...

  3. windows下nginx的安装及使用方法入门

    nginx功能之一可以启动一个本地服务器,通过配置server_name和root目录等来访问目标文件 一. 下载 http://nginx.org/   下载后解压   二. 修改配置文件 ngin ...

  4. windows下nginx的安装及使用

    安装过程比较简单 1.下载nginx http://nginx.org/en/download.html 下载稳定版本,以nginx/Windows-1.14.2为例,直接下载 nginx-1.14. ...

  5. windows下nginx的安装

    一. 下载 http://nginx.org/    (下载后解压) 二. 修改配置文件 nginx配置文件在 nginx-1.8.0\conf\nginx.conf http { gzip on; ...

  6. Windows下Nginx的安装与配置

    Nginx ("engine x") 是一款高性能的,轻量级的HTTP Web 服务器 和 反向代理服务器及电子邮件 IMAP/POP3/SMTP 代理服务器. Nginx 是由俄 ...

  7. windows下nginx的安装及使用(转载)

    转载自:https://www.cnblogs.com/jiangwangxiang/p/8481661.html 1.下载nginx http://nginx.org/en/download.htm ...

  8. Windows下MongoDB的安装过程及基本配置

    首先当然是到官网下载 MongoDB 了,点击进入后会看到下载页面,如下图所示: 安装有2种方式: 一种是通过直接点击下载的安装文件进行安装: 另一种是通过命令提示符来安装,下面我将直接通过第一种方式 ...

  9. Windows下Java JDK安装和环境变量配置

    [Java攻城狮学习路线](http://www.cnblogs.com/apollospotatolikett/p/8665123.html 1.JDK下载 下载地址:http://www.orac ...

随机推荐

  1. Python sphinx-build在Windows系统中生成Html文档

    看到前同事发布的“Markdown/reST 文档发布流水线”基于TFS.Docker.Azure等工具和平台进行文档发布的介绍说明,不得不在心中暗暗竖起大拇指.这套模式,实现了文档编写后版本管理.发 ...

  2. 【Zookeeper】源码分析之网络通信(二)

    一.前言 前面介绍了ServerCnxn,下面开始学习NIOServerCnxn. 二.NIOServerCnxn源码分析 2.1 类的继承关系 public class NIOServerCnxn ...

  3. mfc---添加背景图

    添加背景图: CDC m_dcMem CBitmap m_bmpMem CDC * pDC = GetDC(); m_dc.CreateComparableDC(pDC); m_bmpMem.Load ...

  4. 本人开发的JavaWeb急速框架Blast上线了

    JAVA 急速WEB框架Blast --对JavaWeb的学习性框架,参考了spring的实现 --阅读Blast源码可以快速掌握JavaWeb常用技术和方法论,并付诸实践 Blast 是基于 Jav ...

  5. File类和时间类的两道综合练习

    练习1: 获取指定目录下(包含子目录)所有的某一种类型的文件 分析: 1.指定路径并获取其下的文件对象 2.要判断给定的目录是否为空 3.要判断给定路径下获取的目录是否为空 4.判断是否是某种文件 5 ...

  6. 1202: [HNOI2005]狡猾的商人

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1554  Solved: 745[Submit][Stat ...

  7. Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建

    日常啰嗦 前面一篇文章讲了一下版本控制,但其实这一篇并没有打算讲细节的,感觉应该自己去动手弄一下,后来考虑了一下,版本控制真的挺重要的,如果自己实在搭建不好反而不去使用的话,真的有点可惜,当然这些话是 ...

  8. 【HLA】初识HLA/RTI

    本文主要对近期所翻阅的一些论文及资料进行的概要性整理,后续会有更多的关于HLA的研究细节发布,基于博客园的知识共享平台,以期共同进步! 一.引言 仿真的历史由来已久,在系统研制过程中,基于建模及仿真技 ...

  9. C 风格字符串相加

    <<C++ Primer>> 第四版Exercise Section 4.3.1 的4.3.0 有如下题目:编写程序连接两个C风格字符串字面值,把结果存储在C风格字符串中.代码 ...

  10. 两个 Long 类型为什么不能直接用==比较

    这要说到==和 equals 的区别了. 1. ==比较的是两个对象在内存中的地址值(栈中的内容). 2.equals 是 java.lang.Object 类的一个方法.equals 比较的是两个对 ...