Nginx
Nginx 和 Tengine的区别
Tenginx 的 安装
Nginx 负载均衡配置
注意 如果需要增加check_status,编写安装Tengine时需要把check_module编译进来才行
./configure --with-http_upstream_check_module
- 给 101,102,103 分别安装Tomcat服务并启动.
- 修改./webapps/ROOT/index.jsp
<!-- body 中添加H1标签区分机器 -->
<body>
<h1>Node(x)<h1>
<body>
- 启动Tomcat
./bin/catalina.sh run - 修改Nginx.conf。
vim /usr/local/tengine/conf/nginx.conf
upstream tomcats{
# ip_hash;
server 192.168.31.101:8080 weight=2;
server 192.168.31.102:8080 weight=2;
server 192.168.31.103:8080 weight=2;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcats;
}
location status{
check_status;
}
}
Nginx + Tomcat8 + Memcached实现负载均衡 + session共享
Memcached是一个免费并且开源的高性能内存键值数据库.它主要用于系统缓存,通过缓存数据库中的结果来提高应用的相应速度.
- memcache本身没有像 redis 所具备的数据持久化功能,比如 RDB 和 AOF 都没有,但是可以通过做集群同步的方式,让各 memcache 服务器的数据进行同步,从而实现数据的一致性,即保证各 memcache的数据是一样的,即使有任何一台 memcache 发生故障,只要集群种有一台 memcache 可用就不会出现数据丢失,当其他 memcache 重新加入到集群的时候可以自动从有数据的 memcache 当中自动获取数据并提供服务。
- Memcache借助了操作系统的 libevent 工具做高效的读写。 libevent 是个程序库,它将 Linux 的 epoll、BSD 类操作系统的 kqueue 等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。memcached使用这个 libevent 库,因此能在 Linux、BSD、Solaris 等操作系统上发挥其高性能 。
- Memcache 支持最大的内存存储对象为 1M 超过 1M 的 数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,memcache最适合保存用户的session实现 session共享Memcached 存储数据时 , Memcached 会去申请 1MB 的内存 , 把该块内存称为一个slab,也称为一个page。
当前我使用Ubuntu18.04 上安装和配置最新版本的Memcached. 需要给每个机器都安装Memcached,然后按照下面的方式配置好并启动.
# 更新Apt软件包
sudo apt update
# 安装Memcached
sudo apt install memcached libmemcached-tools
# 启动memcached
sudo systemctl start memcached
# 查看memcached的状态
sudo systemctl status memcached
- 修改
vim /etc/memcached.conf,实现可以远程访问.
-p 11211
-u memcache
# Start with a cap of 64 megs of memory. It's reasonable, and the daemon default
# Note that the daemon will grow to this size, but does not start out holding this much
# memory
-m 64
#最大连接数
# Limit the number of simultaneous incoming connections. The daemon default is 1024
# -c 1024
# Specify which IP address to listen on. The default is to listen on all IP addresses
# This parameter is one of the only security measures that memcached has, so make sure
# it's listening on a firewalled interface.
# 注释下面这样
#-l 127.0.0.1
- 启动成功
● memcached.service - memcached daemon
Loaded: loaded (/lib/systemd/system/memcached.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-08-04 14:39:42 UTC; 15h ago
Docs: man:memcached(1)
Main PID: 9551 (memcached)
Tasks: 10 (limit: 4629)
CGroup: /system.slice/memcached.service
└─9551 /usr/bin/memcached -m 64 -p 11211 -u memcache -P /var/run/memcached/memcached.pid
Aug 04 14:39:42 wangyp systemd[1]: Started memcached daemon.
- 查看memcached监听的端口,监听的是11211端口。
ss -nlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 127.0.0.1:6010 0.0.0.0:*
LISTEN 0 128 0.0.0.0:13306 0.0.0.0:*
LISTEN 0 128 127.0.0.1:6011 0.0.0.0:*
LISTEN 0 128 0.0.0.0:16379 0.0.0.0:*
LISTEN 0 128 0.0.0.0:11211 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 128 [::1]:6010 [::]:*
LISTEN 0 128 [::]:13306 [::]:*
LISTEN 0 128 [::1]:6011 [::]:*
LISTEN 0 128 [::]:16379 [::]:*
LISTEN 0 128 [::]:11211 [::]:*
配置Tomcat,
- 导入memcached 所需要的jar包到Tomcat的lib目录:
asm-5.2.jar
kryo-4.0.2.jar
kryo-serializers-0.45.jar
memcached-session-manager-2.3.2.jar
memcached-session-manager-tc8-2.3.2.jar
minlog-1.3.1.jar
msm-kryo-serializer-2.3.2.jar
objenesis-3.0.1.jar
reflectasm-1.11.9.jar
spymemcached-2.12.3.jar
- 配置
vim ./tomcat/conf/context.xml,在Context中添加Manager标签,并做如下配置. 主要修改memcachedNodes
<Context>
<!--
n1:192.168.31.101:11211
n2:192.168.31.102:11211
n3:192.168.31.103:11211
主要修改memcachedNodes="n1:192.168.31.101:11211,n2:192.168.31.102:11211,n3:192.168.31.103:11211"
-->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.31.101:11211,n2:192.168.31.102:11211,n3:192.168.31.103:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
- 在index.jsp显示当前服务器的ip+port,并且显示出现当时的session会话的Id;
vim ./tomcat/webapps/ROOT/index.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*" %>
<body>
<h1> tomcat node1 </h1>
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
- 查看服务器的状态
# Nginx http upstream check status
## Check upstream server number: 3, generation: 2
| Index | Upstream | Name | Status | Rise counts | Fall counts | Check type | Check port |
| ----- | -------- | ------------------- | ------ | ----------- | ----------- | ---------- | ---------- |
| 0 | tomcats | 192.168.31.101:8080 | up | 70 | 0 | http | 0 |
| 1 | tomcats | 192.168.31.102:8080 | up | 22 | 0 | http | 0 |
| 2 | tomcats | 192.168.31.103:8080 | up | 57 | 0 | http | 0
- 访问nginx服务这时候就可以看到,3个服务器每次访问SessionId都没变.大功告成
# tomcat node2
On tomcats
192.168.31.102:8080
SessionID = 9071C8EE6A373762E4F2F8AF50336625-n2
Thu Aug 05 06:50:57 UTC 2021
# tomcat node1
On tomcats
192.168.31.102:8080
SessionID = 9071C8EE6A373762E4F2F8AF50336625-n2
Thu Aug 05 06:49:59 UTC 2021
# tomcat node3
On tomcats
192.168.31.103:8080
SessionID = 9071C8EE6A373762E4F2F8AF50336625-n2
Thu Aug 05 06:49:21 UTC 2021