nginx

nginx笔记

做一个软连接
sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin

这样就可以通过sudo nginx来启动 停止加 -s stop 参数
-s reload 重启

1.配置文件还是在/usr/local/nginx/conf下

为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

步骤 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共享教程的讲解

nginx反向代理

步骤 1 : 反向代理概念
先说正向代理,比如要访问youtube,但是不能直接访问,只能先找个FQ软件,通过FQ软件才能访问youtube. FQ软件就叫做正向代理。
所谓的反向代理,指的是用户要访问youtube,但是youtube悄悄地把这个请求交给bilibili来做,那么bilibili就是反向代理了。
在当前教程指的就是访问nginx,但是nginx把请求交给tomcat来做。

步骤 2 : 启动tomcat
首先启动多个Tomcat 中端口号是8111的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来处理

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

nginx -s reload

然后访问地址:

http://127.0.0.1/

(这里访问的是nginx的80端口 但是会被反向代理到tomcat)
就会观察到已经反向代理到tomcat了
步骤 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. 从而达到动静分离的效果。 接下来就会讲解如何进行动静分离。

nginx动静分离

步骤 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

这个路径就是项目对应的webapp目录
这里要注意,填写本地地址的时候要用正斜杠 / 不要用反斜杠\

步骤 3 : 观察效果
访问地址,观察到静动都有的效果

http://127.0.0.1/login.jsp

步骤 4 : 观察tomcat输入日志
再到tomcat的输出


nginx负载均衡

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

步骤 2 : 启动两个Tomcat
到多个Tomcat下载解压8111和8222两个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 的session共享

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

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

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

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

步骤 3 : 解决办法二: redis+tomcat-sessoin-manager
既然第一种解决办法有问题,那么就采用第二种解决办法:用Redis来存取session.
Redis是什么呢?说简单点就是个独立的Hashmap,用来存放键值对的。
这样当tomcat1需要保存session值的时候,就可以把它放在Redis上,需要取的时候,也从Redis上取。
那么考虑这个情景:

  1. 用户提交账号密码的行为被分配在了tomcat8111上,登陆信息被存放在redis里。
  2. 当用户第二次访问的时候,被分配到了tomcat8222上
  3. 那么此时tomcat8222就会从redis去获取相关信息,一看有对应信息,那么就会呈现登陆状态。

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

步骤 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程序

步骤 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都要放

步骤 7 : 修改context.xml
然后修改tomcat/conf/context.xml ,增加下面这坨东西 两个tomcat都要改

 <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" /> 

步骤 8 : 重启tomcat
两个tomcat都要重启

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

http://127.0.0.1:8111/login.jsp

步骤 10 : 测试访问tomcat8222
然后直接访问tomcat8222

http://127.0.0.1:8222/login.jsp

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

posted @ 2020-05-14 22:59  lanvce  阅读(222)  评论(0)    收藏  举报
//小火箭