tomcat + nginx 部署各類工程的幾種方式
背景介紹
現在 linux 基本命令和簡單部署已經成基本功了。以下介紹都是使用 tomcat + nginx 進行部署
技能列表(多工程部署)
- 各 tomcat 環境變量配置及公共部分修改
- 使用 tomcat + nginx 部署 zip 包。自定義部署目錄
2.1 一個 tomcat 啓動多個包 - 使用 tomcat + nginx 部署 war 包。使用默認目錄 + tomcat 部署管理
3.1 nginx 反向代理 tomcat 部署管理頁面
3.2 war 包部署進行單點替換 - 使用 tomcat + nginx 部署 war 包。自定義部署目錄
- 使用 tomcat + nginx 部署 常規靜態工程。
- 使用 nginx 部署 dist.zip 等 VUE \ REACT 靜態工程
多個 tomcat 環境變量配置及公共部分修改
export JAVA_HOME=/usr/local/java/jdk1.8.0_191
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
# tomcat_tomcat_manage_8080
TOMCAT_HOME=/usr/local/tomcat_manage_8080
CATALINA_HOME=/usr/local/tomcat_manage_8080
CATALINA_BASE=/usr/local/tomcat_manage_8080
export TOMCAT_HOME CATALINA_HOME CATALINA_BASE
# tomcat_tomcat_manage_8082
TOMCAT_HOME_2=/usr/local/tomcat_doctor_8082
CATALINA_HOME_2=/usr/local/tomcat_doctor_8082
CATALINA_BASE_2=/usr/local/tomcat_doctor_8082
export TOMCAT_HOME_2 CATALINA_HOME_2 CATALINA_BASE_2
# tomcat_tomcat_manage_8083
TOMCAT_HOME_3=/usr/local/tomcat_manage_8083
CATALINA_HOME_3=/usr/local/tomcat_manage_8083
CATALINA_BASE_3=/usr/local/tomcat_manage_8083
export TOMCAT_HOME_3 CATALINA_HOME_3 CATALINA_BASE_3
# tomcat_tomcat_manage_8084
TOMCAT_HOME_4=/usr/local/tomcat_static_8084
CATALINA_HOME_4=/usr/local/tomcat_static_8084
CATALINA_BASE_4=/usr/local/tomcat_static_8084
export TOMCAT_HOME_4 CATALINA_HOME_4 CATALINA_BASE_4
# tomcat_tomcat_manage_8085
TOMCAT_HOME_5=/usr/local/tomcat_patient_8085
CATALINA_HOME_5=/usr/local/tomcat_patient_8085
CATALINA_BASE_5=/usr/local/tomcat_patient_8085
export TOMCAT_HOME_5 CATALINA_HOME_5 CATALINA_BASE_5
# tomcat_gateway_8086
TOMCAT_HOME_6=/usr/local/tomcat_gateway_8086
CATALINA_HOME_6=/usr/local/tomcat_gateway_8086
CATALINA_BASE_6=/usr/local/tomcat_gateway_8086
export TOMCAT_HOME_6 CATALINA_HOME_6 CATALINA_BASE_6
# tomcat_yy_8087
TOMCAT_HOME_7=/usr/local/tomcat_customer_8087
CATALINA_HOME_7=/usr/local/tomcat_customer_8087
CATALINA_BASE_7=/usr/local/tomcat_customer_8087
export TOMACT_HOME_7 CATALINA_HOME_7 CATALINA_BASE_7
# tomcat_message_8088
TOMCAT_HOME_8=/usr/local/tomcat_attachment_8088
CATALINA_HOME_8=/usr/local/tomcat_attachment_8088
CATALINA_BASE_8=/usr/local/tomcat_attachment_8088
export TOMACT_HOME_8 CATALINA_HOME_8 CATALINA_BASE_8
同時需要修改 tomcat 下 catalina.sh文件。具體路徑爲 : tomcat/bin/catalina.sh 。修改內容爲 :
接着修改 啓動文件 tomcat/conf/server.xml 主要是修改兩處端口號,各 tomcat 的端口號不能衝突
使用 tomcat + nginx 部署 zip 包。自定義部署目錄
除上述公共部分都需要修改之外。部署 zip 包有以下特殊需要修改之處。
需要修改 tomcat\conf\Catalina\localhost\XX.xml 文件。此處有幾個約定:
- xx.xml 文件名和上傳 zip 包名稱一致 。
其他屬性配置可參考百度上其他的說明。 - zip 包需要自己主動解壓
一個 tomcat 啓動多個包
即 增加多個 XX.xml 文件即可。如圖
使用 tomcat + nginx 部署 war 包。使用默認目錄 + tomcat 部署管理
除上述公共部分都需要修改之外。部署 war 包有以下特殊需要修改之處。
- 如果無需自定義存放目錄。則 jar 包可以直接上傳至
/usr/local/taotao-manager-web/webapps
- 啓動則可,tomcat 會自動給配置上下文根爲 war 包 名稱,即請求時,自動加上 /taotao-manager-web
- 存放到默認目錄,可以考慮使用 tomcat 自帶的部署管理頁面。這樣可以外網上傳 war 包進行熱部署。
3.1 修改 /usr/local/taotao-manager-web/conf/tomcat-users.xml 新增圖片處。爲賬號密碼。
3.2 登錄管理頁面
http://ip:8080/manager/html 點擊 undeploy 和 delpoy
3.3 修改 /usr/local/taotao-manager-web/webapps/manager/WEB-INF/web.xml 設置允許上傳包的大小
3.4 修改 nginx 上傳文件限制。2020年1月14日 今天剛剛發現。特此更新
記得 http 和 https 都需要更改
nginx 反向代理 tomcat 部署管理頁面
背景:當我們有多個 tomcat 需要部署時,那麼對應的就有多個管理頁面需要被我們代理,這樣就又涉及更改 tomcat 的配置了
先介紹 tomcat 相關默認的目錄結構如下:
manager 文件名就是我們需要關注的地方。默認請求管理頁面的路徑爲
http://ip:8080/manager/html 文件名和路徑存在聯動性。
那麼修改有以下步驟:
-
定義好自己的工程名稱 如 :patient-manager
-
在 nginx 中做好代理配置 。
-
rename manager 文件名爲 patient-manager
-
成果
war 包部署進行單點替換
最近往服務器上的tomcat上替換webapps裏的工程class文件,出現不能直接生效而是需要重啓才能生效的現象,非常影響效率,後才知道需要在tomcat目錄下的conf文件夾下的server.xml文件的host節點下加上如下配置:
<Context path="/" docBase="/usr/local/tomcat_patient_8085/webapps/" debug="0" privileged="true" reloadable="true"/>
就可實現替換後重新加載的效果,另外需要注意的是,加了後可能會出現內存不足的情況,需要設置 一下jvm參數,修改tomcat目錄下的bin下的catalina.sh的內容,在“Execute The Requested Command ”下面加入如下語句:
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
使用 tomcat + nginx 部署 war 包。自定義部署目錄
使用自定義目錄,則需要放棄 管理頁面。暫時我也不知道怎麼配置。留作以後研究
不推薦在nginx代理的 URL 後增加 / 來屏蔽代理 URL 的上下文根,這樣管理頁面其他按鈕會報錯
使用 tomcat + nginx 部署 常規靜態工程。
- 使用 一個 WEB 殼子包裝啓動 。其實就是參照 使用 tomcat + nginx 部署 zip 包。自定義部署目錄
使用 nginx 部署 dist.zip 等 VUE \ REACT 靜態工程
以 VUE 項目舉例。多個 VUE 項目只是新增 nginx 配置和重命名文件夾即可
-
需要修改前端工程配置。
修改上下文根
修改基礎請求頭 。不要斜槓 不要斜槓 不要斜槓 重要的事情說三遍
-
修改 nginx 配置
worker_processes 2;
error_log logs/error.log;
events {
worker_connections 1024;
}
# ...
# 反向代理
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
keepalive_timeout 65;
client_max_body_size 20M;
client_body_buffer_size 10M;
large_client_header_buffers 4 128k;
# 這裏可以做集羣
#upstream p1_server {
# server localhost:8081;
#}
# 這裏可以做集羣
#upstream p2_server {
# server localhost:8082;
#}
server {
listen 80;
server_name 47.99.69.84;
charset utf-8;
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
proxy_set_header Host $host;
proxy_set_header X-Forwarder-For $remote_addr;
# 這裏指定剛剛我們的文件夾
root /war;
# 總的項目路由,我偷懶直接寫在了同一個文件
# 如果有很多可以在配置多個 conf 文件,使用 include 關聯進來
# 這裏可以理解指定到 html 文件夾下的 index.html
#location / {
# try_files $uri $uri/ /index.html;
#}
# yeb-ud-web
# 這裏就是剛剛我們在 vue 項目中 config/index.js 的配置 build.assetsPublicPath,
# 也是 vue 項目中配置的 router 中的 base
# 這裏可以理解指定到 html 文件夾下 yeb-ud-web 文件夾 的 index.html
location /yeb-ud-web {
try_files $uri $uri/ /yeb-ud-web/index.html;
}
location @rewrites {
rewrite ^(.+)$ /index.html last;
}
# yeb-cd-web
# 這裏是項目二的配置
# 這裏可以理解指定到 html 文件夾下 project2 文件夾 的 index.html
location ^~ /yeb-cd-web {
try_files $uri $uri/ /yeb-cd-web/dist/index.html;
}
# 或者如下也行
# 其他代表轉發 cookie 和 請求頭
location / {
root E:/hbuildworkspace/yiyibang-doctor-h5/dist/build/h5;
index index.html index.htm;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
try_files $uri $uri/ /index.html;
}
# 這裏是 project1 配置需要調用的接口
# 這裏就是在 vue 項目中 prod.env.js 的配置 BASE_API
# proxy_pass http://p1_server; # 此處的 p1_server 對應的上面的配置 upstream p1_server
# {},這裏可以做集羣,我用不到,就簡單配置了
location /yeb-doctor/ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://zhyy.whyyy.com/yeb-doctor/ ;
}
# 這裏是 project1 配置需要調用的接口
# 這裏就是在 vue 項目中 prod.env.js 的配置 BASE_API
# 此處的 p2_server 對應的上面的配置 upstream p2_server
# # # {},這裏可以做集羣,我用不到,就簡單配置了
location /yeb-patient/ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://zhyy.whyyy.com/yeb-patient/;
}
location /yeb-attachment/ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://zhyy.whyyy.com/yeb-attachment/;
}
location /yeb-customer-service/ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://zhyy.whyyy.com/yeb-customer-service/;
}
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
}
}
使用 nginx 部署多個常規靜態工程
所謂的常規靜態工程。就是傳統的 html + css + js 工程,區別於 VUE/REACT 等直接壓縮打包成一個 js 文件。
那麼部署常規靜態工程,其要點在於有效匹配對應的 URL 並進行硬盤路徑映射。比如
匹配
http://localhost:8686/yeb-doctor-mobile/xswz/doctor/d-login.html?companyId=ff8080816b266ad2016b2ac86e2a037f
中的 /yeb-doctor-mobile/xswz/ 映射到一個硬盤路徑
匹配另外一個 /xxxx/xxxx URL 映射到其他硬盤路徑
那麼對代碼有一個要求,即 html 引入的 css 和 js 寫的是文件的相對路徑
上配置
location /yeb-doctor-mobile/xswz/ {
alias 'E:/business_project/hospital/second_phase/workpace/yeb-yidong/0002/code/yeb-doctor-mobile/xswz/';
}
location /yeb-message/rest/ {
proxy_pass http://yiyibang.com.cn;
}
效果如圖 :對應的 html 和樣式都能加載成功
本地硬盤文件路徑效果爲 :
驗證結果
洋洋灑灑寫了比較多,驗證結果中間也貼了一些。