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/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
然后访问地址:
(这里访问的是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 重启,然后使劲访问
此时就可以观察到对jsp的访问,被分配到了不同的 Tomcat上

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

步骤 2 : 解决办法一: ip_hash
通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat.
这样就不会出现负载均衡 session问题了. 处理手段也很简单,如图所示在upstream最后加上ip_hash;就行了。
不过这种方案并不完美,当如下几种情况发生时就有问题:
- 大量请求来之某个局域网,那么相当于就没有负载均衡了
- 如果tomcat_8111 挂了,那么此时nginx只能把请求交给tomcat_8222,但是这里却没有记录session,用户体验依然受影响。

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

步骤 4 : 接下来进行具体操作
接下来进行具体操作,分几个步骤
- 启动redis
- 给两个tomcat使用jar包
- 配置两个tomcat
- 重启两个tomcat
- 测试
步骤 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上登陆,但是可以观察到已经呈现为登陆状态了


浙公网安备 33010602011771号