1. 程式人生 > >阿里雲多應用部署記錄

阿里雲多應用部署記錄

將應用部署到伺服器上是釋出中的最後一環。理論上應該有專業團隊和部署平臺來處理。但對於個人開發者,起初只能寒酸一點了。最近需要將多個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

顯然是字元編碼集的問題。
處理方式:

  1. 檢視JDBC連線字串,配置有useUnicode=true&amp;characterEncoding=utf-8,沒問題

  2. tomcat的配置<Connector>加上URIEncoding="UTF-8",沒效果

  3. 檢視資料庫字元編碼集,果然有問題:

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 伺服器外掛漏洞被利用、上傳木馬、攻擊非