阿里雲多應用部署記錄
將應用部署到伺服器上是釋出中的最後一環。理論上應該有專業團隊和部署平臺來處理。但對於個人開發者,起初只能寒酸一點了。最近需要將多個java應用部署到一臺伺服器上,將自己的思路和操作記錄下來。
安裝系統環境請參考上一篇文章:阿里雲伺服器部署環境搭建
系統環境:
OS: centos 6.8/2.6.32-696.3.2.el6.x86_64
jdk: 1.8.0_144
mysql: 5.1.7
tomcat: 8.0.36
maven: 3.5.0
git: 1.7.1
nginx: 1.12.1
tomcat
每個應用單獨通過一個tomcat執行,所以需要將tomcat複製一遍,併為每個應用提供單獨配置,預設情況下,只需要修改tomcat目錄下的conf/server.xml,主要是兩個埠:
<!--8080改成了8081,URIEncoding="UTF-8"加上可以避免中文亂碼-->
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
<!--8009改成了8010-->
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
因為是多應用,將每個應用的埠記錄下來是一個比較好的實踐。
程式碼
程式碼管理使用阿里雲提供的程式碼倉庫:https://code.aliyun.com/
在阿里雲程式碼倉庫中建立程式碼庫,並將程式碼提交到該程式碼庫
在home目錄下建立code目錄,在該目錄下為每個應用建立一個資料夾,比如我的:
/home/lucas/code
├── buquan
└── ssm
進入專案目錄後,將程式碼git clone
下來,在專案根目錄下執行‘mvn clean package’,打包過後的檔案在 target目錄下
然後將該包拷貝到相應的tomcat的webapps目錄下,前提是tomcat是關著的。
cp ./target/receptionaccount.war {tomcat-dir}/webapps/
進入tomcat目錄,啟動tomcat並檢視啟動日誌
./bin/catalina.sh start & tailf logs/catalina.out
資料庫
為每個專案建立單獨的資料庫,並建立表。
遇到一個問題就是,MySQL的編碼問題。我先建表,啟動應用,結果執行時報錯:
SQL state [HY000]; error code [1366]ERROR: Incorrect string value: '\xE5\x95\x8A\xE5\xAE\x9E...' for column 'problem' at row 1
顯然是字元編碼集的問題。
處理方式:
檢視JDBC連線字串,配置有
useUnicode=true&characterEncoding=utf-8
,沒問題tomcat的配置<Connector>加上
URIEncoding="UTF-8"
,沒效果檢視資料庫字元編碼集,果然有問題:
mysql>show variables like 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql>show variables like 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | utf8_general_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
mysql> STATUS
--------------
mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
Connection id: 99
Current database: accounting
Current user: [email protected]
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.1.73 Source distribution
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: utf8
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 13 days 23 hours 26 min 16 sec
Threads: 2 Questions: 163 Slow queries: 0 Opens: 30 Flush tables: 1 Open tables: 15 Queries per second avg: 0.0
--------------
然後修改資料庫的字元編碼集
alter database accounting character set 'UTF8';
仍然報錯
4. 於是修改MySQL的配置檔案,sudo vim /etc/my.cnf
在[mysqld]下加入default-character-set=utf8
我的沒有[client]的配置,手動加入[client] default-character-set=utf8
,最終配置為
[client]
default-character-set=utf8
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default-character-set=utf8
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
重啟MySQL
sudo /etc/init.d/mysqld stop
sudo /etc/init.d/mysqld start
果然就生效了:
mysql> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
mysql> show variables like 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
但是仍然報錯…
5. 再看資料表的配置:
mysql> SHOW FULL COLUMNS FROM user;
Collation全是latin1_swedish_ci
於是修改表字段的資料型別
ALTER TABLE user CONVERT TO CHARACTER SET utf8
再試,成功。
幾乎把涉及到編碼集的所有地方都修改了。
Nginx配置
這裡配置的是將一個域名來的請求轉發到8081埠上。上文tomcat配置部分已經將應用埠配置為8081,所以實際上就是把某個域名的請求轉發到相應的應用上。
購買和解析域名
首先是去萬網購買域名,在阿里雲控制檯將dns解析到雲伺服器的A記錄公網IP,也就是80埠上,ng監聽80埠就能接收到請求了。dns解析會有快取,時間較慢。
接下來配置ng 的反向代理
我的ng配置路徑是/etc/nginx/nginx.conf
,sudo vim開啟之。
在http 下配置upstream,即本地的一個應用伺服器,再配置server節點,根據來源域名,代理轉發到upstream上去。完整配置如下:
upstream hy_front {
server localhost:8081;
}
server {
listen 80;
#這裡配置域名
server_name xxxxxx.top;
location / {
# 代理轉發
proxy_pass http://hy_front;
#設定頭資訊,將頭資訊轉發到被代理的伺服器
#轉發請求的host資訊
proxy_set_header Host $host;
# 轉發最後一跳的真實ip
proxy_set_header X-Real-IP $remote_addr;
#轉發IP
proxy_set_header REMOTE-HOST $remote_addr;
#轉發跳轉IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
然後重新載入ng,沒有報錯就是配置生效了,可以看到效果
sudo /usr/sbin/nginx -S reload
一個坑
這裡遇到個坑,就是代理過後,一些css、js等靜態檔案無法載入,看html是因為head裡設定了一個base,這個路徑變成了
<base href="http://hy_front:80/receptionaccount/">
跟ng裡配的upstream的名字相同,立即想到是因為ng的配置。再看了下jsp中的程式碼,這base標籤的生成程式碼是:
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<base href="<%=basePath%>">
問題出在request.getServerName()。搜尋下,竟然有人遇到同樣的問題,按照其思路,加上果然生效。參考文章
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
相關推薦
阿里雲多應用部署記錄
將應用部署到伺服器上是釋出中的最後一環。理論上應該有專業團隊和部署平臺來處理。但對於個人開發者,起初只能寒酸一點了。最近需要將多個java應用部署到一臺伺服器上,將自己的思路和操作記錄下來。 安裝系統環境請參考上一篇文章:阿里雲伺服器部署環境搭建 系統環
阿里雲ECS伺服器部署Node.js專案詳細教程及多網站部署
本文詳細介紹如何部署NodeJS專案到阿里雲ECS上,以及本人在部署過程中所遇到的問題、坑點和解決辦法,可以說是全網最全最詳細的教程了。同時講解了如何申請阿里雲免費SSL證書,以及一臺ECS伺服器配置多網站的Nginx配置方法等。 作者:Kovli 1. 雲伺
阿里雲Centos 7部署DJango2.0應用(uwsgi3 +Nginx)
目錄 前言 上傳以及伺服器環境部分 uwsgi部分 nginx部分 靜態檔案 阿里雲端口許可權開啟 前言 先概括下訪問流程: 首先客戶端發起請求,這裡會有TCP的握手,三次握手結束之時,客戶端會帶上http資料給伺服器(請求行,請求頭,請求體),伺服器會接
React + Node.js + Mysql專案部署到阿里雲輕量級應用伺服器
一、安裝Mysql,可外網訪問1. 更新系統 【在root使用者下】apt-get update2.安裝Mysql-serverapt-get install mysql-server apt-get isntall mysql-client apt-get install
如何提高阿里雲上應用的可用性(二)
這是如何提高阿里雲上應用的可用性系列文章的第二篇,第一篇傳送門。 在單體應用時代,最大的問題是如何解決資料庫瓶頸,而微服務之下,一個大應用被拆分成了幾十個甚至上百個微服務,資料訪問的壓力被傳導到了服務之間的網路,服務強弱依賴,服務雪崩等各種問題隨之而來,那麼如何保障服務的可用性以及整個應用的健壯性呢?常見的
阿里雲伺服器上部署tomcat,並進行訪問測試
要求將一個專案部署到新買的阿里雲伺服器上。使用xshell遠端連線(連線使用的ip是例項的公網ip)。 在部署配置tomcat之前首先進行JDK的部署,先說明一下,我使用的CentOS7.4. 選擇JDK1.
阿里雲配置伺服器部署專案
最近雙11來了,作為程式設計師,終於買了個阿里雲ecs伺服器,主要便宜。 對於一個前端開發人來說伺服器,專案部署好像搭不上邊,但是對於愛好者,可以瞭解一下。剛剛買完不知道怎麼搭建。官方給的解釋太繁瑣,不知道有沒有小夥伴跟我一樣的感受。 好了話不多說,直接開掛,看截圖。 1.這是剛剛購買的
如何提高阿里雲上應用的可用性(一)
摘要: 如今,開發並上線一款應用十分方便。因為雲端計算提供了從最基礎的計算資源如伺服器網路、資料庫服務、中介軟體PaaS平臺到各種應用支撐的雲管理服務,同時開源社群的迅猛發展也提供了從資料庫、快取到應用全生命流程中各種必須的元件,所以越來越多的應用開發者可以把精力放在業務創新上。 如今,開發並上線一款應用十
用阿里雲函式計算部署thinkphp5.1
thinkphp國內還是用的很多的哈,我自己就用哈。所以研究了一下用函式計算部署tp5。其中借鑑和學習了@rsong 的文章:《十分鐘上線-函式計算玩轉 WordPress》 這裡是TP5的演示:https://31199382.cn-beijing.fc.aliyuncs.com/2016-08-15/p
阿里雲CentOs7伺服器部署之JDK+MySQL+Tomcat安裝
一、安裝jdk 1. 登入Linux,切換到root使用者 su root #獲取root使用者許可權,當前工作目錄不變(需要root密碼) 或 sudo -i #不需要root密碼直接切換成root(需要當前使用者密碼) 2. 在usr/local目錄下建立java安裝目
如何提高阿里雲上應用的可用性
摘要: 如今,開發並上線一款應用十分方便。因為雲端計算提供了從最基礎的計算資源如伺服器網路、資料庫服務、中介軟體PaaS平臺到各種應用支撐的雲管理服務,同時開源社群的迅猛發展也提供了從資料庫、快取到應用全生命流程中各種必須的元件,所以越來越多的應用開發者可以把精力放在業務創新上。 如今
阿里雲ECS上部署node環境,使用pm2執行持久服務
記錄在阿里雲伺服器ECS上部署node環境 1.連線伺服器:ssh 使用者名稱@伺服器ip 開啟終端(Terminal): 輸入 " ssh 使用者名稱@伺服器ip" 輸入 回車(enter) 輸入 密碼 即可連線到伺服器 2.安裝node環境 在登陸阿里雲的終端中下載node安裝包,並解壓
阿里雲Web應用防火牆產品優勢與使用場景
Web應用防火牆(Web Application Firewall, 簡稱 WAF), 是阿里基於10餘年攻防經驗完全自主研發的安全產品。其基於雲安全大資料能力實現,通過防禦SQL注入、XSS跨站指令碼、常見Web伺服器外掛漏洞、木馬上傳、非授權核心資源訪問等OWASP常見攻擊,過濾海量惡意訪問,避
阿里雲ECS伺服器部署Dart服務端程式
pub global activate [package] Instead of this: export PATH="$PATH":"~/.pub-cache/bin" It should be export PATH="$PATH:$HOME/.pub-cache/bin" 1.D
阿里雲Web應用防火牆使用教程
什麼是Web應用防火牆 雲盾Web應用防火牆(Web Application Firewall, 簡稱 WAF)基於雲安全大資料能力,用於防禦SQL注入、XSS跨站指令碼、常見Web伺服器外掛漏洞、木馬上傳、非授權核心資源訪問等OWASP常見攻擊,並過濾海量惡意CC攻擊,避免您的網站資產資料洩露
阿里雲+GitLab+Jenkins部署SpringBoot專案
1.Jenkins介紹 Jenkins是一個開源軟體專案,是基於Java開發的一種持續整合工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體的持續整合變成可能。 (以上介紹來源於百度百科) 其實通俗來說,Jenkins就是一個自動化部署專案的工具,幫我省去重複的運維工作。
阿里雲單機快速部署K8S
網上有很多關於K8S部署測試環境的文章,但是有些部署比較繁瑣。這裡推薦使用 https://github.com/gjmzj/kubeasz地址文章。文章介紹很詳細,記錄一下方便自己日後學習使用。 # 叢集部署節點:一般為執行ansible 指令碼的節點# 變數 NTP_ENABLED (=y
阿里雲伺服器快速部署
幾年前,企業使用伺服器 都是自己購買伺服器主機,進行服務部署,隨著網際網路的發展,雲伺服器的出現代替了之前的自己部署獨立伺服器。 那麼傳統伺服器和雲主機到底有哪些區別呢? 1、傳統伺服器有產權,而云主機則只是一種服務而已,沒有任何產權; 2、傳統伺服器是獨立的伺服器,所有功
[阿里雲]輕型應用伺服器[8080/888/8000/...]埠外網不通解決方法
算是一個坑吧,畢竟相關文件的具體指引在阿里雲上也不太好找。 剛剛買了個新的阿里雲輕型應用伺服器,映象環境是BT-Panel5.2.0。 其二是在BT-Panel中再放行該埠一次:
阿里雲Web應用防火牆 過濾海量惡意CC攻擊教程
阿里雲 web 應用防火牆是什麼?簡單說可以起到防護外部攻擊、修補伺服器漏洞,抵擋海量惡意 CC 攻擊的作用,用於避免網站資料洩露,保障網站安全和使用。平時常見的攻擊網站手法比如 SQL 注入、XSS 跨站指令碼等,還有常見 Web 伺服器外掛漏洞被利用、上傳木馬、攻擊非