Tomcat
是什么?
是web应用服务器
是java语言开发的(jvm“java虚拟机”)
作用:
1) 可以作为 web 应用服务器,处理静态 web 页面,如 html 页面,但性能一般 2)还可以作为 Servlet/JSP 容器,处理 java 语言开发的 jsp 动态页面应用程序,这也是 tomcat 主要的应用场景
tomcat由一系列的组件构成,核心组件有三个:
-
web容器:完成web服务器的功能
-
servlet容器:名字为Catalina,用于处理servlet代码
-
jsp容器:用于将jsp动态网页翻译成servlet代码
servlet:处理servlet代码、连接数据库
Servlet 是Java Servlet 的简称,可以理解为是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性, 简单的理解:servlet 就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建。
jsp:在HTML网页中插入java代码、实现动态页面
JSP 全称 Java Server Pages,是一种动态网页开发技术。它使用 JSP 标签在HTML网页中插入 Java 代码。标签通常以“<%”开头,以“%>”结束。JSP 是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
tomcat组件(两个)
-
connector(连接器)——暴露监听端口、接收客户端请求、返回响应消息给客户端
-
container(容器)——处理请求
container包含4个子容器
-
engine:引擎,用来管理多个虚拟主机,一个container最多只能有一个engine
-
host:代表一个虚拟主机
-
context:管理web应用的路径
-
wrapper:servlet封装器,负责处理业务逻辑(容器的最底层),负责对象实例的创建、执行和销毁功能
四容器属于父子关系,一个引擎管理多个主机,每个虚拟主机可用管理多个web应用,每个应用会有多个servlet封装器。
客户端请求过程:
客户端浏览器——>connector暴露的8080端口
——>container(engine)根据域名发送给对应的虚拟主机
——>host根据用户访问的URL路径
——>context根据URL路径找到对应的web应用
——>wrapper根据应用程序处理业务逻辑
Tomcat服务部署
1.关闭防火墙
将安装 Tomcat 所需软件包传到/opt目录下 jdk-8u201-linux-x64.rpm apache-tomcat-9.0.16.tar.gz
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.安装jdk
#/opt/下放进tar包
[root@31yml opt]#tar xf jdk-8u91-linux-x64.tar.gz
#/opt/下方rpm包
[root@31yml opt]#rpm -ivh jdk-8u91-linux-x64.rpm
3.配置JDK环境变量(最左原则)
[root@31yml opt]#vim /etc/profile.d/java.sh
export JAVA_HOME=/opt/jdk1.8.0_91
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
#路径申明从左往右,旧路径还在,故新路径提前“:”是分隔符
申明变量
source /etc/profile.d/java.sh
JDK :java development kit (java开发工具)
JRE :java runtime environment (java运行时环境)
JVM :java virtuak machine (java虚拟机),使java程序可以在多种平台上运行class文件。
CLASSPATH:告诉jvm要使用或执行的class放在什么路径上,便于JVM加载class文件。
tools.jar:是系统用来编译一个类的时候用到的,即执行javac的时候用到。
dt.jar:dt.jar是关于运行环境的类库,主要是swing包。
测试,编写Java代码
vim Hello.java
public class Hello {
public static void main(String[] args){
System.out.println("Hello World?!");
}
}
Java文件要编译成字节码文件jvm才能读取
javac 文件.java
[root@31yml opt]#java Hello
安装Tomcat
#解压tomcat的tar包
[root@31yml opt]#tar xf apache-tomcat-9.0.16.tar.gz
[root@31yml opt]#mv apache-tomcat-9.0.16 /usr/local/tomcat
[root@31yml opt]#cd /usr/local/tomcat/
[root@31yml opt]#cd bin/
[root@31yml opt]#./startup.sh#运行启动脚本,打开tomcat
访问192.168.177.100:8080
4.安装启动Tomcat
启动tomcat(两种)
后台启动:
/usr/local/tomcat/bin/startup.sh#启动该脚本
/usr/local/tomcat/bin/catalina.sh start#启动
前台启动:
/usr/local/tomcat/bin/catalina.sh run#状态栏输出到当前终端
关闭服务:
/usr/local/tomcat/bin/shutdown.sh
systemd管理
启用systemd服务,编辑”.service“文件
vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=tomcat server
Wants=network-online.target
After=network.target
#路径、文件名修改成自己的
[Service]
Type=forking
Environment="JAVA_HOME=/opt/jdk1.8.0_91"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
验证:可正常启动、关闭
supervisor管理
supervisor是Python开发的c/s服务,是Linux系统下的进程管理工具。
可以监听、启动、停止、重启一个或多个进程
用supervisor管理的进程,当一个进程意外被杀死,supervisor监听到进程死后,会自动将它重启,很方便的做到进程的自动恢复的功能,不在需要自己写脚本来控制
yum install -y epel-release
yum install -y supervisor
使用yum安装的supervisor会在/etc/会生成一个supervisor.conf文件及一个supervisor.d文件目录
supervisor.conf里内容如下
[unix_http_server]
file=/var/run/supervisor.sock ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700 ;socket文件的mode,默认是0700
chmod=0766
;chown=nobody:nogroup ;socket文件的owner,格式:uid:gid
;[inet_http_server] ;HTTP服务器,提供web管理界面
;port=0.0.0.0:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=user ;登录管理后台的用户名
;password=123 ;登录管理后台的密码
[supervisord]
logfile=/var/log/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info ;日志级别,默认info,其它: debug,warn,trace
pidfile=/var/run/supervisord.pid ;pid 文件
nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024 ;可以打开的文件描述符的最小值,默认 1024
minprocs=200 ;可以打开的进程数的最小值,默认 200
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ;通过HTTP的方式连接supervisord
; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:tomcat]
command=/usr/local/tomcat/bin/catalina.sh run ;程序启动命令
autostart=true ;在supervisord启动的时候也自动启动
startsecs=10 ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ;程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ;启动失败自动重试次数,默认是3
user=tomcat ;用哪个用户启动进程,默认是root
priority=999 ;进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ;把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=200MB ;stdout 日志文件大小,默认50MB
stdout_logfile_backups=20 ;stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/var/log/supervisor/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
;包含其它配置文件
[include]
files = /etc/supervisord.d/*.ini ;可以指定一个或多个以.ini结束的配置文件
files = /etc/supervisord.d/*.conf ;也可以写成以.conf结尾的配置文件
进程管理配置参数,应该每个进程写一个配置文件放在include指定的目录下包含进supervisord.conf文件中。 supervisor.d目录用来存放用户自定义的进程配置:
vim /etc/supervisord.d/nginx.conf
[program:nginx]
command=/usr/local/nginx/sbin/nginx -g 'daemon off;'
stdout_logfile=/var/log/supervisor/logs/run.log
stderr_logfile=/var/log/supervisor/logs/error.log
autostart=true
startsecs=10
autorestart=true
startretries=1
user=nginx
priority=998
stdout_logfile_maxbytes=200MB
stdout_logfile_backups=20
stopasgroup=true
killasgroup=true
redirect_stderr=true
注:supervisor不能监控后台进程,command不能为后台运行命令
supervisor服务启动
#前面说的要自己创建目录
mkdir -p /var/log/supervisor/logs
#为了让配置生效需要创建tomcat用户
useradd -M -s /sbin/nolgin tomcat
systemctl start supervisord
systemctl enable supervisord
#另一种启动方式,择其一
supervisord -c /etc/supervisord.conf
supervisor常用命令 supervisorctl是supervisord的命令行工具
-
supervisorctl status 查看所有进程的状态
-
supervisorctl stop <name> 停止进程
-
supervisorctl start <name> 启动进程
-
supervisorctl restart <name> 重启进程
-
supervisorctl update 配置文件修改后可以使用该命令加载新的配置
-
supervisorctl reload 重新启动配置中的所有程序
supervisorctl status nginx #nginx状态
supervisorctl stop nginx #停止nginx
supervisorctl start nginx #启动nginx
supervisorctl restart nginx #重启nginx
supervisorctl reload nginx #重载nginx
问题
5.优化tomcat启动速度
第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改。
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
--117行--修改
securerandom.source=file:/dev/urandom
-
tomcat 启动慢的原因是随机数产生遭到阻塞,遭到阻塞的原因是 熵池大小 。
-
/dev/random:阻塞型,读取它就会产生随机数据,但该数据取决于熵池噪声,当熵池空了,对/dev/random 的读操作也将会被阻塞。
-
/dev/urandom:非阻塞的随机数产生器,它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
-
Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。
主要目录说明
-
bin:存放启动和关闭 Tomcat 的脚本文件,如 catalina.sh、startup.sh、shutdown.sh
-
conf:存放 Tomcat 服务器的各种配置文件,如主配置文件 server.xml 和 应用默认的部署描述文件 web.xml
-
lib: 存放 Tomcat 运行需要的库文件的 jar 包,一般不作任何改动
-
logs: 存放 Tomcat 执行时的日志
-
temp:存放 Tomcat 运行时产生的文件
-
webapps: 存放 Tomcat 默认的 web 应用项目资源的目录
-
work: Tomcat 的工作目录,存放 jsp 编译后产生的 class 文件
tomcat虚拟主机配置
很多时候公司会有多个项目需要运行,一般不会是在一台服务器上运行多个 Tomcat 服务,这样会消耗太多的系统资源。此时, 就需要使用到 Tomcat 虚拟主机.
例如现在新增两个域名 www.kgc.com 和 www.benet.com,希望通过这两个域名访问到不同的项目内容。
1.创建 yml 和 benet 项目目录和文件
mkdir /usr/local/tomcat/webapps/yml
mkdir /usr/local/tomcat/webapps/benet
echo "This is yml page !" > /usr/local/tomcat/webapps/yml/index.jsp
echo "This is benet page\!" > /usr/local/tomcat/webapps/benet/index.jsp
2.修改 Tomcat 主配置文件 server.xml
在engine下配置新的host
vim /usr/local/tomcat/conf/server.xml
--165行前--插入
<Host name="www.yml.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/yml" path="" reloadable="true" />
</Host>
<Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />
</Host>
#name="wwv.kgc.com" 主机名、域名
#appBase = "webapps" 网页工作目录
#unpackWARs="true" war包是否自动展开
#autoDeploy="true" 是否自动部署
#xmlValidation="false" 是否验证xml文件的有效性
#xmlNamespaceAware="false" 是否验证xml文件的有效性
#docBase="/usr/local/tomcat/webapps/yml" 定义网页路径
#path="" 指定根路径,为空,则使用网页路径为根路径,相当于root;如果有参数,则将目标参数替换为docBase设置的网页路径,相当于alias
#reloadable="true" 是否自动重载
3.客户端浏览器访问验证
这里是纯文本没有使用html语言,所有转义符没有作用
8080端口:负责http请求
8443端口:负责https请求,重定向
8005端口:负责关闭tomcat服务,/usr/local/tomcat/bin/shutdown.sh
8009端口:tomcat与apache连接使用的(apache软件名,httpd服务)
tomcat 多实例部署
1.安装 jdk
2.安装 tomcat
[root@yml-2 ~]#cd /opt/
[root@yml-2 opt]#tar xf jdk-8u91-linux-x64.tar.gz
[root@yml-2 opt]#mv jdk1.8.0_91/ /usr/local/
[root@yml-2 opt]#ls !$
ls /usr/local/
bin etc games include jdk1.8.0_91 lib lib64 libexec sbin share src
[root@yml-2 opt]#vim /etc/profile
[root@yml-2 opt]#cd /etc/profile.d/
[root@yml-2 profile.d]#vim java.sh
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source java.sh#进行刷新
tar xf apache-tomcat-9.0.16.tar.gz
[root@yml-2 opt]#cp -a apache-tomcat-9.0.16 /usr/local/tomcat1
[root@yml-2 opt]#cp -a apache-tomcat-9.0.16 /usr/local/tomcat2
3.修改xml文件
修改 tomcat1、2 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号
cd /usr/local/tomcat2/conf
[root@yml-2 conf]#vim server.xml
#所有端口更改,防止tomcat1与tomcat2端口互相占用
4.添加环境变量
修改各 tomcat1、2 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
cd /usr/local/tomcat1/bin
vim startup.sh#加入下方环境变量
export CATALINA_HOME=/usr/local/tomcat1
export CATALINA_BASE=/usr/local/tomcat1
export TOMCAT_HOME=/usr/local/tomcat1
vim shutdown.sh#加入下方环境变量
#tomcat1
export CATALINA_HOME=/usr/local/tomcat1
export CATALINA_BASE=/usr/local/tomcat1
export TOMCAT_HOME=/usr/local/tomcat1
cd /usr/local/tomcat2/bin
vim startup.sh#加入下方环境变量
export CATALINA_HOME=/usr/local/tomcat2
export CATALINA_BASE=/usr/local/tomcat2
export TOMCAT_HOME=/usr/local/tomcat2
vim shutdown.sh#加入下方变量
#tomcat2
export CATALINA_HOME=/usr/local/tomcat2
export CATALINA_BASE=/usr/local/tomcat2
export TOMCAT_HOME=/usr/local/tomcat2
5.启动
启动各 tomcat 中的 /bin/startup.sh
6.验证:
网页访问两种端口
成功。
建立多实例的原因:tomcat单进程多线程,资源利用率低,对实例搭建可提高资源利用率
Nginx+Tomcat负载均衡、动静分离
Nginx 服务器:192.168.177.103:80 Tomcat服务器1:192.168.177.100:8080 Tomcat服务器2:192.168.177.102:8080 192.168.177.102:8081
###
###
配置Tomcat 应用服务器
配置三份动态页面.jsp
(1)Tomcat1 server 配置(192.168.177.100:8080)
mkdir /usr/local/tomcat/webapps/yml
vim /usr/local/tomcat/webapps/yml/test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP who is yml page</title>
</head>
<body>
<% out.println("动态页面 1,Blue Archive is our presents!");%>
</body>
</html>
#地址:192.168.177.100:8080/yml/test.jsp
(2)Tomcat1 server 配置(192.168.177.102:8080)
[root@yml-2 opt]#cd /usr/local/tomcat1/webapps/
[root@yml-2 webapps]#ls
docs examples host-manager manager ROOT
[root@yml-2 webapps]#mkdir yml
[root@yml-2 webapps]#cd yml/
[root@yml-2 yml]#vim test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP who is yml page</title>
</head>
<body>
<% out.println("动态页面 2,i will play with you all day!");%>
</body>
</html>
#地址:192.168.177.102:8080/yml/test.jsp
Tomcat2 server 配置(192.168.177.102:8081)
[root@yml-2 opt]#cd /usr/local/tomcat2/webapps/
[root@yml-2 webapps]#ls
docs examples host-manager manager ROOT
[root@yml-2 webapps]#mkdir yml
[root@yml-2 webapps]#cd yml/
[root@yml-2 yml]#vim test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP who is yml page</title>
</head>
<body>
<% out.println("动态页面 3,who can give me time!");%>
</body>
</html>
#地址:192.168.177.102:8081/yml/test.jsp
测试:直接访问——成功看到
Nginx server 配置
yum安装nginx(192.168.177.103)
[root@localhost opt]#cd /etc/yum.repos.d/
[root@localhost yum.repos.d]#mkdir repo.bak
[root@localhost yum.repos.d]#mv *.repo repo.bak
[root@localhost yum.repos.d]#ls
repo.bak
[root@localhost yum.repos.d]#vim nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[root@localhost yum.repos.d]#yum install -y nginx
[root@localhost yum.repos.d]#vim /etc/nginx/nginx.conf
#发现剩余的配置在*.conf文件里
31 include /etc/nginx/conf.d/*.conf;
[root@localhost yum.repos.d]#vim /etc/nginx/conf.d/default.conf
#发现location 里的配置
7 location / {
8 root /usr/share/nginx/html;
9 index index.html index.htm;
10 }
#/usr/share/nginx/html就是安装的根路径
在根路径下配置静态页面
cd /usr/share/nginx/html
mkdir yml/
echo '<h1>this is nginx static web page!</h1>' > ./yml/test.html
#路径:192.168.177.103/yml/test.html
(3)Nginx server 配置
vim /usr/local/nginx/conf/nginx.conf
http{
......
upstream backend{
server 192.168.177.100:8080 weight=1;
server 192.168.177.102:8081 weight=1;
server 192.168.177.102:8080 weight=1;
#ip_hash;此设置会固定访问网页,默认使用轮询
}
}
server {
location ~* .*\.jsp$ {
proxy_pass http://backend;
#添加配置项
#设置后端的Web服务器可以获取远程客户端的真实IP
##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。
proxy_set_header HOST $host;
##把$remote_addr赋值给X-Real-IP,来获取源IP
proxy_set_header X-Real-IP $remote_addr;
##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
/被遍历替换,最后“yml/test.jsp”因为配置,看起来没变,实际上是三份网页的设置
再来一台4层反向代理负责负载均衡,(192.168.177.104)
一台7层反向代理负责动静分离,(192.168.177.105)
192.168.177.103(第一台负责动静分离的机器上)
[root@localhost html]#cd /etc/yum.repos.d/
[root@localhost yum.repos.d]#scp nginx.repo 192.168.177.104:`pwd`
[root@localhost yum.repos.d]#cd /etc/nginx/
[root@localhost nginx]#scp -r conf.d/ nginx.conf 192.168.177.104:`pwd`
[root@localhost nginx]#cd /usr/share/nginx/html/
[root@localhost html]#scp -r yml/ 192.168.177.104:`pwd`
192.168.177.104(第二台负责动静分离的机器上)
[root@localhost yml]# vim /usr/share/nginx/html/yml/test.html
<h1>this is nginx static web page on the second file!</h1>
#与一号动静分离机器区分开
部署Nginx 负载均衡器
(192.168.177.105)
systemctl stop firewalld
setenforce 0
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \ #启用文件修改支持
--with-http_stub_status_module \ #启用状态统计
--with-http_gzip_static_module \ #启用 gzip静态压缩
--with-http_flv_module \ #启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module \ #启用 SSL模块,提供SSL加密功能
--with-stream #负责反向代理需要stream模块
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module \
--with-http_ssl_module
--with-stream
make && make install
#方便使用systemd服务
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
安装好之后
提醒:192.168.177.105,只做负载均衡器,
vim /usr/lcoal/nginx/conf/nginx.conf
stream{
upstream nginx_server{
server 192.168.177.104:80;
server 192.168.177.103:80;
}
server {
listen 80;#不要引起冲突,直接把别处的8端口号改掉
proxy_pass nginx_server;
}
}
cd /usr/lcoal/nginx/sbin/
./nginx -t
/usr/local/nginx/sbin/nginx#启动
vim /usr/lcoal/nginx/conf/nginx.conf
#keepalive_timeout num;
keepalive_timeout 0;
/usr/local/nginx/sbin/nginx -s reload
分离一、二机也关闭长连接
vim /etc/nginx/nginx.conf
#keepalive_timeout num;
keepalive_timeout 0;
#别忘了重启
/usr/local/nginx/sbin/nginx -s reload
验证
轮询发现都能访问,恭喜你,我的朋友
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了