Linux运维-Web服务器的配置与管理(Apache+tomcat)(没成功,最后有失败经验)
Web服务器的配置与管理(Apache+tomcat)
项目场景
公司业务经过长期发展,有了很大突破,已经实现盈利,现公司要求加强技术架构应用功能和安全性以及开始向企业应用、移动APP等领域延伸,此时原来开发web服务的php语言已经不适应新的场景,需要上java技术架构,现要求你根据公司需要,实现基于java平台的web应用服务选型、搭建、实现和应用。
基础知识
1. java和jdk概念
Java是一种面向对象的语言,它的层次比C更高一点,层次指的是离硬件更远一点。它将写好的程序文件(.java)通过java编译器javac编译成字节码类型的class文件(.class),在编译过程中涉及词法分析、语法分析、语义分析、字节码生成等过程,最终生成字节码的class文件。class文件是Java的类文件,是编译成功后的字节码文件,字节码由Java虚拟机JVM解释执行,它将每一条字节码送给解释器,再翻译成机器语言,从而在特定的机器上运行。Java通过JVM的方式实现了一次编译到处运行的功能。
源码XXX.java–>javac编译器–>字节码XXX.class–>JVM–>机器语言(依赖于不同平台)–>执行
JRE(Java Runtime Environment)是包含了JVM和其他一些简单功能的JAVA运行环境,它适用于只运行java程序时。JDK(Java Development Kit)比JRE包含了更多东西,它除了能作为JAVA运行环境,还提供了很多用于开发的工具,所以它适用于开发程序时使用。
JAVA SE是java开发标准版,里面有JDK,Java EE是企业版,本质上ee只是比se多提供了几个类库而已。
jsp、servlet
在web应用程序上,早期Java的实现方式是服务器端放置应用程序,客户端访问时将其下载到客户端本地并执行,这样不仅不安全,而且要求客户有java运行环境,这种实现方式是applet。与applet相对的是servlet,但它是服务端程序。后来,java将应用程序放在服务器端,客户端请求此应用程序时,服务端通过servlet类库分析http协议,将请求的应用程序在服务端执行,然后将结果组织起来返回给客户端,但此时servlet能分析的http协议非常简单,且和html的组织方式非常不友好,它要求java程序员首先得懂html开发(实际上现在还是如此,java程序员至少要懂简单的html/css/javascript等前端技术),于是后来出现了JSP类库。
JSP可以简单的将java代码嵌入在html文档中,它们能够很友好地结合,结合后的文档类型为.jsp文件。当客户端请求应用程序资源时,JSP类库负责解析.jsp文件中的jsp部分并通过jasper组件将其翻译成servlet的java源代码,然后再编译成class文件并交给JVM来执行。实际上,jsp的本就就是servlet,jsp类只不过是继承于servlet类并添加了一些和html友好结合的特性,最终它还是要翻译成servlet代码。
JSP的本质还是Servlet,每个JSP页面就是一个Servlet对象(当然也可能引用了其他servlet对象),Servlet再负责响应用户的动态请求数据(其实也包括静态数据,因为jasper翻译jsp代码时,静态标签也被翻译到servlet的java源文件中以待输出)。对于Tomcat而言,JSP页面生成的Servlet放在work路径对应的Web应用下。
tomcat和httpd、nginx等http服务程序的对比:
(1) 一个java程序只有一个进程,但是可以有多个线程,也就是说java程序的开发是基于线程的。那唯一的进程就是JVM进程,每个应用程序都开启一个JVM进程,根据开发时设计的多线程代码,在这个JVM进程中会启动多个线程。它不像httpd或nginx,能开启多进程(对于tomcat而言,这意味着多个不同的应用程序甚至意味着开启多个tomcat实例)。
(2) tomcat可以处理动态请求,也可以处理静态资源请求。但无论是动态资源,还是静态资源的请求,都是经过servlet处理并响应给客户端的,只不过请求静态资源时使用的是默认的servlet。虽然它能像httpd和nginx一样处理静态资源,但显然,它既要处理动态请求,又要处理静态请求,压力会很大。因此tomcat前一般使用httpd或nginx专门处理静态请求,而动态请求则通过反向代理的方式代理至tomcat。
web服务器、web容器、应用程序服务器
web服务器用于提供web服务,要求能解析http协议,通常认为提供静态内容的服务器是web服务器。如apache httpd、nginx等。
对于java而言,web容器是能提供servlet容器的服务器,它们是等价的概念。常见的有tomcat、weblogic、websphere、jboss。其中tomcat只提供servlet容器,它们在功能上是等价的。除tomcat外,后面3种web容器还提供除servlet容器外的EJB容器,专用于大型分布式程序开发。
应用程序服务器是用于提供应用服务的服务器。这是业务逻辑上的概念划分。更具体一点的说,它提供WEB容器(servlet容器)、EJB容器以及其他功能。
它们之间的关系和功能大致如下:web服务器提供web服务,主要处理http请求并响应给客户端,并可以将动态请求委托给其他程序,如cgi脚本、jsp脚本、asp脚本等进行处理;web容器即servlet容器主要负责处理基于http请求的动态jsp内容;EJB容器主要提供和后端数据库服务、其他服务进行交互的功能;应用服务器通常来说包括servlet容器或EJB容器,它们都运行于支持Java的应用服务器中,因此tomcat/weblogic/websphere/jboss都算是应用服务器。
tomcat体系结构
tomcat是jdk+servlet(严格地说是+jsp)实现的精简版的java ee,由于它只在jdk的基础上附加了jsp和servlet类库,所以它的应用范围主要是web应用。tomcat项目目前由apache软件基金会维护。
它是一种应用程序服务器,只提供servlet容器,同时还提供apache解析静态HTML,只不过它的处理能力不如独立的apache服务器。类似的应用程序服务还有websphere/weblogic/jetty/resin/jboss等,它们都是在jdk基础上附加各种类库实现不同程度的java ee(tomcat=jdk+servlet)。
apache和tomcat区别
-
Apache:
Apache HTTP服务器是一个模块化的服务器,可以运行在几乎所有广泛使用的计算机平台上。其属于应用服务器。Apache支持支持模块多,性能稳定,Apache本身是静态解析,适合静态HTML、图片等,但可以通过扩展脚本、模块等支持动态页面等。(Apche可以支持PHPcgiperl,但是要使用Java的话,你需要Tomcat在Apache后台支撑,将Java请求由Apache转发给Tomcat处理。) -
缺点:配置相对复杂,自身不支持动态页面。
-
Tomcat:
Tomcat是应用(Java)服务器,它只是一个Servlet(JSP也翻译成Servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行。
Apache与Tomcat的比较 -
相同点:
两者都是Apache组织开发的、都有HTTP服务的功能、两者都是免费的。 -
不同点:
- Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等),而Tomcat是Apache组织在符合Java EE的JSP、Servlet标准下开发的一个JSP服务器。
- Apache是一个Web服务器环境程序,启用他可以作为Web服务器使用,不过只支持静态网页如(ASP,PHP,CGI,JSP)等动态网页的就不行。如果要在Apache环境下运行JSP的话就需要一个解释器来执行JSP网页,而这个JSP解释器就是Tomcat。
- Apache:侧重于HTTPServer ,Tomcat:侧重于Servlet引擎,如果以Standalone方式运行,功能上与Apache等效,支持JSP,但对静态网页不太理想;
- Apache是Web服务器,Tomcat是应用(Java)服务器,它只是一个Servlet(JSP也翻译成Servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行。
- 实际使用中Apache与Tomcat常常是整合使用:
- 如果客户端请求的是静态页面,则只需要Apache服务器响应请求。
- 如果客户端请求动态页面,则是Tomcat服务器响应请求。
- 因为JSP是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销。
配置实施
源码安装
1、源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install)。
configure、Makefile.in 一般是项目管理器自动生成的,这依赖于两个开发工具:
autoconf:生成configure脚本文件;
autoconf 需要结合一个配置文件来和其它命令生成configure脚本;这个配置文件告诉autoconf当前代码有哪些特性、指定哪些安装路径等,而后才能生成configure脚本;
automake:生成Makefile.in模板文件;
automake 也要结合一个文件,这个指明有多少程序文件、它们的依赖关系是什么、以及使用哪一种版本的编译器等,而后才能生成Makefile.in;
注意:在安装之前查看INSTALL和README文件查看安装方法,因为不同程序包安装步骤不一样,有的程序包不需要configure,直接make后执行make install;而有的程序包不需要执行make install,只有一个二进制文件直接复制即可完成.
(1) ./configure(也可能是config文件)
–help:获取支持使用的选项;
在执行make命令之前,用户指定程序包的编译参数、启用特性、安装路径等等;
configure脚本会收集当前系统上的开发环境中所依赖各组件的版本、特性等,并检查所依赖的环境是否能满足,如果检查到所依赖的程序包不存在立即报错,无法执行下一步。最后会根据用户指定信息和Makefile.in文件生成一个makefile文件;
通用的几个选项:
–prefix= :指定安装的路径
–sysconfdir= :指定配置文件目录
–enable-feature :启用某个特性
–disable-fecture :禁用特性
–with-function :启用某功能
–without-function :禁用某功能
(2) make
每个源代码都有专用的makefile,在make时依据这个配置文件,调用指定的预处理器做处理、调用指定的编译器做处理、编译文件的顺序等操作等;
(3) make install
其实是一些脚本,实现把构建出的应用程序,分别分配到用户指定的目录中;如创建出的二进制文件放到指定的二进制目录、库文件放到指定的库目录等等,使用install拷贝命令也能实现;
2. 安装后的配置
(1) 将二进制程序目录添加至PATH文件变量中,否则只能使用绝对路径才能运行程序
编辑文件/etc/profile.d/NAME.sh
export PATH=/PATH/TO/BIN:$PATH
(2) 导出库文件路径
编辑/etc/ld.so.conf.d/NAME.conf,添加新的库文件所在的目录至此文件中;
例如:/usr/local/apache2/lib
ldconfig -v:重新加载库文件路径,并查看;
ldconfig -p:查看已加载所有库文件路径;
(3) 导出头文件
/usr/include/目录下,创建软链接;
ln -s target_dir soft_link ##可以导出一个目录为所有文件链接,也可以为每一个头文件导出一个链接,然后把创建的链接输出到/usr/include/目录下,或者直接复制头文件至/usr/include/目录;
(4) 导出man手册
Centos7是在/etc/man_db.conf的40到50行之间,添加一个MANPATH参数;
MANPATH_MAP /usr/local/apache2/bin /usr/local/apache2/man
安装jdk
1、下载安装java所需要的环境和开发工具包
(1)Java 所需要的环境和开发工具包介绍
JRE: Java Runtime Environment
JDK:Java Development Kit JRE
JRE:java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。
JDK:java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。JRE根据不同操作系统(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本,最常用的是Oracle公司收购SUN公司的JRE版本。
(2)rpm -qa | grep java
:查看已安装版本信息,如果有,需要删除。
java –version
: 显示java程序的版本信息。(无此目录,表示未安装)
卸载:
# rpm删除会提示依赖的问题,如果强制删除,我怀疑会有一些bug故选择yum删除
[root@hmx ~]# yum list installed | grep java #查询系统内的相关jdkjava-1.8.0-openjdk.x86_64 1:1.8.0.402.b06-1.el7_9 @updates
java-1.8.0-openjdk-headless.x86_64 1:1.8.0.402.b06-1.el7_9 @updates
javapackages-tools.noarch 3.4.1-11.el7 @anaconda
python-javapackages.noarch 3.4.1-11.el7 @anaconda
tzdata-java.noarch 2024a-1.el7
#卸载所有openjdk相关文件输入
yum -y remove java-1.8.0-openjdk*
#卸载tzdata-java
yum -y remove tzdata-java.noarch
删除完之后只剩
(3)下载最新稳定JDK:(从自己的Windows操作系统中下载)
当前最新版本下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
历史版本下载地址: http://www.oracle.com/technetwork/java/javase/archive-139210.html
(4)下载完成后,将JDK压缩包 复制一份到/usr/local/src/作备份。
(5)java/jdk文件拷贝一份到/usr/java,并解压缩,完成后删除JDK压缩包。
[root@hmx ~]# mkdir /usr/java
[root@hmx ~]# cd /usr/java/
[root@hmx java]# ls
[root@hmx java]# cp jdk-8u202-linux-i586.tar.gz /usr/local/src/
[root@hmx java]# tar -vxf jdk-8u202-linux-i586.tar.gz
(6)配置JDK环境变量
编辑全局变量: vim /etc/profile
最后一行输入如下语句:
#java environment
export JAVA_HOME=/usr/java/jdk1.8.0_202
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
(7)让刚刚设置的环境变量生效并检查是否安装成功。
①让刚刚设置的环境变量生效:source /etc/profile
②检查是否配置成功:java -version
如果有这个报错,则执行如下操作
-bash: /usr/java/jdk1.8.0_202/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录
yum install glibc.i686
glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX通行的标准,可以想见其内容包罗万象。而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。在 GNU/Linux 系统中,其C函式库发展史点出了GNU/Linux 演进的几个重要里程碑,用 glibc 作为系统的C函式库,是GNU/Linux演进的一个重要里程碑。
安装tomcat
(1)首先去Apache官网下载安装包
地址:http://tomcat.apache.org/
(2)把刚下载的apache-tomcat-8.5.99.tar.gz包上传到:/usr/local/,然后解压,将apache-tomcat-8.5.99创建软连接为tomcat,然后移除压缩包。
tar -vxf apache-tomcat-8.5.99.tar.gz
ln -s apache-tomcat-8.5.99 tomcat
(3)启动tomcat:
进入到tomcat/tomcat/bin目录下,运行./startup.sh。
[root@hmx local]# cd tomcat/bin
[root@hmx bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_202
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@hmx bin]# firewall-cmd --add-port=8080/tcp --permanent
success
[root@hmx bin]# firewall-cmd --reload
success
(4)本地物理机用浏览器通过ip:8080访问查看 (比如:我的ip是192.168.88.130:8080)
安装apache
(1)查询是否安装了apache服务器httpd
[root@hmx bin]# rpm -qa|grep httpd
httpd-2.4.6-99.el7.centos.1.x86_64
httpd-tools-2.4.6-99.el7.centos.1.x86_64
httpd-manual-2.4.6-99.el7.centos.1.noarch
(2)卸载系统自动装的apache服务器httpd
[root@hmx bin]# httpd -k stop #停止httpd服务器
[root@hmx bin]# yum remove httpd #卸载httpd服务器
(3)下载httpd-2.4.43 apr-1.5.2.tar.gz apr-util-1.5.4 pcre-8.44(不要下载最新版本,编译会出错)
cd
mkdir tmp
cd tmp
wget https://archive.apache.org/dist/apr/apr-1.5.2.tar.gz --no-check-certificate
wget https://archive.apache.org/dist/apr/apr-util-1.5.4.tar.gz --no-check-certificate
wget https://udomain.dl.sourceforge.net/project/pcre/pcre/8.44/pcre-8.44.tar.gz --no-check-certificate
wget https://archive.apache.org/dist/httpd/httpd-2.4.43.tar.gz --no-check-certificate
这些wget地址并不是一成不变的,这是截止2023年都好用的,有时候下载不上,就自己上官网查,说不定重构了,很多博客都用的过期地址
(4)检查系统是否安装了GCC
[root@hmx bin]# gcc
bash: gcc: 未找到命令... #出现未找到命令提示,说明没有安装GCC
(5)安装GCC和gcc-c++
[root@hmx bin]# yum -y install gcc
[root@hmx bin]# yum -y install gcc-c++
注意:如果没有安装gcc-c++,那么在 执行./configure -prefix=/usr/local/pcre 时会报 configure: error: You need a C++ compiler for C++ support. 错误
(6)将下载的压缩文件拷贝到/usr/local目录下
[root@hmx tmp]# cp apr-1.5.2.tar.gz /usr/local
[root@hmx tmp]# cp apr-util-1.5.4.tar.gz /usr/local
[root@hmx tmp]# cp httpd-2.4.43.tar.gz /usr/local
[root@hmx tmp]# cp pcre-8.44.tar.gz /usr/local[root@hmx ~]# cd /usr/local/
(7)编译安装apr-1.5.2
#解压缩apr文件
[root@hmx apr-1.5.2]# tar -zxvf apr-1.5.2.tar.gz
#改变目录到apr-1.5.2
[root@hmx apr-1.5.2]# cd apr-1.5.2/
#指定apr的安装目录为/usr/local/apr 配置
[root@hmx apr-1.5.2]# ./configure -prefix=/usr/local/apr
#编译安装
[root@hmx apr-1.5.2]# make && make install
(8)编译安装 apr-uril-1.5.4
cd /usr/local
#解压缩apr-util文件
[root@hmx local]# tar -zxvf apr-util-1.5.4.tar.gz
#改变目录到apr-util-1.5.4/
[root@hmx local]# cd apr-util-1.5.4/
#指定apr-util的安装路径,指定apr-util所对应的apr
[root@hmx apr-util-1.5.4]# ./configure -prefix=/usr/local/apr-util -with-apr=/usr/local/apr
#编译安装
[root@hmx apr-util-1.5.4]# make && make install
9)编译安装pcre
卸载系统自带的pcre
[root@hmx local]# rpm -qa pcre
pcre-8.32-17.el7.x86_64
卸载已安装软件:
yum remove pcre-8.32-17.el7.x86_64
cd /usr/local
解压缩apr-util文件
[root@hmx local]# tar -zxvf pcre-8.44.tar.gz
改变目录到pcre-8.44/
[root@hmx local]# cd pcre-8.44/
指定prce的安装路径,指定apr-util所对应的apr
[root@hmx pcre-8.44]# ./configure -prefix=/usr/local/pcre
编译安装(make是编译 make install是安装)
[root@hmx pcre-8.44]# make && make install
(10)编译安装apache
编译和安装apache分为动态、静态两种方式。动态编译是指在以后的使用中随时调整配置文件就可以加载模块;静态则相反,在编译时就决定了相应的模块。
cd /usr/local
#解压缩httpd-2.4.43文件:
[root@hmx local]# tar -zxvf httpd-2.4.43.tar.gz
#改变目录到httpd-2.4.43/ :
[root@hmx local]# cd httpd-2.4.43/
#配置
[root@hmx httpd-2.4.43]# ./configure -prefix=/usr/local/apache2 -sysconfdir=/etc/httpd -enable-so -enable-rewrite -with-apr=/usr/local/apr -with-apr-util=/usr/local/apr-util -with-pcre=/usr/local/pcre
#编译安装:
[root@hmx httpd-2.4.43]#make && make install
注意:如果安装时提示如下错误,可按照下面方法解决
checking for pcre-config… false
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
解决办法:
[root@hmx httpd-2.4.43]# yum -y install pcre-devel
(11)编辑配置文件、启动、停止apache服务
#编辑httpd.conf文件
[root@hmxhttpd-2.4.43]#vim /etc/httpd/httpd.conf在#ServerName www.example.com:80 下增加下面的语句ServerName localhost:80
#使用脚本控制Apache,启动服务
[root@hmx ~]# /usr/local/apache2/bin/apachectl start
#使用脚本控制Apache,停止服务
[root@hmx ~]# /usr/local/apache2/bin/apachectl stop
服务启动后,在本地物理机的IE浏览器,输入http://虚拟机IP地址,浏览器内容显示出it works,成功。页面内容存在于/usr/local/apache2/htdocs/index.html文件中
(12)设置apache开机启动
# 将apachectl命令拷贝到/etc/init.d目录下,改名为httpd
# cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd
编辑/etc/init.d/httpd文件,在第1行#!/bin/sh的后面添加如下两行
# vim /etc/init.d/httpd
# chkconfig: 2345 70 30 //注意:前面的#号是要保留的
# description: Apache //注意:前面的#号是要保留的
所增加的三个数字,第1个表示在运行级别2345下启动Apache,第2、3个是关于启动和停止的优先级配置。
Apache服务尚未被添加到chkconfig列表中,需要使用–add参数将其添加进去
[root@hmx init.d]# chkconfig --add httpd
[root@hmx init.d]# chkconfig --list httpd
通过上面的设置,每次开机时apache服务都是自动启动的
[root@hmx httpd-2.4.43]# chkconfig --del httpd #关闭开机自启动
Apache和Tomcat整合
(1)下载 mod_jk-1.2.31-httpd-2.2.x.so
cd
cd tmpwget https://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.31/x86_64/mod_jk-1.2.31-httpd-2.2.x.so
(2)安装mod_jk模块
不建议直接下载现成的模块,下的时候注意版本,很多教程瞎写,给2.4.6的tomcat装一个2.2x版本的mod_jk(坑死我了,生气),理论上相同版本的mod_jk-1.2.31-httpd-2.2.x.so也能用,看好那个x前面的是.几,我是没找到,就直接编译了
编译mod_jk.so前,本机需要先安装apxs,因为它依赖于apxs,我使用命令是yum install httpd-devel,等/usr/sbin下有apxs就算安装好了。
安装gcc
yum install gcc -y
安装 autoconf
yum install autoconf -y
安装 libtool
yum install libtool -y
然后,将tomcat-connectors-1.2.42-src.tar.gz下载到/root目录并解压:
(直接官网下啊,就在历史版本里面,你要是嫌弃下的慢,就自己电脑下载好再上传,我就这样,别去找奇奇怪怪的,安装包有的都不全,解压不了)
wget https://archive.apache.org/dist/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.42-src.tar.gz
tar -xvzf tomcat-connectors-1.2.42-src.tar.gz
安装需要用到apxs,安装httpd-devel里面包含apxs
yum install httpd-devel
并进入到/root/tomcat-connectors-1.2.42-src/native目录执行。
cd /root/tomcat-connectors-1.2.42-src/native
然后执行下面语句设置apxs位置
./configure --with-apxs=/usr/bin/apxs
编译:
make
make install
mod_jk:[root@hmx bin]# find / -name mod_jk.so
find: ‘/proc/83210’: 没有那个文件或目录
find: ‘/proc/83220’: 没有那个文件或目录
/usr/lib64/httpd/modules/mod_jk.so # make install后出现
/usr/local/tmp/tomcat-connectors-1.2.42-src/native/apache-2.0/.libs/mod_jk.so # make后出现
/usr/local/tmp/tomcat-connectors-1.2.42-src/native/apache-2.0/mod_jk.so # make后出现
/usr/local/apache2/modules/mod_jk.so #正常没有,看我下一步操作
给这玩意复制过去
cp /usr/lib64/httpd/modules/mod_jk.so /usr/local/apache2/modules/
编辑apache配置文件: [root@hmx modules]# vim /etc/httpd/httpd.conf
增加下面内容: Include /etc/httpd/conf/mod_jk.conf
(3)在/etc/httpd/conf目录下新建 mod_jk.conf和workers.properties文件,内容如下图。
mod_jk.conf的内容是jk的配置文件,包括装载模块和日志信息以及指定解析的工作器和目录。
[root@hmx conf]# mkdir /etc/httpd/conf/
[root@hmx conf]# vim mod_jk.conf
mod_jk.conf这个内容很重要,网上写的很多复制之后用不了,我最后从官网弄过来一份https://tomcat.apache.org/connectors-doc/common_howto/quick.html可以自己看看
# Load mod_jk module
# Update this path to match your modules location
LoadModule jk_module modules/mod_jk.so
# Declare the module for <IfModule directive> (remove this line for Apache 2.x)
#AddModule mod_jk.c
# Where to find workers.properties
# Update this path to match your conf directory location (put workers.properties next to httpd.conf)
JkWorkersFile /etc/httpd/conf/workers.properties
# Where to put jk shared memory
# Update this path to match your local state directory or logs directory
JkShmFile /var/log/httpd/mod_jk.shm
# Where to put jk logs
# Update this path to match your logs directory location (put mod_jk.log next to access_log)
JkLogFile /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# Send everything for context /examples to worker named worker1 (ajp13)
JkMount /examples/* worker1
workers.properties这个也很重要
# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
还有这个也要改
vim /usr/local/tomcat/conf/server.xml
<Connector protocol="AJP/1.3"address="::1"port="8009"redirectPort="8443"maxParameterCount="1000"/>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">
注释了的给注释删了,最后记得查一遍防火墙8080和80端口开了没,不行先给防火墙整个关了,起码能证明配置正确,最后再看开那个端口,一般就是开个8009,我没开也能用。
测试
[root@hmx conf]# mkdir /usr/local/apache2/htdocs/apps/
vim showtime.jsp
写入以下内容:
<%@page language="java" import="java.util.*" %><h2>Now, the time&date is: <%out.println(new Date());%></h2>
正常应该显示时间,然后我失败了,mod_jk查了好久都整合不出来,有大佬会高我一声哈,tomcat和Apache单独使用时,tomcat的前端文件放在
/usr/local/tomcat/webapps/ROOT中,Apache放在/usr/local/apache2/htdocs/中。动静结合正常是应该放在 cd /usr/local/apache2/htdocs/中的.jsp页面显示时间,然后就我没成功,希望各位成功,有成功的告我一声。Apache和Tomcat是正常的。
相关文章:

Linux运维-Web服务器的配置与管理(Apache+tomcat)(没成功,最后有失败经验)
Web服务器的配置与管理(Apachetomcat) 项目场景 公司业务经过长期发展,有了很大突破,已经实现盈利,现公司要求加强技术架构应用功能和安全性以及开始向企业应用、移动APP等领域延伸,此时原来开发web服务的php语言已经不适应新的…...
探讨分布式数据库ID生成解决方案
在技术面试中,面试官通常通过挑战应聘者的分布式系统知识来评估其能力。今天,让我们模拟一场面试现场,深入了解关于分布式数据库ID生成的解决方案。 面试官:嘿,小伙子,分布式数据库ID生成解决方案了解吗&a…...
Clickhouse填坑记4:Too many parts问题分析
Clickhouse在进行大数据量同步时,感觉很爽,插入速度非常快,但是,在使用过程中却出现了几次“Too many parts”异常报错,搞得很痛苦,这里记录一下解决过程。 我这边采用的是Flink程序,实时将数据写入ClickHouse,在执行一段时间后,会提示“Too many parts”异常,如下异…...

CertiK CSO Dr. Kang Li 确认出席Hack .Summit() 香港区块链盛会
CertiK CSO Dr. Kang Li 确认将出席由 Hack VC 主办,并由 AltLayer 和 Berachain 联合主办,与 SNZ 和数码港合作,由 Techub News 承办的Hack.Summit() 2024区块链开发者盛会。 Dr. Kang Li 目前担任CertiK首席安全官。他是清华蓝莲花战队启蒙…...

C++ 游戏飞机大战, 字符型的
//#define _CRT_SECURE_NO_WARNINGS 1 用于禁止不安全函数的警告 #include<iostream> #include<stdlib.h> #include<string> #include<conio.h> #include<Windows.h> #include<time.h> #include <graphics.h> using namespace std;…...

用html编写的简易新闻页面
用html编写的简易新闻页面 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…...

docker-mysql:5.7安装
1、下载mysql:5.7镜像 [rootlocalhost ~]# docker search mysql (某个XXX镜像名字) [rootlocalhost ~]# docker pull mysql:5.7 按装之前查看一下是否按装过mysql。如果安装过会占用3306端口。 [rootlocalhost ~]# ps -ef | grep mysql 2、简单的安装 [rootlocalhost ~]# d…...

SQLPro Studio:数据库管理的革命性工具 mac版
SQLPro Studio是一款强大的数据库管理和开发工具,它旨在提供高效、便捷和安全的数据库操作体验。无论是数据库管理员、开发人员还是数据分析师,SQLPro Studio都能满足他们在数据库管理、查询、设计和维护方面的需求。 SQLPro Studio mac版软件获取 首先…...

【小沐学QT】QT学习之OpenGL开发笔记
文章目录 1、简介2、Qt QOpenGLWidget gl函数3、Qt QOpenGLWidget qt函数4、Qt QOpenGLWindow5、Qt glut6、Qt glfw结语 1、简介 Qt提供了与OpenGL实现集成的支持,使开发人员有机会在更传统的用户界面的同时显示硬件加速的3D图形。 Qt有两种主要的UI开发方…...

kali安装ARL灯塔(docker)
1、root身份进入容器 ┌──(root㉿Kali)-[~/桌面] └─# su root ┌──(root㉿Kali)-[~/桌面] └─# docker 2、先更新再克隆 ┌──(root㉿Kali)-[~/桌面] └─# apt-get update …...
字节面试分享,请详细介绍为何Http Post发送两次请求
在浏览器中,内容是很开放的,任何资源都可以接入其中,如 JavaScript 文件、图片、音频、视频等资源,甚至可以下载其他站点的可执行文件。 但也不是说浏览器就是完全自由的,如果不加以控制,就会出现一些不可…...
Flink CDC 3.0 Starrocks建表失败会导致任务卡主!
Flink CDC 3.0 Starrocks建表失败会导致任务卡主! 现象 StarRocks建表失败,然后任务自动重启,重启完毕后数据回放,jobMaster打印下面日志后,整个任务会卡主 There are already processing requests. Wait for proce…...

基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面
目录 简介注册与软件获取工程配置设计 UI导出源码板级验证更多内容 简介 SquareLine Studio 是一款专业的 UI 设计软件,它与 LVGL(Light and Versatile Graphics Library,轻量级通用图形库)紧密集成。LVGL 是一个轻量化的、开源的…...

Selenium IDE插件录制网页,解放双手
1、 国内下载地址 https://www.crx4chrome.com/crx/77585/ ,这个网络正常基本可以下载,目前最新版本是3.17.2。 点击Crx4Chrome下载。下载后的文件名称是:mooikfkahbdckldjjndioackbalphokd-3.17.2-Crx4Chrome.com.crx。 2、 安装 直接打开…...

【LeetCode】【滑动窗口长度不固定】978 最长湍流子数组
1794.【软件认证】最长的指定瑕疵度的元音子串 这个例题,是滑动窗口中长度不定求最大的题目,在看题之前可以先看一下【leetcode每日一题】【滑动窗口长度不固定】案例。 题目描述 定义:开头和结尾都是元音字母(aeiouAEIOU&…...

水库安全监测方案(福建地区水库安全监测案例分享)
我司星创易联最近在福建省受到了一个水库安全监测系统项目的委托。该水库位于福建中部山区,作为该地区的重要防洪与供水工程,对下游数十万人的生活产生重大影响。但是因为水库附近地质情况复杂,水库大坝在多次洪水冲击下出现一定病害,亟须全面加强对水库大坝安全状况的监测,以确…...

Oracle内存计算应用模式
前言 内存计算是利用内存来加速数据访问和应用的性能,并降低应用开发复杂度的技术。近十年来,随着软硬件技术的发展和用户需求的成熟,内存计算技术已经得到了广泛地应用。 Oracle在内存计算领域具有非常重要的地位,这主要得益于…...

ELK日志系统
一、规划 服务名所在服务器kafka1—2.13-2.4.1192.168.76.10kafka2—2.13-2.4.1192.168.76.11kafka3—2.13-2.4.1192.168.76.12zookeeper1—3.6.3192.168.76.10zookeeper2—3.6.3192.168.76.11zookeeper3—3.6.3192.168.76.12elasticsearch1—7.12.1192.168.76.10elasticsearc…...

C++:list容器(非原生指针迭代器的实现)
本章是STL容器 list 的模拟实现。 之前已经使用 C语言 对带头双向循环链表 进行实现,详见数据结构: 线性表(带头双向循环链表实现), 相较于之前的实现,C 下多了对迭代器以及模板等相关语法特性。下面将着重讲解这些新知识。 文章目录 一. list 的基本框架…...

抖音视频批量下载软件|视频评论采集工具
抖音视频评论采集软件是一款基于C#开发的高效、便捷的工具,旨在为用户提供全面的数据采集和分析服务。用户可以通过关键词搜索抓取视频数据,也可以通过分享链接进行单个视频的抓取和下载,从而轻松获取抖音视频评论数据。 批量视频提取模块&a…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...