在windows下搭建nginx+tomcat集群与负载均衡(新手角度从零开始)

以下内容均为笔者个人理解,有不足之处望读者指出。

集群:就是把业务拆分为多个子业务放在不同服务器上运行,简单的说就是多台服务器为一个业务进行服务。
负载均衡:直白的说就是为了减轻单台服务器的压力,把用户每一次的请求分发到不同的服务器上。

现在我们开始在windows下搭建nginx+tomcat集群与负载均衡,由于只是测试和述说流程,所以,笔者就在本机windows上操作(最后笔者也在阿里的windows主机上搭建了此环境,只是做了反向代理),但是在多台机器上操作也是同样的流程,期间我会把在搭建过程中遇到的问题也在下述中写出。

第一步: 先准备开发所需要的工具。nginx1.12.1、tomcat7(解压版)和jdk1.8版本,代码test和testo 两份,其中test和testo只需有index.jsp页面即可,但是页面内容不同。

之后解压nginx1.12.1 和 tomcat7在同一个文件夹下,便于操作。tomcat7解压为两份,分别命名为tomcat1、tomcat2. 如下图所示:

这里写图片描述

第二步: 在tomcat1的webapps文件夹下放入test和testo的war包(注意了tomcat1中test项目的index.jsp页面内容为hello 1,testo为hello 2)、tomcat2的webapps文件夹下放入test和testo的war包(注意了tomcat2中test项目的index.jsp页面内容为hello h1,testo为hello h2,内容读者可任意修改),对于不清楚war包是什么的读者百度了解一下。接下来修改tomcat1和tomcat2 conf文件夹下的server.xml文件,主要是修改端口号和配置其Host,不清楚Host是什么和做什么的同学百度去了解一下,笔者就不在赘述了。以下为tomcat1中修改后 的server.xml文件,给读者参考使用:

<Server port="8025" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <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>

  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container",
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->


    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8082" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the BIO implementation that requires the JSSE
         style configuration. When using the APR/native implementation, the
         OpenSSL style configuration is required as described in the APR/native
         documentation -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8029" protocol="AJP/1.3" redirectPort="8443" />


    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost">

      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>

      <!---注意name必须是真实的域名,或者在hosts文件中配置-->
      <Host name="www.test1.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
                <!---注意Context中docBase必须是test项目的绝对路径,path可不写--> 
                <Context docBase="C:\Users\Administrator\Desktop\work\tomcat1\webapps\test" path="" />

      </Host>

       <Host name="www.test2.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

             <Context docBase="C:\Users\Administrator\Desktop\work\tomcat1\webapps\testo" path="" />

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>
  </Service>

tomcat2中的配置和tomcat1中一样,就是修改端口号就可以,以下为tomcat2中修改后 的server.xml文件,给读者参考使用:

<Server port="8015" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <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>

  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container",
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->


    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the BIO implementation that requires the JSSE
         style configuration. When using the APR/native implementation, the
         OpenSSL style configuration is required as described in the APR/native
         documentation -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />


    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost">

      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>

      <Host name="www.test1.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

                <Context docBase="C:\Users\Administrator\Desktop\work\tomcat2\webapps\test" path="" />

      </Host>

       <Host name="www.test2.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

             <Context docBase="C:\Users\Administrator\Desktop\work\tomcat2\webapps\testo" path="" />

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
      <!---注意name必须是真实的域名,或者在hosts文件中配置-->
    </Engine>
  </Service>

以上配置中需要留意的地方就是注意Host的name必须是真实可访问的域名,不然就算是运行了项目,也是访问不了的!但是有读者没有域名怎么办?这个简单,我们只需要在本机电脑的hosts文件中配置一下就可以了,测试足够了。hosts文件位置为:C:\Windows\System32\drivers\etc。 主要配置如下:

# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#   127.0.0.1       localhost
#   ::1             localhost

192.168.1.105 www.test1.com  
192.168.1.105 www.test2.com  

以上配置读者要注意了,其中的192.168.1.105 是笔者自己电脑的ip地址,换成你们自己电脑的ip地址就可以,后面的www.test1.com ,www.test2.com 是测试使用的”域名”。

第三步:在nginx文件夹下找到nginx.exe ,双击运行nginx. nginx监听80端口,在浏览器直接输入localhost就可以访问了。也可以修改为其他端口,比如:8888等,不过在浏览器访问的时候,输入地址为localhost:8888。 效果图如下:

这里写图片描述

上图就是nginx运行成功的效果图,如果nginx启动失败,可能是端口冲突,修改端口,但是最好到logs下查看错误日志。

第四步:接下来就是配置nginx下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;


    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #做负载均衡
    upstream tomcat_server1 { 
        server www.test1.com:8081;  
        server www.test1.com:8082;                  
    }

    upstream tomcat_server2 { 
        server www.test2.com:8081; 
        server www.test2.com:8082;          
    }

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

     server {
        listen       80;
        server_name localhost;
        location / {  
            root   html;  
            index index.jsp index.html index.htm;  
        }

    }

    server {
        listen       80;
        server_name  www.test1.com;

        location /{  
        proxy_pass http://tomcat_server1;     #主要是这里,这是tomcat的端口和项目  
        proxy_set_header           Host $host;  
            proxy_set_header  X-Real-IP  $remote_addr;  
            proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;  
            client_max_body_size  100m;  
            root   html;  
            index index.jsp index.html index.htm;  
        } 

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

     server {
        listen       80;
        server_name  www.test2.com;

        location /{  
        proxy_pass http://tomcat_server2;     #主要是这里,这是tomcat的端口和项目  
        proxy_set_header           Host $host;  
            proxy_set_header  X-Real-IP  $remote_addr;  
            proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;  
            client_max_body_size  100m;  
            root   html;  
            index index.jsp index.html index.htm;  
        } 

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}

第五步:运行解压版的tomcat1,tomcat2(双击解压版bin文件夹下startup.bat即可),之后在运行nginx。就达到我们所期望的效果,如下:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

> 结束:以上的配置就这些,但是笔者还要读者注意一下,就是防火墙问题!无论你是在阿里购买的windows服务器还是linux版的服务器,都必须关闭防火墙或者在防火墙中加入以上项目运行端口,不然的话,端口被防火墙拦截了,你就达不到以上效果了!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在Linux系统上搭建nginxtomcat的具体步骤: 1. 安装nginxtomcat 在Linux系统上使用以下命令安装nginxtomcat: - 安装nginx: ``` sudo apt-get update sudo apt-get install nginx ``` - 安装tomcat: ``` sudo apt-get update sudo apt-get install tomcat8 ``` 2. 配置nginx 在/etc/nginx/sites-available目录下创建一个新的配置文件,例如myapp.conf。 编辑myapp.conf文件,加入以下内容: ``` server { listen 80; server_name example.com; location / { proxy_pass http://localhost:8080; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` 其中,example.com是你的域名,proxy_pass指向tomcat的地址,$remote_addr、$host和$proxy_add_x_forwarded_for是一些代理服务器的头信息。 保存并关闭文件。 在/etc/nginx/sites-enabled目录下创建一个符号链接,指向刚刚创建的配置文件: ``` sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/ ``` 重启nginx服务: ``` sudo systemctl restart nginx ``` 3. 配置tomcat 打开Tomcat配置文件/etc/tomcat8/server.xml,在Connector配置中添加以下内容: ``` <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" proxyName="example.com" proxyPort="80" scheme="http" /> ``` 其中,proxyName和proxyPort需要设置为你的域名和nginx的端口号。 保存并关闭文件。 重启tomcat服务: ``` sudo systemctl restart tomcat8 ``` 至此,nginxtomcat搭建就完成了。你可以通过访问http://example.com来访问你的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值