JDK 和 JRE
JRE只有运行环境,JDK是开发开发工具包(包含JRE)
# 使用LTS, 长期稳定版
安装JDK
#ubuntu22.04默认是openjdk-11,这个是开源的jdk。如果要用官方的要去oracle下载 #不管用openjdk还是用官方jdk都可以 #生产环境中没有特殊要求,用openjdk即可 [root@ubuntu ~]#apt list *jdk* #查看可用jdk版本 [root@ubuntu ~]#apt update && apt install -y openjdk-11-jdk [root@ubuntu ~]#java --version
#安装 Oracle 官方 JDK ARM64是arm芯片 x64是64位 inter芯片 RPM和Debian包,低版本没有Debian包(比如没有java8的deb包) Compressed Archive包需要解压缩,做配置,不需要编译了(linux系统通用) #在oracle下载deb和rpm包 (直接安装即可) jdk-11.0.24_linux-x64_bin.deb #ubuntu使用 jdk-11.0.24_linux-x64_bin.rpm #rocky使用 #Oracle JDK的二进制文件安装 # 下载版本x64 Compressed Archive [root@centos8 ~]#tar xvf jdk-8u241-linux-x64.tar.gz -C /usr/local/ [root@centos8 ~]#cd /usr/local/ [root@centos8 ~]#ln -s jdk1.8.0_241/ jdk #初始化环境变量 [root@centos8 ~]#vim /etc/profile.d/jdk.sh [root@centos8 ~]#cat /etc/profile.d/jdk.sh export JAVA_HOME=/usr/local/jdk #java程序运行所需环境变量(tomcat等需要) export PATH=$PATH:$JAVA_HOME/bin #方便使用java命令
java代码编译实例
#java代码 [root@ubuntu ~]#vim Hello.java class Hello{ public static void main(String[] args) { System.out.println("hello, world"); } } #编译成字节码文件 [root@ubuntu ~]#javac Hello.java #生成class文件,无法查看(这个文件就是跨平台文件) [root@ubuntu ~]#ls Hello.class Hello.java #运行class文件,不用写后缀 [root@ubuntu ~]#java Hello hello, world
Tomcat
#Tomcat是java编写的,必须跑在JVM上 java包格式: jar包, war包 jar包直接跑在JVM上,war包需要跑在tomcat上(tomcat跑在JVM上)
#安装 #直接apt安装 #ubuntu中的包安装版tomcat存在Bug(无法将资源配置到 catalina.base 目录之外) #如果之前没有安装过java,也会自动安装openjdk-11-jre [root@ubuntu ~]# apt install tomcat9* #把doc,admin等相关功能一起安装 #这种方式安装文件路径需要找 [root@ubuntu ~]# systemctl status tomcat9.service # 在浏览器中访问 http://10.0.0.151:8080 #二进制安装 Tomcat #官网下载,Binary Distributions(二进制,不用编译,解压就能用) #Core核心包,下这个就行 #从tomcat官网下载 [root@ubuntu ~]#wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.91/bin/apache-tomcat-9.0.91.tar.gz [root@ubuntu ~]#tar xf apache-tomcat-9.0.91.tar.gz -C /usr/local/ [root@ubuntu ~]#cd /usr/local/ [root@ubuntu local]#ln -sv apache-tomcat-9.0.91/ tomcat 'tomcat' -> 'apache-tomcat-9.0.91/' #加环境变量 [root@ubuntu local]# ln -sv /usr/local/tomcat/bin/* /usr/local/bin/ #启动 [root@ubuntu local]#catalina.sh start [root@ubuntu local]#ss -lntp | grep 8080 LISTEN 0 100 *:8080 *:* users:(("java",pid=1302,fd=43)) #浏览器访问测试 http://10.0.0.151:8080/ #查看版本 [root@ubuntu local]#catalina.sh version #停止 [root@ubuntu local]#catalina.sh stop #用systemctl去管理 #添加用户并修改文件属主属组 [root@ubuntu ~]# useradd -r -s /sbin/nologin tomcat [root@ubuntu ~]# chown -R tomcat.tomcat /usr/local/tomcat/ #服务脚本 [root@ubuntu local]#vim /lib/systemd/system/tomcat.service [Unit] Description=Tomcat After=syslog.target network.target #基于哪些资源之后启动(要求这些资源先启动) [Service] Type=forking Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/ ExecStart=/usr/local/tomcat/bin/startup.sh ExecStop=/usr/local/tomcat/bin/shutdown.sh PrivateTmp=true User=tomcat Group=tomcat [Install] WantedBy=multi-user.target [root@ubuntu local]#systemctl daemon-reload #启动服务 [root@ubuntu ~]# systemctl start tomcat.service [root@ubuntu ~]# systemctl status tomcat.service
Tomcat 组成
[root@ubuntu ~]# ls -1 /usr/local/tomcat/ bin # 管理脚本文件目录 BUILDING.txt #编译的说明文件 conf # 配置文件目录 CONTRIBUTING.md lib # 库文件目录 LICENSE logs # 日志目录 NOTICE README.md RELEASE-NOTES RUNNING.txt temp # 临时文件目录 webapps # 应用程序目录(网站内容) #work相当于缓存(有修改自动更新),删了不影响,就再次把jsp编译serlet和class走一遍 work # jsp编译后的结果文件(serlet和class),建议提前预热访问,升级应用后,删除此目录数据才能更新
目录结构
#注意tomcat访问路径和nginx不同,如果带路径,不在ROOT,还是和ROOT平级路径 http://10.0.0.200:8080/test.jsp /usr/local/tomcat/webapps/ROOT/test.jsp http://10.0.0.200:8080/myapp/test.jsp /usr/local/tomcat/webapps/myapp/test.jsp www.magedu.org/index.jsp --> /usr/local/tomcat/webapps/ROOT/index.jsp www.magedu.org/tmall/index.jsp --> /usr/local/tomcat/webapps/tmall/index.jsp www.magedu.org/pig/index.jsp /usr/local/tomcat/webapps/pig/index.jsp
配置文件和日志
#/usr/local/tomcat/conf/server.xml #组件说明 Server 服务器,Tomcat 运行的进程实例,一个Server中可以有多个service,但通常就一 个 Service 服务,用来组织Engine和Connector的对应关系,一个service中只有一个Engine Connector 连接器,负责客户端的HTTP、HTTPS、A JP等协议连接,一个Connector只属于某 一个Engine Engine 引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector Host 虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分 Context 应用的上下文,配置特定url路径映射和目录的映射关系:url => directory #只要会配 <Host>,里面加上<Valve> 功能即可 #日志配置 日志正常情况下只要关注 catalina.out 即可 #范例: tomcat日志实现json格式的访问日志 [root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml ....... <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" ########################添加下面一行,注意是一行,不要换行 ##################################### pattern=" {"clientip":"%h","ClientUser":"%l"," ;authenticated":"%u","AccessTime":"%t"," method":"%r","status":"%s","SendBytes&qu ot;:"%b","Query? string":"%q","partner":"% {Referer}i","AgentVersion":"%{User-Agent}i"}"/> ################################################################################ ######## <!-- pattern="%h %l %u %t "%r" %s %b" /> --> </Host> </Engine> </Service> </Server> [root@centos8 ~]#systemctl restart tomcat
Tomcat 内部组成
#nginx <Host name="localhost" appBase="webapps" #tomcat server { server_name localhost; root webapps; }
应用部署
默认项目配置
<Host name="www.xyz.com" appBase="/data/www.www.xyz.com"></Host> #如果单个文件,会去找ROOT下的文件 www.xyz.com/index.html ----------------- /data/www/www.xyz.com/ROOT/index.html #如果有路径,那就回找该路径下的文件(优先级高),如果没有就去ROOT+路径下找 www.xyz.com/dir1/index.html ----------------- /data/www/www.xyz.com/dir1/index.html
部署
[root@ubuntu tomcat]#mkdir webapps/dira [root@ubuntu tomcat]#echo "dira index" > webapps/dira/index.html [root@ubuntu tomcat]#vim webapps/dira/test.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>jsp</title> </head> <body> hello world!<br /> <% out.println("this is test page"); %> <br /> <%=request.getRequestURL()%> </body> </html> # 在浏览器中测试 # http://10.0.0.151:8080/dira/ # http://10.0.0.151:8080/dira/test.jsp # 访问jsp时tomcat会转为serlet, 访问 JSP 会生成缓存 [root@ubuntu tomcat]# tree work/ work/ └── Catalina └── localhost ├── dira │ └── org │ └── apache │ └── jsp │ ├── test_jsp.class # java 字节码,非文本格式 │ └── test_jsp.java # servlet 代码
默认主页
[root@ubuntu tomcat]# vim conf/web.xml <welcome-file-list> #优先级从上到下排序 <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> #可以自己写一个index.html [root@ubuntu tomcat]# echo "ROOT INDEX" > webapps/ROOT/index.html #单独项目默认主页 [root@ubuntu tomcat]# ls webapps/dira/ [root@ubuntu tomcat]# mkdir webapps/dira/WEB-INF [root@ubuntu tomcat]# vim webapps/dira/WEB-INF/web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> <welcome-file-list> <welcome-file>xx.txt</welcome-file> <welcome-file>test.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app> [root@ubuntu tomcat]# echo "xxxxxxxx" > webapps/dira/xx.txt [root@ubuntu tomcat]# chown -R tomcat.tomcat webapps/dira #重启tomcat #测试浏览器输入 10.0.0.151:8080/dira/
部署独立域名的WEB服务
[root@ubuntu ~]#mkdir -pv /data/java.m99-magedu.com/ROOT [root@ubuntu ~]#echo "java.m99-magedu.com index" > /data/java.m99-magedu.com/ROOT/index.html [root@ubuntu tomcat]#vim /data/java.m99-magedu.com/ROOT/test.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>jsp</title> </head> <body> hello world!<br /> <% out.println("this is test page"); %> <br /> <%=request.getRequestURL()%> </body> </html> [root@ubuntu ~]#chown -R tomcat.tomcat /data/ #新增域名配置 [root@ubuntu tomcat]# vim conf/server.xml <Host name="java.m99-magedu.com" appBase="/data/java.m99-magedu.com" unpackWARs="true" autoDeploy="true"> </Host> #重启服务,在客户端配置域名解析,并测试 [root@ubuntu tomcat]# systemctl restart tomcat.service #浏览器测试 http://java.m99-magedu.com:8080/
以 war 格式压缩包部署
[root@ubuntu ~]#mkdir app1 [root@ubuntu ~]#cp /data/java.m99-magedu.com/ROOT/index.html app1/ [root@ubuntu ~]#cp /data/java.m99-magedu.com/ROOT/test.jsp app1/ [root@ubuntu ~]#chown -R tomcat.tomcat app1/ ##打成 war 包 [root@ubuntu ~]#cd app1/ [root@ubuntu app1]#jar cvf ../app1.war * [root@ubuntu ~]#cp app1.war /data/java.m99-magedu.com/ [root@ubuntu ~]#cd /data/java.m99-magedu.com/ #自动解包来自于配置文件中的设置 unpackWARs="true" 表示自动解包包 [root@ubuntu java.m99-magedu.com]#ls app1.war ROOT [root@ubuntu java.m99-magedu.com]#ls app1 app1.war ROOT #浏览器测试 http://java.m99-magedu.com:8080/app1 http://java.m99-magedu.com:8080/app1/test.jsp #示例: #部署jpress [root@ubuntu webapps]#mkdir -pv /data/webapps [root@ubuntu webapps]#chown -R tomcat.tomcat /data/ #传入jpress.war包,改名ROOT.war(jpress设计问题,必须根路径,否则跳转有问题) [root@ubuntu tomcat]#vim conf/server.xml <Host name="www.magedu.org" appBase="/data/webapps" unpackWARs="true" autoDeploy="true"> </Host> #重启服务,在客户端配置域名解析,并测试 [root@ubuntu tomcat]# systemctl restart tomcat.service #浏览器测试 http://www.magedu.org:8080
以 jar 包部署 halo 开源项目 (自带sqlit数据库)
#jar包直接跑在jvm上(jar包自带web server) [root@ubuntu ~]# wget https://dl.halo.run/release/halo-1.6.1.jar -O halo.jar [root@ubuntu ~]# java -jar halo.jar # 在浏览器中测试 # http://10.0.0.151:8090/
默认应用管理
# Server Status 是状态查看页,默认只能通过本机访问 # Manager App 是应用管理,默认只能通过本机访问 # Host Manager 是虚拟主机管理,默认只能通过本机访问 # Server Status,Manager App 导航对应的项目目录是 manager,根据页面提示,修改下列配置 上述内容需要访问,除了配置ip允许访问,还需要添加允许访问用户 # webapps/host-manager/META-INF/context.xml 也按此配置修改 [root@ubuntu tomcat]# vim webapps/manager/META-INF/context.xml <?xml version="1.0" encoding="UTF-8"?> <Context antiResourceLocking="false" privileged="true" > <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor" sameSiteCookies="strict" /> #此处限定的是远程访问IP,添加 |10\.0\.0\.\d+ <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" /> <Manager sessionAttributeValueClassNameFilter="java\.lang\. (?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreve ntionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/> </Context> # 添加角色和授权用户 # http://10.0.0.206:8080/docs/manager-howto.html role 与项目对应关系文档 [root@ubuntu tomcat]# cat conf/tomcat-users.xml # manager 项目配置 <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="tomcater" password="123456" roles="manager-gui,admin-gui"/> #不用重启tomcat,直接就能登录访问了 #很少使用界面部署
结合反向代理实现 Tomcat 部署
Nginx 单机反向代理实现
#把图片复制到项目ROOT下 [root@ubuntu ~]#cd /data/java.m99-magedu.com/ROOT [root@ubuntu ROOT]# rz [root@ubuntu ROOT]#chown tomcat.tomcat tank.jpeg #在tomcat项目中直接日志,方便查看 [root@ubuntu tomcat]#vim conf/server.xml <Host name="java.m99-magedu.com" appBase="/data/java.m99-magedu.com" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="java.m99-magedu.com_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> [root@ubuntu tomcat]#systemctl restart tomcat.service #在 nginx 中配置动静分离 [root@ubuntu nginx]#vim sites-enabled/java.m99-magedu.com.conf [root@ubuntu ~]# cat /etc/nginx/sites-enabled/java.m99-magedu.com.conf server{ listen 80; server_name java.m99-magedu.com; root /var/www/html/java.m99-magedu.com; # 将 .jsp 转发给 tomcat location ~* \.jsp$ { proxy_pass http://127.0.0.1:8080; proxy_set_header host $http_host; } } [root@ubuntu ~]# systemctl restart nginx.service [root@ubuntu nginx]#mkdir -pv /var/www/html/java.m99-magedu.com [root@ubuntu nginx]#cd /var/www/html/java.m99-magedu.com #传图片 [root@ubuntu java.m99-magedu.com]#rz #测试 http://java.m99-magedu.com/f.jpg
Nginx 代理多机 Tomcat 实现
#nginx 配置 [root@ubuntu ~]# cat /etc/nginx/sites-enabled/java.m99-magedu.com.conf upstream tomcat { server 10.0.0.208:8080; server 10.0.0.210:8080; } server{ listen 80; server_name java.m99-magedu.com; root /var/www/html/java.m99-magedu.com;#静态资源在本地 location ~* \.jsp$ { proxy_pass http://tomcat; proxy_set_header host $http_host; } }
配置 Https 监听 转发到后端 Http
#可以自建证书,把CA证书ca.crt导入系统。(可以谷歌浏览器,安全,管理证书,受信任的证书)
实现真实客户端IP地址透传
#nginx upstream blog { server 10.0.0.101:8080; server 10.0.0.102:8080; } server { listen 80; server_name blog.wangxiaochun.com; return 302 https://$host$request_uri; #return 302 https://$server_name$request_uri; #$server_name 来自于上面的server_name,即blog.wangxiaochun.com } server { listen 443 ssl; server_name blog.wangxiaochun.com; ssl_certificate /etc/nginx/ssl/blog.wangxiaochun.com.pem; ssl_certificate_key /etc/nginx/ssl/blog.wangxiaochun.com.key; client_max_body_size 20m; #默认1m,要是上传资源大就加上 location / { proxy_pass http://blog; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } #tomcat 中设置单独的访问日志 [root@ubuntu ~]# cat /usr/local/tomcat/conf/server.xml <Host name="java.m99-magedu.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="java.m99-magedu.com_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b %{x-forwarded-for}i"/> #i不区分大小写 </Host>
Tomcat Session 复制集群
tomcat的session是写在内存中的,php的session是写在文件中的 #session复制是tomcat自己带的功能,tomcat之间互相同步session (适合小集群,少量服务器)
Memcached 实现 Session 共享
memchached了解即可,生产中使用机会不多(不支持持久化)
后端把session存到memchached中,实现共享 -m 设置内存(生产环境可以调成总内存的1/4) #memchached没提供客户端工具,可以用telnet连接
虚拟机
HotSpot不开源,openjdk开源标签:JAVA,TOMCAT,tomcat,com,magedu,应用,ubuntu,java,root From: https://www.cnblogs.com/ludingchao/p/18394122