nginx 常用用法
什么是nginx
Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
在高连接并发的情况下,Nginx是Apache服务器不错的替代品。
常用命令
启动服务 start nginx
停止服务 nginx -s stop
重启命令 nginx -s reload
反向代理
反向代理概念
先说正向代理,比如要访问一个网站,但是不能直接访问,只能先找个工具,通过工具才能访问. 工具就叫做正向代理。
所谓的反向代理,指的是用户要访问一个网站,但是网站悄悄地把这个请求交给另一个网站来做,那么另一个网站就是反向代理了。
在当前教程指的就是访问nginx,但是nginx把请求交给tomcat来做。
相关配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:8111;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
监听80端口来得请求,将所有请求转发到8111端口
location / 表示处理所有请求
proxy_pass http://127.0.0.1:8111; 表示把请求都交给http://127.0.0.1:8111来处理
动静分离
动静分离概念
所谓的动静分离就是指图片,css, js之类的都交给nginx来处理,nginx处理不了的,比如jsp 就交给tomcat来处理~
好处是nginx处理静态内容的吞吐量很高,比tomcat高多了,这样无形中提升了性能。
下面提供两套配置文件,第一套是只代理css,js,html,第二套是代理全部的静态资源,Root为所在的路径,根据自己的实际情况编写
相关配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfileon;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:8111;
}
location ~\.(css|js|png)$ {
root C:/Users/X7TI/Downloads/tomcat_8111/webapps/ROOT;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfileon;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
负载均衡
负载均衡的概念
负载均衡的概念就是当访问量很大的时候,一个 Tomcat 吃不消了,这时候就准备多个 Tomcat,由Nginx按照权重来对请求进行分配,从而缓解单独一个Tomcat受到的压力
相关配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfileon;
keepalive_timeout 65;
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;
location / {
proxy_pass http://tomcat_8111_8222;
}
location ~\.(css|js|png)$ {
root C:/Users/X7TI/Downloads/tomcat_8111/webapps/ROOT;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
weight表示权重,值越大,被分配到的几率越大
nginx-Session共享
负载均衡Session问题
通过负载均衡,我们可以把请求分发到不同的 Tomcat 来缓解服务器的压力,但是这里存在一个问题: 当同一个用户第一次访问tomcat_8111 并且登录成功, 而第二次访问却被分配到了tomcat_8222, 这里并没有记录他的登陆状态,那么就会呈现未登录状态了,严重伤害了用户体验。
解决办法一: ip_hash
通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat.
这样就不会出现负载均衡 session问题了. 处理手段也很简单,如图所示在upstream最后加上ip_hash;就行了。
不过这种方案并不完美,当如下几种情况发生时就有问题:
-
大量请求来之某个局域网,那么相当于就没有负载均衡了
-
如果tomcat_8111 挂了,那么此时nginx只能把请求交给tomcat_8222,但是这里却没有记录session,用户体验依然受影响。
upstream tomcat_8111_8222{ server 127.0.0.1:8111 backup; server 127.0.0.1:8222 weight=2; ip_hash; }
解决办法二: redis+tomcat-sessoin-manager
既然第一种解决办法有问题,那么就采用第二种解决办法:用Redis来存取session.
Redis是什么呢?说简单点就是个独立的Hashmap,用来存放键值对的。
这样当tomcat1需要保存session值的时候,就可以把它放在Redis上,需要取的时候,也从Redis上取。
那么考虑这个情景:
- 用户提交账号密码的行为被分配在了tomcat8111上,登陆信息被存放在redis里。
- 当用户第二次访问的时候,被分配到了tomcat8222上
- 那么此时tomcat8222就会从redis去获取相关信息,一看有对应信息,那么就会呈现登陆状态。
这样就规避了解决办法一: ip_hash里会出现的两种问题了。
具体操作
接下来进行具体操作,分几个步骤
- 启动redis
- 给两个tomcat使用jar包
- 配置两个tomcat
- 重启两个tomcat
- 测试
修改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都要改