做爲一個前端開發工程師,天天和瀏覽器、業務代碼打交道,對於「前端」的概念算是比較熟悉了,主流的框架、工具等都能玩得轉,但總以爲本身一直都被禁錮在小小的所謂「前端」的圈子中——由於除此以外的知識點仍是比較薄弱的。html
後來在公司裏面得到了一個輪崗的機會,進入到了運維團隊去學習,眼界也開闊了不少,對於自身水平的認識也更加深刻,火燒眉毛想要提高本身「前端知識」之外的技能樹。前端
因爲運維團隊常常會跟服務器打交道,那麼我何不乾脆就從服務器開始,好好折騰一遍呢?node
曾經考慮過購買騰訊雲或者阿里雲等國內服務器,可是因爲國內總所周知的緣由,許多資源的下載要麼特別慢,要麼乾脆直接跪了,動不動就要切換源。同時若是域名綁定了國內的服務器,都須要進行備案,實在是無比麻煩。毫無疑問,我最終選擇了國外的服務器,世界瞬間就清淨了……nginx
關於國外的服務器選購,是見仁見智的事情,我選購的是一臺搬瓦工20G KVM服務器,5美圓/月,買了不吃虧買了不上當,而後安裝了Centos 7 x86_64 bbr系統,接下來就能夠愉快地玩耍了。git
搭個什麼服務都好,總不能讓別人背本身的ip,若是可以擁到一個拉風的域名仍是很讚的。因而我就去萬網,直接以本身的英文名字jrainlau
申請了一個jrainlau.com
域名,一年才55塊RMB,真的超值哦~github
很簡單的下單、支付,而後我就擁有了本身的專屬域名,接下來就是進行DNS解析了。web
進入阿里雲的控制檯,找到雲解析DNS
,點進去就能看到咱們的域名解析信息了。添加兩條類型爲A
的記錄,通通指向服務器的ip地址便可:npm
在域名解析生效前的10分鐘裏面,足夠咱們在服務器上配置好Nginx了。瀏覽器
首先ssh登陸服務器:安全
ssh root@xxx.xxx.xxx.xxx -p yyyy
輸入搬瓦工提供的登陸密碼以後,順利登入。
可是若是每次登陸服務器都要輸入一遍那亂碼般的密碼,是很痛苦的一件事,因此果斷使用ssh-key來實現免密登陸。
第一步,生成祕鑰(若是本機已存在可省略這一步)
ssh-keygen -t rsa
按照提示選擇祕鑰所存放的目錄(~/.ssh/
),密碼留空,最後能夠在設定的目錄裏找到生成的祕鑰:
第二步,上傳祕鑰到服務器
ssh-copy-id root@xxx.xxx.xxx -p yyyy
而後按照提示輸入一遍密碼就能夠了。之後想要登陸服務器就能夠直接免密登陸啦!
作完剛纔的「分支任務」,回到咱們配置Nginx的主線。
按照Nginx官網的文檔,在CentOS中安裝Nginx是很是簡單的:
yum install -y nginx
可是在實際操做中,卻發現一直提示No package nginx available
。搜了一圈,Stack Overflow裏面的回答都是由於可能沒有安裝epel
,因而立刻嘗試之:
yum install -y epel-release
奇怪的是,運行結果提示epel已經存在,爲nothing to do。而後當我嘗試安裝nginx的時候,發現仍是no package nginx available。嘗試列出yum全部的源,發現根本沒有epel源:
yum repolist 源標識 源名稱 狀態 base/7/x86_64 CentOS-7 - Base 9,590+1 extras/7/x86_64 CentOS-7 - Extras 388 updates/7/x86_64 CentOS-7 - Updates 1,922+7
後來通過一番折騰,才找到解決辦法:
# 首先進入/yum.repos.d目錄 cd /etc/yum.repos.d # 而後編輯epel.repo文件 vi epel.repo [epel] name=Extra Packages for Enterprise Linux 7 - $basearch #baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch failovermethod=priority enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 [epel-debuginfo] name=Extra Packages for Enterprise Linux 7 - $basearch - Debug #baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 gpgcheck=1 [epel-source] name=Extra Packages for Enterprise Linux 7 - $basearch - Source #baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 gpgcheck=1
能夠看到,[epel]
和[epel-source]
裏面的enabled
都是0,解決辦法就在這裏,只要把0改爲1,保存退出後便可。
如今咱們從新運行yum repolist
,會發現epel源已經被加上了:
源標識 源名稱 狀態 base/7/x86_64 CentOS-7 - Base 9,590+1 elrepo-kernel ELRepo.org Community Enterprise Linux Kernel Repository - el7 37 epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 12,277 epel-source/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 - Source 0 extras/7/x86_64 CentOS-7 - Extras 388 nodesource/x86_64 Node.js Packages for Enterprise Linux 7 - x86_64 22 updates/7/x86_64 CentOS-7 - Updates 1,922+7 repolist: 24,236
再執行yum install -y nginx
,發現終於可以成功安裝了!
nginx version: nginx/1.12.2
接下來只要用一條指令便可開啓nginx:
nginx
通過上面的一番折騰,域名的DNS解析早已生效了,此時輸入域名並回車,就能看到nginx的歡迎頁啦~
看到左上角「不安全」三個字,內心是很是不爽的,因而立刻進行下一步工做,上HTTPS。
因爲是我的服務器,因此免費證書已經足夠了,另外爲了方便起見,因此我使用了certbot
這個工具來幫我把服務器升級成HTTPS。
首先經過yum下載安裝certbot
:
yum install certbot
因爲certbot服務器在驗證域名的時候,會經過HTTP的方式訪問一個由certbot生成的靜態文件,因此咱們首先要在nginx裏面進行配置:
進入/etc/nginx
,而後編輯nginx.conf
,在server
裏面添加下列兩個location規則:
location ^~ /.well-known/acme-challenge/ { default_type "text/plain"; root /usr/share/nginx/html; } location = /.well-known/acme-challenge/ { return 404; }
能夠看到,上面的root
我是指向了/usr/share/nginx/htm
,這個目錄是能夠隨便指定的,我這麼寫徹底是爲了偷懶。
nginx配置好了之後,就可使用certbot生成證書了:
# certbot certonly --webroot -w <root url> -d <hostname> certbot certonly --webroot -w /usr/share/nginx/html/ -d xxxx.com
若是看到下列的輸出,就證實證書已經生成成功了:
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/xxxx.com/fullchain.pem. Your cert will expire on 20XX-09-23. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
證書已經準備好了,咱們還須要nginx的支持。從新打開/etc/nginx/nginx.conf
,而後把註釋掉的https server給註釋回來:
server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name xxxx.com; root /home/www; ssl_certificate "/etc/letsencrypt/live/xxxx.com/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/xxxx.com/privkey.pem"; ssl_trusted_certificate /etc/letsencrypt/live/xxxx.com/chain.pem; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
ps: 上面的root我給配置了/home/www
目錄,意味着之後只要是放在該目錄下的靜態資源文件夾,我均可以經過https://xxx.com/文件夾名
直接進行訪問,更多關於nginx的配置請參考官方文檔。
最後重啓一下nginx,就能夠檢驗咱們的頁面是否已經打上小綠標了:
nginx -s reload
因爲certbot所使用的letsencrypt證書只有90天的有效期,因此咱們須要對它按期自動更新。
首先模擬更新:
sudo certbot renew --dry-run # 看到以下輸出證實模擬更新成功 ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/your.domain.com.conf ------------------------------------------------------------------------------- ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/xxxx.com/fullchain.pem (success) ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates above have not been saved.)
而後就可使用crontab -e
命令來實現自動化了:
sudo crontab -e #添加配置,每週一半夜3點00分執行renew: 00 3 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
服務器已經準備了,HTTPS也弄好了,那麼接下來就能夠部署咱們的靜態頁面與nodejs項目了。
從前面的nginx配置能夠知道,nginx對於域名爲xxxx.com
的請求,都會請求到/home/www
目錄下,因此咱們經過git或者scp等方式把靜態資源目放置在/home/www
目錄下便可。比方說個人markcook項目:
cd /home/www git clone https://github.com/jrainlau/markcook -b gh-pages
此時訪問 https://jrainlau.com/markcook 便可訪問到項目的頁面。
對於nodejs項目,咱們使用pm2
來守護進程,讓項目在後臺運行。首先須要安裝nodejs,而後再安裝pm2:
curl -sL https://rpm.nodesource.com/setup_9.x | bash - yum install nodejs npm i pm2 -g
接下來依然把nodejs項目經過git放置在/home/www
目錄下,進入目錄,執行下列命令:
npm i pm2 start index.js --name my-server ┌─────────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐ │ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │ ├─────────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤ │ my-server │ 0 │ fork │ 2306 │ online │ 22 │ 7h │ 0% │ 46.2 MB │ root │ disabled │ └─────────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘ Use `pm2 show <id|name>` to get more details about an app
最後在nginx.conf
裏面添加一條代理規則(假設node服務端口爲3000):
location /my-server/ { proxy_pass http://localhost:3000 }
這樣,就可以經過https://xxxx.com/my-server/
訪問到nodejs項目了。
剛纔的操做僅僅是做爲初次部署,若是之後代碼有改動,還須要咱們登陸服務器,進入到對應的項目目錄,手動執行git pull
,而後手動重啓服務器(若是pm2啓動了watch模式能夠省略這一步),至關麻煩。能不能有一種辦法,可以在我提交代碼的時候就自動更新服務器的代碼,並自動重啓服務器呢?travis-ci
就是來實現這個目的的。
travis-ci支持公開項目和私有項目,是經過.org
和.com
後綴來區分的。以個人一個公開項目爲例,首先進入https://travis-ci.org/ 官網,登陸個人github帳號,而後會看到以下頁面:
找到須要集成travis-ci的項目,點擊它前面的開關便可。
此時在travis-ci上的操做暫時告一段落,可是頁面先別關掉,先放在一邊。
接下來,咱們回到本地開發機器,經過git clone
命令把這個項目克隆到本地,而後在項目根目錄下添加一個.travis.yml
文件。這個文件是travis-ci持續集成的關鍵,它定義了你全部持續集成的操做。爲了簡單起見,咱們僅僅使用它進行自動化部署:
language: node_js node_js: - 9.3.0 after_success: - ssh root@xxx.xxx.xxx.xxx -p yyy 'cd /home/www/taxi-server && git pull && pm2 restart taxi-server'
能夠看到,我給她定義了運行環境爲node.js 9.3.0
,在構建成功(其實啥也沒構建)以後,自動登陸服務器,拉取最新代碼,重啓pm2。
你們都知道,登陸服務器是要輸入密碼的,即便是travis-ci幫咱們自動化進行,這一步也免不了。可是因爲輸入密碼的步驟是交互的,自動化處理不了,因此咱們也要爲travis-ci搞一套「免密登陸」。通過上文ssh-key的配置,其實咱們已經具有了這一條件,之不過還須要多幾步的操做。
在本地經過gem
安裝travis
命令行工具(macOS默認支持ruby):
gem install travis
使用travis登陸:
travis login
而後輸入github的帳號密碼便可。
加密本地ssh-key並自動寫入.travis.yml
:
# --add參數表示自動添加腳本到.travis.yml文件中 travis encrypt-file ~/.ssh/id_rsa --add
這時會看到.travis.yml
多了一段before_install
的內容:
before_install: - openssl aes-256-cbc -K $encrypted_e65149523857_key -iv $encrypted_e65149523857_iv -in id_rsa.enc -out ~\/.ssh/id_rsa -d
而後把最後一行的「\
」轉義符刪掉,並換行頂格添加以下兩條內容:
- chmod 600 ~/.ssh/id_rsa - echo -e "Host xxx.xxx.xxx.xxx\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
切記把xxx.xxx.xxx.xxx
換成你服務器的IP。
最後把添加.travis.yml
的項目push到github便可。
從新回到travis-ci.org的頁面,進入項目,就可以看到持續集成的效果了:
這時候回到服務器,運行pm2 logs
,會看到服務已經被自動重啓的日誌記錄,至此持續集成及部署功能完美成功!
這一番折騰下來,總算把服務器、建站、持續部署等知識囫圇摸了一遍,對這些技術棧也算有了一些粗淺的看法。接下來還有更多好玩的東西須要進行探索,畢竟這只是一個開始,你們一塊兒共勉吧~