心心念唸的手敲博客網站終於開發完畢,剩下的就是項目上線了,雖然說以前作項目的時候多多少少接觸過一點項目的線上發佈,也接觸過Linux
環境,可是實打實的從零開始上線項目,實屬第一次,好在最終也是發佈成功,在此特別記錄一下,該次發佈項目,菜雞所踩的那些坑。html
段落引用在上線前,咱們須要對上線到服務器所需的東西作一個整理,由於博主採用的前端是
Vue
,後臺是node.js
,數據庫採用的Mysql
,因此通過整理後,前期須要作的準備以下:前端
1.雲服務器一臺,本身用硬件搭服務器成本過高,還不穩定,最難解決的是沒有公網IP和內網穿透,因此放棄
2.已經備案完畢的域名一個
3.Linux系統,這裏採用的是阿里雲自帶的Ubuntu16.0
4.安裝node.js環境和npm包管理器
5.安裝Mysql數據庫
6.安裝Nginx
複製代碼
博主在這裏採用的是阿里雲的學生機,不是給阿里雲打廣告,確實還挺划算的,學生優惠一個月不到十塊錢,開個花唄分期買一年分12個月還款,約等於白拿,不過買了沒很久博主就後悔了,由於雙十一的時候更便宜,購買成功以後會預裝好系統,因此省掉了裝系統這一步,要是想學習Linux系統的安裝,能夠下一個
Vmware
隨便折騰,並且雲服務器還有一個好處就是就算折騰崩掉了,直接在控制檯恢復硬盤便可,又恢復到了最初的樣子從頭折騰,博主在上線期間就恢復了好幾回。服務器購買以後就不表明就能夠直接使用了,咱們還須要對其進行一些簡單的配置。vue
衆所周知,不少服務都會佔用對應的網絡端口,好比mysql默認佔用3306端口,而在咱們的服務器上也是如此,若是沒有開放這些端口的訪問,就會形成服務沒法正常運行或者沒法遠程訪問的狀況,下面一一記錄須要開放的端口。node
首先在購買服務器時,默認開啓338九、-1/-一、22/22
端口,22
端口主要用於遠程登陸服務器進行操做,必需要開啓。 而後登陸阿里雲控制檯,選擇所購買的服務器,進入到安全組中進行其餘端口的配置,注意是配置入方向的端口,主要須要打開的端口以下:mysql
1.3000端口:node.js服務監聽端口
2.3306端口:Mysql服務監聽端口
3.80端口:Nginx服務默認監聽端口
複製代碼
由於ubuntu默認的軟件下載源在美國,因此下載會很是的慢,通常會採用更改下載源的方法解決這個問題,雖然阿里雲的服務器的默認下載源是阿里源,可是有時候也會出現下載失敗找不到包的問題,因此博主把下載源修改到了清華大學源。修改下載源很是簡單,修改
/etc/apt/source.list
文件就能夠了。nginx
1.進入/etc/apt
文件夾sql
cd /etc/apt
複製代碼
2.在vim下修改source.list
文件數據庫
sudo vim sources.list
複製代碼
3.註釋掉sources.list
裏面的其餘內容 npm
1.先按`i`進入編輯模式
2.粘貼清華大學源到文件中:
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse
3.按`Esc`退出編輯模式
4.輸入`:wq`保存退出
複製代碼
5.更新apt
ubuntu
sudo apt-get update
複製代碼
node.js
環境1.安裝node.js
環境
sudo apt-get install nodejs
sudo apt install nodejs-legacy
sudo apt install npm
複製代碼
2.爲npm
包管理器更換淘寶鏡像
sudo npm config set registry https://registry.npm.taobao.org
sudo npm config list
複製代碼
3.全局安裝n
管理器(用於管理node.js
版本)
sudo npm install n -g
複製代碼
4.安裝最新的node.js
版本
sudo n stable
sudo node -v
複製代碼
Mysql
1.首先執行如下命令:
sudo apt-get install mysql-server(會出現界面讓你輸入root的密碼)
sudo apt install mysql-cilent
sudo apt install libmysqlcilent-dev
複製代碼
2.測試是否安裝成功
sudo netstat-tap | grep mysql
複製代碼
出現如下界面,即爲安裝成功
Mysql
服務
mysql -uroot -ppassword
複製代碼
4.設置mysql
遠程訪問
cd /etc/mysql/mysql.conf.d
sudo vim mysqld.cnf
註釋掉bind-address=127.0.0.1一行便可
複製代碼
3
進入
mysql
訪問執行受權命令
grant all on *.* to root@'%' identified by 'password' with grant option
flush privileges
複製代碼
6.用exit
退出mysql
服務,重啓mysql
服務
service mysql restart
複製代碼
7.而後能夠經過可視化軟件鏈接雲服務器的Mysql
了
nginx
在這裏博主採用的是簡單的安裝辦法,沒有采用源碼安裝的辦法,圖一個方便
1.運行安裝命令
sudo apt-get install nginx
複製代碼
Ubuntn安裝以後,nginx的文件結構大體以下所示:
/usr/sbin/nginx
/var/log/nginx
/etc/init.d/nginx.conf
/var/www/nginx-defalut
2.啓動默認nginx
sudo /etc/init.d/nginx start
複製代碼
而後訪問localhost或者服務器ip,出現nginx歡迎頁即爲安裝成功
pm2
是基於node
開發的一個進程管理器,適用於後臺常駐腳本管理
npm install pm2 -g
複製代碼
rz/sz
安裝用以上傳本地文件到服務器
sudo apt-get install lrzsz
複製代碼
unzip
安裝zip解壓軟件
sudo apt-get install unzip
複製代碼
至此,咱們的服務器基本配置就算搞定了,而後就是項目的正式上線了
1.新建前端項目目錄
mkdir /data/my_blog/front-end
複製代碼
2.打包本地vue項目
進入本地vue項目根目錄,執行:
npm run build
而後將進入dist文件夾,壓縮所有內容爲zip格式
複製代碼
3.進入服務器的前端項目目錄,上傳項目
cd /data/my_blog/front-end
rz
選擇剛剛的壓縮包,上傳完畢後執行解壓
unzip dist.zip
此時可使用ll命令查看當前目錄的文件
複製代碼
該項的主要目的是在服務器上建立一個與本地徹底同樣的數據庫
1.首先進入Navicat軟件,選中本地博客數據庫,導出格式爲sql
文件 2.用該軟件鏈接遠程數據庫,建立一個同名數據庫create database blog
3.選中建立的數據庫,執行剛剛建立的sql
文件,OK,搞定
1.進入本地後端項目根目錄,打包除了依賴文件夾之外的文件,壓縮爲zip
格式 2.建立服務器上的後端項目目錄
mkdir /data/my_blog/back-end
複製代碼
3.進入該目錄,上傳並解壓項目
cd /data/my_blog/back-end
rz
選擇壓縮文件
unzip name.zip
複製代碼
4.安裝項目的依賴
npm install
複製代碼
5.使用pm2
運行node
項目
pm2 start bin/www
在這裏必定要使用這種正確的方式,不要使用pm2 start app.js,否則沒法監聽到3000端口,不要問我爲何,我找這個bug找了半個小時,運行成功後會顯示`pm2`當前運行的服務狀況
複製代碼
node.js
的
mysql
插件,默認鏈接時間
time_out
是八個小時,若是超過八個小時沒有和數據庫進行交互,那麼
node
會自動斷開這個鏈接,而後報錯
PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR
,博主找這個問題找了半天,最開始是用的原始辦法,將
time_out
的值改成了
30
天,windows上最多改成
24
天,後來找到了如下解決辦法,貼出來代碼以下:
/*數據庫配置文件*/
const mysql = require('mysql');
const mysqlConf = {
host: 'localhost',
user: 'root',
password: 'password',
database: 'name',
multipleStatements: true
}
// 用於保存數據庫鏈接實例
let dataBase = null;
// 設置計時器
let pingInterval;
// 若是數據鏈接出錯 從新鏈接
function handleError(err){
logger.info(err.stack || err);
connect();
}
// 創建數據庫的鏈接
function connect() {
if(dataBase !== null){
dataBase.destroy();
dataBase = null;
}
dataBase = mysql.createConnection(mysqlConf);
dataBase.connect((err) => {
if (err) {
logger.info("err conncetion to database",err);
setTimeout(connect, 1500);
}
});
dataBase.on("error",handleError);
//每小時ping一次數據庫 保持數據庫鏈接狀態
clearInterval(pingInterval);
pingInterval = setInterval(() => {
console.log('ping database');
dataBase.ping((err) => {
if(err){
console.log('ping err' + JSON.stringify(err));
}
});
}, 3600000);
}
// 調用鏈接函數
connect();
module.exports = dataBase;
複製代碼
nginx
配置1.修改nginx配置文件
cd /etc/nginx
vim nginx.conf
複製代碼
2.修改配置文件爲:(這裏貼出博主的配置文件,僅供參考)
在http中添加server
#server 配置
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name blog.bestbven.top;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
root /data/my_blog/front-end; #前端項目地址
index index.html; #默認尋找
try_files $uri $uri/ /index.html; #一個坑,後面講
}
location /api/{
proxy_pass http://116.62.163.180:3000/; #監聽代理
}
}
複製代碼
3.保存對應的文件,重讀nginx
配置
nginx -s reload
或者這個
nginx -c /etc/nginx/nginx.conf
這個時候,可能會出現80被端口占用的狀況,解決辦法以下:
報錯:nginx: [emerg] a duplicate default server for 0.0.0.0:80
這個時候刪掉/etc/nginx/sites-available/default文件,從新啓動服務便可
假若只報錯80端口被佔用,那麼:
netstat -tunlp
查看所有端口占用狀況
找到佔用80端口的進程,記住他的進程號,而後
kill -9 進程號
幹掉他,再重啓nginx便可
複製代碼
4.nginx
的proxy_pass詳解 現,有題設要訪問http://192.168.1.1/api/getTest
First:
location /api/ {
proxy_pass http://127.0.0.1/;
}
URL:http://127.0.0.1/getTest
複製代碼
Second:
location /api/ {
proxy_pass http://127.0.0.1;
}
URL:http://127.0.0.1/api/getTest
複製代碼
Third:
location /api/ {
proxy_pass http://127.0.0.1/test/;
}
URL:http://127.0.0.1/test/getTest
複製代碼
Fourth:
location /api/ {
proxy_pass http://127.0.0.1/test;
}
URL:http://127.0.0.1/testgetTest
複製代碼
博主當時3000
端口老是沒法代理,被卡住了半天,最後google出了是proxy_pass配置出問題了 5.nginx
代理的vue
項目刷新後報錯404
vue單頁面的啓動頁面是index.html文件,路由實際是不存在的,因此會出現頁面刷新404問題,須要設置一下訪問vue頁面映射到index.html上。
1.打包靜態資源設置絕對路徑 config/index.js
nginx
映射配置
見上面nginx配置說的坑的地方
複製代碼
其實到這個地方,咱們的博客網站已是能夠訪問了,不過咱們採用的是服務器的IP地址進行訪問,因此咱們還差最後一步,就大功告成了
1.進入阿里雲域名控制檯
2.選擇已經備案完畢的域名,進行解析
3.添加記錄
4.記錄類型選擇A,由於咱們的域名要解析到一個IPV4地址
5.主機記錄博主輸入的`blog`,即將一級域名`bestbven.top`解析爲了二級域名`blog.bestbven.top`指向服務器IPV4地址
6.記錄值填寫服務器IPV4地址
7.點擊保存
複製代碼
OK,全部的發佈上線打工告成,能夠正常訪問了,博主花了整整八個小時時間,才從坑裏面勉強爬上岸,前路漫漫啊