使用Nginx反向代理 让IIS和Tomcat等多个站点一起飞
使用Nginx 让IIS和Tomcat等多个站点一起飞
前言:
养成一个好习惯,解决一个什么问题之后就记下来,毕竟“好记性不如烂笔头”。
这样也能帮助更多的人 不是吗?
最近闲着没事儿瞎搞,自己在写一个ASP.NET MVC的系统,所以理所当然的 在服务器上搭建了一个IIS。
可是,学员要做JSP的项目了,涉及一些在线API回调的问题,所以没招,给他们又搭建了一个Tomcat。
那么、问题来了。。
我IIS里面的这些站点,可以使用IIS自带的绑定功能,分别绑定多个域名共享80端口。
但是,Tomcat呢?肯定不能绑定80了吧?可如果不绑定80。难道我要“http://www.xxx.com:8080”这么访问Tomcat里面的站点吗?!
于是乎,各种解决方案在脑子里想了个遍。甚至修改hosts、使用FastCGI等等都想过了。可我又不想这么玩。唉。
没招,最后想到了Nginx这个神器。因为它 支持反向代理。而且Linux也能用哦~
问:IIS7之后不也支持反向代理了嘛?你这多此一举。
大哥。我这讲的是Nginx,不要打扰我装X好嘛。。呵呵,开个玩笑。其实装X是次要的,主要还是我服务器想换成Linux的。(说的自己都不信了 哈哈)
废话不多说,开始正文。O(∩_∩)O哈哈~
目录:
1. Nginx介绍
如我“前言”所说,在IIS里面,我们搭建多个站点可以使用自带的绑定端口的方式实现。
但是如果这时候又加一个Tomcat呢?没法绑定80端口了,因为已经被IIS占用了。可是我又不可能“http://www.xxx.com:8080”去访问吧?
当然我们可以像我发过的一篇文章《IIS8 使用FastCGI配置PHP环境支持 过程详解》那样,在IIS中添加PHP的cgi映射,来添加对php的支持。
JSP也同样可以使用FastCGI。但是我不想这么玩了,个人觉得 老是用IIS没啥技术含量,如果以后还遇到什么东西,不支持FastCGI怎么办呢?
对吧。你没法改变这个社会,没招,只能改变自己去适应社会的变化。
所以最后就想到了咱们的Nginx。
简单介绍一下,Nginx主要支持反向代理,什么意思呢?
说白了就是,你把80端口绑定给Nginx,然后通过配置文件告诉它:我访问www.aaa.com域名,你给我把请求转发到www.aaa.com:81上面;我访问www.bbb.com域名,你给我把请求转发到www.bbb.com:8080上面。等等等等。。
这时候大概大家已经明白了我这里为啥用Nginx了吧。呵呵。就是因为这个功能。
当然,如果你认为它只是做代理转发的,那你就错了。
Nginx除了可以实现反向代理来自定义转发你的请求,它还能通过配置文件实现Session跨域、请求过滤、负载均衡等等等的功能。
详细的介绍和使用,大家可以去官网或自行Google查阅。各种用法,各种介绍。特别详细的。
是不是有点儿意思哈?呵呵。分享一下我这里的IIS+Tomcat的多个站点是怎么弄的吧。
2. 下载&安装Nginx
进入官网http://nginx.org/,下载Nginx程序文件,最新版本列表如图:
不像其他软件那样,下载还需要注册登录啥的,这个什么都不需要,直接选择版本就可以免费下载。而且程序仅1.xMB大小。
点击版本连接进入后,会让您选择平台Windows还是Linux:
这里我下载的是Windows的1.10.0:
Nginx是绿色解压版的,不需要运行安装程序,直接解压完就能用。
这里,我将其解压到了D:\Nginx目录了,目录文件如下:
双击运行nginx.exe,只见一DOS界面一闪而过,我特么还以为眼花了呢。再双击。还是一闪而过。
WTF?!什么鬼?!
按照网上教程里面的剧本儿来说,双击运行后,确实是一闪而过,不过访问http://localhost可以看到Nginx的欢迎界面。
但是我打开浏览器,访问后,直接找不到服务器。顿时我方了。啥玩意儿?!
机智的我看到了D:\Nginx\logs\error.log错误日志文件,日志内容如下:
// :: [emerg] #: bind() to failed (: An attempt was made to access a socket in a way forbidden by its access permissions) // :: [emerg] #: bind() to failed (: An attempt was made to access a socket in a way forbidden by its access permissions) // :: [emerg] #: bind() to failed (: An attempt was made to access a socket in a way forbidden by its access permissions)
很明显,提示绑定当前计算机的80端口失败了。
我又打开DOS,切换到D:\Nginx,输入nginx.exe,提示错误也是这个。
于是乎,立马想到了IIS。因为如果绑定80端口失败,肯定是80被占用了啊。
我就把所有网站都停止了,甚至IIS服务都停了,还是不行。
你妹妹的,逼我,查看80端口到底是被谁占用了。
大家可以使用netstat的DOS命令查看,也可以使用任务管理器中的资源查看器查看,当然如果都不会用,你也可以使用360的网络连接查看器查看。
找到之后kill结束掉它。
最后发现,不是IIS的问题,因为IIS并不绑定什么80端口,顶多也只是IIS里面的网站绑定的80访问端口罢了。
罪魁祸首是另一个服务:Web Deploy服务,这个是我安装IIS的时候额外安装的一个东西,为了远程发布部署用的。
当然,现在并不用,停止服务即可。
然后再回去运行nginx.exe,同样是一闪而过(因为nginx是隐式运行在进程中的),但是http://localhost已经可以访问了。
Nginx的欢迎界面如下所示:
看到这个界面了,给我激动的,真想抱着媳妇儿狠亲一口。(然而却是单身狗依旧)
3. 小试Nginx
我打开了IIS,新建了一个站点,域名是www.geeksss.com,绑定的端口是81。
下面我想使用Nginx,配置之后,通过www.geeksss.com,自动将请求代理转发到www.geeksss.com:81上。
步骤如下:
之前说过,Nginx只需要设置好配置文件就可以了。
打开D:\Nginx\conf\nginx.conf配置文件,准备自定义修改一下。
桥豆麻袋、等一下。
万一一会儿改叉劈了程序报废了改不回去了怎么办?还是先备份一下。哈哈。
(养成个习惯)
配置文件注释都是英文的,我就不一一介绍了,文章也不太好介绍着每个参数。
所以我就简单地配置了一项,顺便把主要的注释都翻译过来了,修改后的内容如下:
#运行用户 #user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes ; #全局错误日志及PID文件 error_log logs/error.log; error_log logs/error.log notice; error_log logs/error.log info; pid logs/nginx.pid; #工作模式及连接数上限 events { #单个后台worker process进程的最大并发链接数 worker_connections ; } #设定http服务器,利用它的反向代理功能提供负载均衡支持 http { #设定mime类型,类型由mime.type文件定义 include mime.types; default_type application/octet-stream; #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 logs/access.log; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime. sendfile on; #tcp_nopush on; #连接超时时间 #keepalive_timeout ; keepalive_timeout ; #开启gzip压缩 gzip on; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; #设定请求缓冲 client_header_buffer_size 1k; large_client_header_buffers 4k; # www.geeksss.com server{ listen ; #侦听端口 server_name www.geeksss.com; #定义使用www.xx.com访问 #charset koi8-r; access_log logs/www.geeksss.com.access.log; #设定本虚拟主机的访问日志 #默认请求 location / { root /; # 定义服务器的默认网站根目录位置 index Home/Index; # 定义首页索引文件的名称 proxy_pass http://www.geeksss.com:81 ; #请求转向mysvr 定义的服务器列表 } #error_page /.html; # redirect server error pages to the static page /50x.html # 定义错误提示页面 error_page /50x.html; location = /50x.html { root /root; } } }
nginx.conf 配置实例
可以发现,我修改了里面的“server”配置项,注释已经很明确了,如果还不明白呢可以自行查阅相关文档或留言。
这里简单介绍一下server配置项中的几个参数:
- listen:监听的端口
- server_name:当前的配置可以通过什么域名访问
- access_log:当前server的日志文件位置
- location:配置请求,类似路由的概念
- location->proxy_pass:当前请求代理转发到哪
- error_page:重定向错误页的位置
我上面的server意思就是:nginx监听80端口的请求,如果是server_name过来的,则代理转发到proxy_pass。
很简单吧?
这样,当我访问www.geeksss.com的时候,实际上是通过Nginx将请求转发到了IIS中的www.geeksss.com:81的站点了。
4. IIS+Tomcat并用
我搭建了两个Tomcat站点,然后修改Tomcat\conf\server.xml文件,添加了两个Host进行绑定,修改后的server.xml文件如下所示:
<?xml version='1.0' encoding='utf-8'?> <Server port=" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port=" /> <Connector port=" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name=" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Alias>.bdqnbky.com</Alias> <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="ts2121.bdqnbky.com_log." suffix=".txt" timestamp="true"/> <Context path="></Context> </Host> <Host name=" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Alias>.bdqnbky.com</Alias> <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="ts2122.bdqnbky.com_log." suffix=".txt" timestamp="true"/> <Context path="></Context> </Host> </Engine> </Service> </Server>
修改后的Tomcat\conf\server.xml 文件
详细的Tomcat配置就不过多介绍了,不属于本篇范围之内。毕竟估计讲详细了,又得来个长篇大论了。。。
只需要在下面修改一下<Host>节点配置就可以了,每个Host对应一个Tomcat站点。
其中<Host>中的<Alias>表示的是当前<Host>配置的站点绑定的域名。
也就是说,现在我的Tomcat有两个站点:http://ts2121.bdqnbky.com:8080和http://ts2122.bdqnbky.com:8080。
再加上我的IIS里面其中的两个站点:http://www.geeksss.com:81和http://api.geeksss.com:82两个站点。
额外再加上我的JetBrains在线注册服务器:http://www.geeksss.com:1996。
现在一共是五个站点。而且域名都不一样。
下面,配置Nginx,nginx.conf文件配置如下:
#运行用户 #user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes ; #全局错误日志及PID文件 error_log logs/error.log; error_log logs/error.log notice; error_log logs/error.log info; #pid logs/nginx.pid; #工作模式及连接数上限 events { #单个后台worker process进程的最大并发链接数 worker_connections ; } #设定http服务器,利用它的反向代理功能提供负载均衡支持 http { #设定mime类型,类型由mime.type文件定义 include mime.types; default_type application/octet-stream; #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 logs/access.log; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime. sendfile on; #tcp_nopush on; #连接超时时间 #keepalive_timeout ; keepalive_timeout ; #开启gzip压缩 gzip on; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; #设定请求缓冲 client_header_buffer_size 1k; large_client_header_buffers 4k; ############################################################ # IIS # listen : www.geeksss.com: # redirect : www.geeksss.com: ############################################################ server{ listen ; #侦听端口 server_name www.geeksss.com geeksss.com; #定义使用www.xx.com访问 #charset koi8-r; access_log logs/www.geeksss.com.access.log; #设定本虚拟主机的访问日志 #默认请求 location / { root /; # 定义服务器的默认网站根目录位置 index Home/Index; # 定义首页索引文件的名称 proxy_pass http://www.geeksss.com:81 ; #请求转向mysvr 定义的服务器列表 } #error_page /.html; # redirect server error pages to the static page /50x.html # 定义错误提示页面 error_page /50x.html; location = /50x.html { root /root; } } ############################################################ # IIS # listen : api.geeksss.com: # redirect : api.geeksss.com: ############################################################ # api.geeksss.com server{ listen ; #侦听端口 server_name api.geeksss.com; #定义使用www.xx.com访问 #charset koi8-r; access_log logs/api.geeksss.com.access.log; #设定本虚拟主机的访问日志 #默认请求 location / { root /; # 定义服务器的默认网站根目录位置 #index Home/Index; # 定义首页索引文件的名称 proxy_pass http://api.geeksss.com:82; #请求转向mysvr 定义的服务器列表 } #error_page /.html; # redirect server error pages to the static page /50x.html # 定义错误提示页面 error_page /50x.html; location = /50x.html { root /root; } } ############################################################ # IntelliJIDEALicenseServer # listen : www.geeksss.com: # redirect : www.geeksss.com: ############################################################ upstream JetbrainsRegister { server ; server www.geeksss.com:; } server{ listen ; #侦听端口 server_name www.geeksss.com; #定义使用www.xx.com访问 #charset koi8-r; access_log logs/www.geeksss.com..access.log; #设定本虚拟主机的访问日志 #默认请求 location / { proxy_pass http://JetbrainsRegister; #请求转向mysvr 定义的服务器列表 } } ############################################################ # Tomcat # listen : ts2121.bdqnbky.com: # redirect : ts2121.bdqnbky.com: ############################################################ server { listen ; #侦听端口 server_name ts2121.bdqnbky.com; #定义使用www.xx.com访问 #charset koi8-r; access_log logs/ts2121.bdqnbky.com.access.log; #设定本虚拟主机的访问日志 #默认请求 location / { root /; # 定义服务器的默认网站根目录位置 index index.jsp; # 定义首页索引文件的名称 proxy_pass http://ts2121.bdqnbky.com:8080 ; #请求转向mysvr 定义的服务器列表 } #error_page /.html; # redirect server error pages to the static page /50x.html # 定义错误提示页面 error_page /50x.html; location = /50x.html { root /root; } # proxy the PHP scripts to Apache listening on # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on # #location ~ \.php$ { # root html; # fastcgi_pass ; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } ############################################################ # Tomcat # listen : ts2122.bdqnbky.com: # redirect : ts2122.bdqnbky.com: ############################################################ server{ listen ; #侦听端口 server_name ts2122.bdqnbky.com; #定义使用www.xx.com访问 #charset koi8-r; access_log logs/ts2122.bdqnbky.com.access.log; #设定本虚拟主机的访问日志 #默认请求 location / { root /; # 定义服务器的默认网站根目录位置 #index Home/Index; # 定义首页索引文件的名称 proxy_pass http://ts2122.bdqnbky.com:8080; #请求转向mysvr 定义的服务器列表 } #error_page /.html; # redirect server error pages to the static page /50x.html # 定义错误提示页面 error_page /50x.html; location = /50x.html { root /root; } } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen ; # listen somename:; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
nginx.conf 最终的配置
可以看到,我配置了四个server,也就对应着每个站点。
其中的listen监听端口都是80。但是server_name,也就是请求进入的域名却不相同。
然后通过location -> proxy_pass代理转发到了实际的每个站点。
这时,只需要如下访问即可自动跳转到对应的域名不同的各个站点,而且不需要添加任何端口号,因为Nginx自动给你转发过去了:
http://www.geeksss.com,实际转发:http://www.geeksss.com:81
http://api.geeksss.com,实际转发:http://api.geeksss.com:82
http://ts2121.bdqnbky.com,实际转发:http://ts2121.bdqnbky.com:8080
http://ts2122.bdqnbky.com,实际转发:http://ts2122.bdqnbky.com:8080
http://www.geeksss.com:2015,实际转发:http://www.geeksss.com:1996
OK。大功告成。
5. 启动/停止/重启 Nginx
DOS命令即可控制,为了使用方便,大家也可以将Nginx所在目录配置到系统环境变量的path中,方便随时随地通过dos控制。
启动:nginx -s start
停止:nginx -s stop
重启:nginx -s reload
其它命令大家可以参阅官网文档,其实暂时主要用到的也就上面这三个命令了。哈哈
6. 结尾
关于Nginx其他的配置,例如跨域和负载均衡等等,大家可以先把这个玩儿明白了,然后其实就很简单了。
无非就是修改点儿配置文件而已。
而且Linux里面的用法和这个也是一样的。
等有时间了,我再搞个相应的文章。
最后,觉得听懂了,感觉还不错的,记得点赞推荐哦~
O(∩_∩)O 摸摸哒~
使用Nginx反向代理 让IIS和Tomcat等多个站点一起飞的更多相关文章
- Nginx反向代理下IIS获取真实IP
1. iis 如果放在反向代理后面,日志里的c-ip是反向代理服务器的ip,不是真正用户的ip,想要记录用户的ip要做两件事. 一.在反向代理设置X-Forwarded-For段,以下为nginx下的 ...
- IIS tomcat共用80端口解决一个IP多个域名:使用Nginx反向代理方式使两者兼容
环境: windows server 2003,IIS6服务器,Tomcat7服务器 域名有几个: 以下是使用IIS的域名: http://www.formuch.com/ http://www.fo ...
- (转)IIS tomcat共用80端口解决一个IP多个域名:使用Nginx反向代理方式使两者兼容
from :http://www.cnblogs.com/wuyou/p/3455619.html 环境: windows server 2003,IIS6服务器,Tomcat7服务器 域名有几个: ...
- nginx反向代理tomcat访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
问题说明:测试机上部署了一套业务环境,nginx反向代理tomcat,在访问时长时间处于加载中,十分缓慢! 通过浏览器调试(F12键->Console),发现有错误ERR_CONTENT_LEN ...
- nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题解决
Nginx反向代理tomcat,很是方便,但是也有些细节的问题需要注意:今天遇到了这样一个问题,tomcat中路径“host/web1”,nginx中直接“host/”代理,这时候session就无法 ...
- Nginx反向代理实现Tomcat多个应用80端口访问
应用背景 一般我们在开发时,一个工程里会有多个Web应用,比如一个前台一个后台,那我们就需要配置2个Tomcat服务器,比如一个是http://localhost:8080,一个是http://loc ...
- Tomcat多个项目部署,通过Nginx反向代理分别配置二级域名的流程
购买域名.示例:example.com 设置多个二级域名.如图: 配置tomcat文件: 修改tomcat/conf目录下的server.xml文件: 如下配置配置了3个容器,使用三个不同的端口. 请 ...
- Nginx反向代理实现Tomcat负载均衡
这篇短文主要介绍Tomcat的集群和用Nginx反向代理实现Tomcat负载均衡. 1.首先需要对一些知识点进行扫盲(对自己进行扫盲,囧): 集群(Cluster) 简单来说就是用N台服务器构成一个松 ...
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第九集之安装Tomcat+Nginx反向代理Tomcat集群】
1,安装Tomcat:和在windows下安装是一样的. 安装tomcat:上传后解压: tar -zxvf apache-tomcat-7.0.88.tar.gz -z:代表.gz格式的压缩包,-x ...
随机推荐
- 火焰图分析openresty性能瓶颈
注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...
- 传播正能量——做一个快乐的程序员
引子 今天在博客园看到施瓦小辛格的文章我们搞开发的为什么会感觉到累,顿时有感而发.自己本来不擅长写文章,更不擅长写这种非技术性的文章,但是在思绪喷薄之际,还是止不住有很多话要说.针对从客观上说&quo ...
- js复杂对象和简单对象的简单转化
var course = { teacher :{ teacherId:001, teacherName:"王" }, course : { courseId : 120, cou ...
- SQL Server-聚焦计算列或计算列持久化查询性能(二十二)
前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非 ...
- C#中将DataTable导出为HTML的方法
今天我要向大家分享一种将DataTable导出为到HTML格式的方法.有时我们需要HTML格式的输出数据, 以下代码就可以帮助我们达到目的,. 首先,我们要绑定DataTable和 DataGridV ...
- angular 源码分析 1 - angularInit()
angularjs 是个神奇的框架,由于我的好奇,想了解她的内部工作原理,只能一步一步的走进她,靠近她,和她深入的交流. angularjs 的入口是什么样子的呢?一起掀起她的盖头吧. 在这里我只讲方 ...
- ASP.NET MVC一次删除多笔记录
批量删除数据记录,如下面的截屏: 先选中想删除的记录,然后点一下删除铵钮,系统将把选中的记录一次性删除.在此,Insus.NET不想每删除一笔记录连接一次数据库. 因此需要把选择的记录一次上传至服务器 ...
- stringstream的基本用法
原帖地址:https://zhidao.baidu.com/question/580048330.htmlstringstream是字符串流.它将流与存储在内存中的string对象绑定起来.在多种数据 ...
- CentOS 7 修改主机名
今天在阿里云上买了一个centos7的服务器,连接上以后,发现一个很长很长的主机名,看着让人很是不爽,就想着怎样将其改成一个有个性的名字. 这里我想说的是,在centos7 版本的linux系统上和c ...
- Java版本:识别Json字符串并分隔成Map集合
前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...