第一部分:Nginx下载运行

步骤 1 : 下载并解压
下载下载区(点击进入)的 nginx.rar 并解压
步骤 2 : 启动方式-直接双击
启动方式一般有两种:
第一种:直接双击方式
直接双击nginx.exe会有个屏幕一闪而过,这个时候,其实已经启动成功了。 只需要打开访问地址,就可以看到如图所示的效果:
http://127.0.0.1

关闭方式,与此配合的方式就是用任务管理器关闭了~
注: nginx启动之后,在任务管理里有两个nginx进程,这个是正常的,一个是1个守护进程 1个工作进程,得手动分别关闭。

启动方式-直接双击

步骤 3 : 启动方式-命令行
第二种:命令行方式
假设nginx在d:/software/nginx目录下,那么就需要通过如下命令启动:
cmd
cd d:/software/nginx
d:
start nginx

关闭方式也是与之对应的
nginx -s stop

启动方式-命令行

步骤 4 : 端口被占用
如果启动之后,无法访问,或者访问的是其他的页面,通常都是因为端口被占用了。 端口被占用,请参考 端口被占用了怎么办?
步骤 5 : 端口号修改
可以修改为其他端口号,打开nginx目录下的conf/nginx.conf文件,然后找到listen 80,修改为9090,关闭nginx再启动,就可以通过如下地址访问了:
http://127.0.0.1:9090/

注: 也可以通如下命令进行重启
nginx -s reload

端口号修改

步骤 6 : nginx.conf配置文件
nginx.conf 是nginx的核心配置文件,里面的内容也不少,主要有几个开发人员需要关心的:
  1. 端口号
    listen 80;

这个在端口号修改中已经提到了

  1. 页面存放位置:
    root html;

表示页面都存放在nginx的html目录下

  1. 欢迎页面
    index index.html index.htm;

默认会访问index.html或者index.htm文件

第二部分:为Nginx准备的多个Tomcat

步骤 1 : 为什么要提供多个Tomcat
在解释为什么要提供多个Tomcat之前,首先解释一下为什么要额外提供Tomcat。

Nginx是一个web服务器,很快速,但是不能作为Servlet 容器独立运行,所以通常的工作方式是Nginx配合Tomcat来协同工作。 这就是为什么要单独提供Tomcat,以方便配合Nginx进行工作。

那么为什么要提供多个Tomcat呢?因为在后续的负载均衡,session共享 教程里需要多个Tomcat来配合演示。 下载区(点击进入)有两个Tomcat,下载后运行其中的startup.bat就可以启动,端口号分别是8111和8222。
步骤 2 : 以8111为例,下载解压运行
下载下载区(点击进入)的tomcat_8111.rar,解压并运行其中bin目录下的startup.bat

以8111为例,下载解压运行

步骤 3 : 访问地址
启动之后访问地址:
http://127.0.0.1:8111/

会自动跳转到
http://127.0.0.1:8111/login.jsp

访问效果如图所示

访问地址

步骤 4 : 精心设计。。。
别看这个tomcat运行效果比较简单,其实是专门为了后续课程精心设计的。。。
步骤 5 : 动静分离
在login.jsp这个页面上有图片,图片是为了后续讲解动静分离做铺垫。 并且在tomcat里跟踪信息输出,用于观察图片静态资源的访问是否是在当前tomcat上发生。

动静分离

步骤 6 : 负载均衡
因为要做负载均衡,所以准备里两个一模一样的tomcat,只是他们的端口号不一样

负载均衡

步骤 7 : 登陆之后放session
登陆之后,会把登陆信息记录在session里。 这个便于后续的session共享教程的讲解

登陆之后放session

第三部分: 反响代理Tomcat

步骤 1 : 反向代理概念
所谓的反向代理,指的是用户要访问youtube,但是youtube悄悄地把这个请求交给bilibili来做,那么bilibili就是反向代理了。
在当前教程指的就是访问nginx,但是nginx把请求交给tomcat来做。
步骤 2 : 启动tomcat
首先启动多个Tomcat 中端口号是8111的tomcat

启动tomcat

步骤 3 : 修改nginx.conf
然后修改nginx.conf,主要是30-42行
 location / {proxy_pass http://127.0.0.1:8111;}
location / 表示处理所有请求
proxy_pass http://127.0.0.1:8111; 表示把请求都交给http://127.0.0.1:8111来处理
#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"';
 
    #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;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location / {proxy_pass http://127.0.0.1:8111;}
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}
 
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80#
        #location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}
 
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000#
        #location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    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;#}}
 
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;
 
    #    location / {#        root   html;#        index  index.html index.htm;#    }#}
 
    # HTTPS server
    #
    #server {#    listen       443 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;#    }#}
 }

步骤 4 : 重启nginx并访问
使用如下命令重启 nginx
nginx -s reload

然后访问地址:
http://127.0.0.1/

就会观察到已经反向代理到tomcat了

重启nginx并访问

步骤 5 : 意义何在
既然直接通过127.0.0.1:8111/login.jsp 可以访问,那么干嘛要通过127.0.0.1/login.jsp 去反向代理到tomcat呢? 为什么不直接使用tomcat呢?

因为nginx在处理静态文件的吞吐量上面比tomcat好很多,通常他们俩配合,不会把所有的请求都如本例所示的交给tomcat, 而是把静态请求交给nginx,动态请求,如jsp, servlet,ssm, struts等请求交给tomcat. 从而达到动静分离的效果。 接下来就会讲解如何进行动静分离。

第四部分:和Tomcat进行动静分离整合

步骤 1 : 动静分离概念
所谓的动静分离就是指图片,css, js之类的都交给nginx来处理,nginx处理不了的,比如jsp 就交给tomcat来处理~

好处是nginx处理静态内容的吞吐量很高,比tomcat高多了,这样无形中提升了性能。

动静分离概念

步骤 2 : 修改nginx.conf
在locaction下面添加一个新的location:
 location ~\.(css|js|png)$ {root C:/Users/X7TI/Downloads/tomcat_8111/webapps/ROOT;}

这表示所有的css js png访问都由nginx来做,访问的地址是
C:/Users/X7TI/Downloads/tomcat_8111/webapps/ROOT

这里要注意,填写本地地址的时候,要用正斜杠 / 不要用反斜杠 \

#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"';
 
    #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;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location / {proxy_pass http://127.0.0.1:8111;}
 
        location ~\.(css|js|png)$ {root C:/Users/X7TI/Downloads/tomcat_8111/webapps/ROOT;}
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}
 
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80#
        #location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}
 
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000#
        #location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    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;#}}
 
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;
 
    #    location / {#        root   html;#        index  index.html index.htm;#    }#}
 
    # HTTPS server
    #
    #server {#    listen       443 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;#    }#}
 }

步骤 3 : 观察效果
访问地址,观察到静动都有的效果
http://127.0.0.1/login.jsp

观察效果

步骤 4 : 观察tomcat输入日志
再到tomcat的输出日志里观察,就会发现,只访问了jsp, 所有的css,js,png都不会经过 tomcat,而是由nginx自己负责处理了。

观察tomcat输入日志

第五部分:和Tomcat进行负载均衡zheng'he

步骤 1 : 负载均衡的概念
负载均衡的概念就是当访问量很大的时候,一个 Tomcat 吃不消了,这时候就准备多个 Tomcat,由Nginx按照权重来对请求进行分配,从而缓解单独一个Tomcat受到的压力

负载均衡的概念

步骤 2 : 启动两个Tomcat
到多个Tomcat下载解压8111和8222两个tomcat,并启动

启动两个Tomcat

步骤 3 : 修改nginx.conf
首先增加一个upstream ,用来指向这两个tomcat
upstream tomcat_8111_8222{server  127.0.0.1:8111 weight=1;server  127.0.0.1:8222 weight=2;}

然后修改location,反向代理到上述配置。

 location / {proxy_pass http://tomcat_8111_8222;}

weight表示权重,值越大,被分配到的几率越大。 最大多少呢?我也不知道。。。反正10以内都可以用吧,我想的话~

#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"';
 
    #access_log  logs/access.log  main;
 
    sendfile        on;#tcp_nopush     on;
 
    #keepalive_timeout  0;keepalive_timeout  65;
 
    #gzip  on;
 
    upstream tomcat_8111_8222{server  127.0.0.1:8111  weight=1;server  127.0.0.1:8222 weight=2;}
 
    server {listen       80;server_name  localhost;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location / {proxy_pass http://tomcat_8111_8222;}
 
        location ~\.(css|js|png)$ {root C:/Users/X7TI/Downloads/tomcat_8111/webapps/ROOT;}
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}
 
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80#
        #location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}
 
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000#
        #location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    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;#}}
 
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;
 
    #    location / {#        root   html;#        index  index.html index.htm;#    }#}
 
    # HTTPS server
    #
    #server {#    listen       443 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;#    }#}
 }

步骤 4 : 重启nginx并访问
使用命令 nginx -s reload 重启,然后使劲访问
http://127.0.0.1/login.jsp

此时就可以观察到对jsp的访问,被分配到了不同的 Tomcat上

重启nginx并访问

第六部分:借助Jedis 对Tomcat做session共享

步骤 1 : 负载均衡 session问题
通过负载均衡课程,我们可以把请求分发到不同的 Tomcat 来缓解服务器的压力,但是这里存在一个问题: 当同一个用户第一次访问tomcat_8111 并且登录成功, 而第二次访问却被分配到了tomcat_8222, 这里并没有记录他的登陆状态,那么就会呈现未登录状态了,严重伤害了用户体验。

负载均衡 session问题

步骤 2 : 解决办法一: ip_hash
通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat.
这样就不会出现负载均衡 session问题了. 处理手段也很简单,如图所示在upstream最后加上ip_hash;就行了。

不过这种方案并不完美,当如下几种情况发生时就有问题:

  1. 大量请求来之某个局域网,那么相当于就没有负载均衡了
  2. 如果tomcat_8111 挂了,那么此时nginx只能把请求交给tomcat_8222,但是这里却没有记录session,用户体验依然受影响。

解决办法一: ip_hash

步骤 3 : 解决办法二: redis+tomcat-sessoin-manager
既然第一种解决办法有问题,那么就采用第二种解决办法:用Redis来存取session.
Redis是什么呢?说简单点就是个独立的Hashmap,用来存放键值对的。
这样当tomcat1需要保存session值的时候,就可以把它放在Redis上,需要取的时候,也从Redis上取。
那么考虑这个情景:
  1. 用户提交账号密码的行为被分配在了tomcat8111上,登陆信息被存放在redis里。
  2. 当用户第二次访问的时候,被分配到了tomcat8222上
  3. 那么此时tomcat8222就会从redis去获取相关信息,一看有对应信息,那么就会呈现登陆状态。

这样就规避了解决办法一: ip_hash里会出现的两种问题了。

注: 对 redis 不熟悉的同学,请先了解下 redis教程

解决办法二: redis+tomcat-sessoin-manager

步骤 4 : 接下来进行具体操作
接下来进行具体操作,分几个步骤
  1. 启动redis
  2. 给两个tomcat使用jar包
  3. 配置两个tomcat
  4. 重启两个tomcat
  5. 测试
    步骤 5 : 启动redis
    下载下载区(点击进入)的redis-2.4.5-win32-win64.zip,解压后运行对应(32位或者64位)的redis-server.exe程序

启动redis

步骤 6 : jar包
Tomcat需要链接 redis,所以需要专门的jar包,这些包都放在了下载区(点击进入)的tomcat-redis.rar里。 一共有3个jar包:
jedis-2.5.2.jar,
commons-pool2-2.0.jar,
tomcat-redis-session-manager1.2.jar。
下载解压后,放在tomat8111的lib目录下。注:不要放在webapp里面去了哦
下载解压后,放在tomat8222的lib目录下。注:不要放在webapp里面去了哦
两个tomcat都要放

jar包

步骤 7 : 修改context.xml
然后修改tomcat/conf/context.xml ,增加下面这坨东西
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" 
 host="127.0.0.1" 
 port="6379" 
 database="0" 
 maxInactiveInterval="60" />

两个tomcat都要改

<?xml version='1.0' encoding='utf-8'?><!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at
 
      http://www.apache.org/licenses/LICENSE-2.0
 
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.--><!-- The contents of this file will be loaded for each web application --><Context>
 <!-- Default set of monitored resources --><WatchedResource>WEB-INF/web.xml</WatchedResource>
 <!-- Uncomment this to disable session persistence across Tomcat restarts --><!--<Manager pathname="" />-->
 <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) --><!--<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />-->
 
  <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> 
  <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" 
   host="127.0.0.1" 
   port="6379" 
   database="0" 
   maxInactiveInterval="60" />
 </Context>

步骤 8 : 重启tomcat
两个tomcat都要重启
步骤 9 : 测试访问tomcat8111
Redis session共享机制和nginx其实无关,是发生在nginx之后的事情,所以直接访问login.jsp,然后登陆,并观察到已登陆状态
http://127.0.0.1:8111/login.jsp

测试访问tomcat8111

步骤 10 : 测试访问tomcat8222
然后直接访问tomcat8222
http://127.0.0.1:8222/login.jsp

虽然没有在tomcat8222上登陆,但是可以观察到已经呈现为登陆状态了

测试访问tomcat8222

步骤 11 : 下载已经配置好了的tomcat
如果对上述tomcat配置办法吃不准,请直接使用下载区(点击进入)的已经配置好了的:tomcat-redis-8111-8222.rar