做爲小做坊,以前先後端的服務所有一股腦的在一個服務器,javascript
隨着業務多了些,前端這塊終於扔出來了(獨立),雖然只有雙核2M帶寬;css
須要部署的有這麼幾個,包括測試線及正式線(以下):html
PC官網(Angular6
)/管理後臺(umi+react
)/移動端分享(Nuxt
)/APP內嵌頁(Nuxt
)前端
隨手記,有興趣的看看,也許能夠幫你省點時間..java
雜七雜八的知識點,linux
的一些東東shell ,chmod,chgrp ,chown
以及基礎運維的一些知識node
nginx
的一些東東,比較現代化的配置(不考慮IE11如下的);react
pm2
及node
什麼的一些東東linux
Centos 7.4
,到手後麻溜升級到最新的# 查看版本號
cat /etc/redhat-release
# 更新
yum update
# 重啓
reboot
# 適用於非跨版本大版本的(好比7.x的升級..跨版本的此法子不必定適用)
# 也不建議服務器忽然跨大版本升級,新機子就直接上新的,反正所有從新部署的
# 大版本的升級, 注意作好對應的防範措施,避免正式線直接GG,有主從的好一點,能夠在從服務器搞了再同步過去
cat /etc/redhat-release # CentOS Linux release 7.6.1810 (Core)
複製代碼
node
版本選用的是非LTS
版本,而是current
快速迭代版本(11.x)官方wiki
已經提供: github.com/nodesource/…nginx
gcc
,make
依賴)yum install gcc-c++ make
複製代碼
否則有些依賴編譯的會報這個錯,好比我在部署nuxt
的時候遇到的c++
yarn
,用起來比較舒服的包管理器(官方源)# centos
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo yum install yarn
複製代碼
nginx
,選用的是lts(1.14.2)
nginx 官方文檔給出了源,本身造,vim編寫下便可
最新LTS的更新日誌: nginx.org/en/CHANGES-…
git
,官網源碼安裝源碼包: mirrors.edge.kernel.org/pub/softwar…
# 2.x.x 是你選擇版本(下載那個)
$ tar -zxf git-2.x.x.tar.gz
$ cd git-2.x.x
$ make configure # 編譯
$ ./configure --prefix=/usr # 指定安裝位置(--prefix)
$ make all doc info
$ sudo make install install-doc install-html install-info
# 走完這一些基本正常安裝(無報錯的狀況,不然缺啥補啥)
複製代碼
固然也能夠直接用yum
安裝系統上游倉的git
,只不過版本比較老
還有第三方源也是一個可選的(安全隱患本身承擔)
安裝好nginx以後,默認的經常使用有這麼幾個:
html(/usr/share/nginx/html)
: 存放網頁的地方conf(/etc/nginx/conf.d/)
: 此目錄下的conf
文件會追加到nginx.conf
中,具體看nginx.conf
用到了include
logs(/var/logs/nginx)
: nginx
默認日誌的存放位置好比include
你本身也能夠指定,配置文件要抽離的多細緻都行
我用的最新的lts
,初始化的nginx.conf
大致是這樣的,有些是我本身加進去的
騰訊雲有對應的nginx
中文手冊
注意點
最新版默認的執行用戶是nginx
, 有些版本的是www-data
;
因此你的代碼區域,不放在默認nginx
默認路徑的話,記得修正好權限,切莫放在root
家目錄下;
不然你必須讓nginx
超管權限(加入對應的用戶組),且更改該目錄所屬,
比較合理作法是咱們把代碼目錄存放到根目錄下,新建一個文件夾存放;
# 修正該目錄的所屬
# 意思就是遞歸該目錄的擁有者爲nginx,用戶組爲nginx, chown(change owner)
chown -R nginx:nginx /code
# 也能用chgrp來修改用戶組(change group)
而後給該目下添加對應的文件權限,咱們給他755
chmod -R 755 /code
`755 : rwx-rx-rX => u(user)-g(group)-o(other) => r(read[讀]:4)-x(excute[執行]:1)-w(write[寫]:2)`
# 查詢機子的一些信息,好比cpu ,內存這些,能夠進到 /proc目錄查看
#好比/proc/cpuinfo(cpu信息) ,meminfo(內存信息)等
複製代碼
nginx最經常使用的命令
nginx -t
: 測試nginx
配置文件是否正常,若錯誤會直接拋出,切忌改動配置文件後直接重啓服務!校驗是惟一的真理nginx -s reload
: 重載配置文件,無需重啓nginx
服務,變更nginx
配置能夠直接用這個直接生效,不宕機nginx.conf
# 使用用戶
user nginx;
worker_processes auto; # 進程數,自動就能夠
worker_rlimit_nofile 65535; # worker進程的最大打開文件數限制
events { # 處理連接的額外參數,如名事件
multi_accept on; # 容許儘量多的鏈接接入
use epoll; # 輪詢方案
worker_connections 65535; # 最大的鏈接數
}
# 錯誤日誌存放
error_log /var/log/nginx/error.log warn;
# pid(process id), 更多的用於linux操做進程的時候用到,該pid表明nginx實例
pid /var/run/nginx.pid;
http {
charset utf-8; # 默認字符集
sendfile on; # 提升靜態資源的託管效率
tcp_nopush on; # 只有sendfile 開啓的狀況下,纔會生效,累計包達到必定數量或大小纔會發出,下降開銷
tcp_nodelay on; # 儘快發送數據,只會針對處於 keep-alive 狀態的 TCP 鏈接纔會啓用 tcp_nodelay
server_tokens off; # 安全隱患規避,隱藏請求頭nginx版本
log_not_found off; # 不存在部分資源的時候記錄到日誌,好比favico
types_hash_max_size 2048; # 內存換效率,檢索依賴
client_max_body_size 16M; # 容許客戶端傳送body的最大值(看大家上傳文件調整)
include /etc/nginx/mime.types; # 一個映射表,就是資源的mime表,就是容許的資源類型
default_type application/octet-stream; # nginx 默認傳送格式
# 日誌格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 訪問日誌
access_log /var/log/nginx/access.log main;
# SSL
ssl_session_timeout 1d; # 客戶端會話中ssl憑證的有效期,自行看着調整
ssl_session_cache shared:SSL:50m; #ssl/tls會話緩存的類型和大小,官網上說1M能夠存放約4000個sessions
ssl_session_tickets off; # 關閉會話憑證複用
# 啓用TLS1.2及加密方式
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;
ssl_prefer_server_ciphers on; # 優先使用服務端的加密算法而非客戶端的
# 啓用證書狀態在線校驗
ssl_stapling on;
ssl_stapling_verify on;
# 啓動上面的須要有DNS解析服務器,最安全的是本身本地跑一個DNS服務器.不然用第三方的
resolver 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
resolver_timeout 2s;
# 請求超時時長
keepalive_timeout 65;
#默認根配置不作壓縮(這裏會面向全局)
# 咱們到項目級別作,好比測試線的不須要怎麼壓縮,正式線壓縮到必定程度
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
複製代碼
拿我手頭的一個nuxt
和一個常規打包項目
react
or ng6
build
出來一個dist
這類**server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name proadmin.xxxx.com;
root /code/react-sx-admin/prod;
# SSL證書路徑
ssl_certificate /etc/nginx/conf.d/cert/proadmin/proadmin.crt;
ssl_certificate_key /etc/nginx/conf.d/cert/proadmin/proadmin.key;
ssl_trusted_certificate /etc/nginx/conf.d/cert/proadmin/proadmin.crt;
# SPA啓用了history模式,必須作一個首頁尋址,否則會找不到的
location / {
try_files $uri $uri/ /index.html;
}
# 拒絕訪問
location ~ /\.(?!well-known) {
deny all;
}
# 緩存如下類型的靜態資源
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
expires 7d;
access_log off;
}
# 容許字符svg這些的訪問,且緩存
location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
add_header Access-Control-Allow-Origin "*";
expires 7d;
access_log off;
}
# gzip 壓縮配置
gzip on;
gzip_vary on;
# 無條件啓用壓縮,支持局部壓縮(就是檢測部分請求頭)
gzip_proxied any;
# 壓縮等級,吃硬件
gzip_comp_level 6;
# 處理的文件類型
gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
}
# http這塊咱們直接重定向到https
server {
listen 80;
listen [::]:80; # 雙冒號是全域
server_name proadmin.xxx.com;
location / {
#域名也能夠用 $host來替代(內置變量)
return 301 https://proadmin.xxx.com$request_uri;
}
}
複製代碼
nuxt
反向代理 : 這種更多的適用於服務的,好比node
帶動的及其餘能夠提供服務的
# 這段是nuxt官方文檔推薦的寫法 ,響應的內容及過時時間
# https://zh.nuxtjs.org/faq/nginx-proxy/
map $sent_http_content_type $expires {
"text/html" epoch; # epoch是1970開始的時間
"text/html; charset=utf-8" epoch;
default off;
}
server {
listen 80;
server_name proshare.xxx.com;
# Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name proshare.xxx.com;
gzip on;
gzip_types text/plain application/xml text/css application/javascript;
gzip_min_length 1000;
location / {
expires $expires;
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_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 1m;
proxy_connect_timeout 1m;
proxy_pass http://127.0.0.1:5555;
}
location ~ /\.ht {
deny all;
}
ssl_certificate /etc/nginx/conf.d/cert/proshare/proshare.crt;
ssl_certificate_key /etc/nginx/conf.d/cert/proshare/proshare.key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
}
複製代碼
服務器不可能不宕機的,宕機重啓狀況下,必要的服務必須從新啓用
用systenctl
維護就好,systemctl enable nginx
;
非yum
安裝的nginx,要用這個維護,自行寫一個systemctl
規範的服務;
而後chmod 754
這個腳本,放到/usr/lib/systemd/system
,便可用systemctl
維護;
754 : rwx-rx-r => u-g-o => r(read[讀]:4)-x(excute[執行]:1)-w(write[寫]:2)
nginx service
的寫法# /usr/lib/systemd/system/nginx.service
# 除了一些字段有比較多的參數,大致上均可以一目瞭然
# 服務描述, 文檔路徑,服務類型,執行路徑,重載路徑以及進程PID這些
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
複製代碼
pm2
發展至今,最新版的功能都比較完善了,是有內置自啓動機制的;
會識別linux
的自啓動機制,好比發現咱們用的是systemctl
就會生成一份nginx.service
的服務描述文件
pm2 start [services]
: 啓動你的服務pm2 list
: 看看服務是否正常運行pm2 save
: 保存當前正在運行的任務node
的用pm2
的deploy
(經過ssh
發佈到遠端)記得配置公鑰配對(遠程倉用git ssh
模式),否則無法初始化的,好比Coding
的
由於有測試下和正式線,因此我把配置寫成兩個,又爲了減小敲打的代碼,我寫了一堆alias
# 這些命令是啥?
# 看pm2文檔 : https://pm2.io/doc/en/runtime/guide/easy-deploy-with-ssh/?utm_source=pm2&utm_medium=website&utm_campaign=rebranding
# 函數
# 爲何兩個佔位符都是$1, 我不想寫太多,就部署名字和配置文件一致,只有dev和prod模式
pm2init(){
pm2 deploy ./ecosystem.$1.config.js $1 setup;
pm2 deploy ./ecosystem.$1.config.js $1;
}
pm2up(){
pm2 deploy ./ecosystem.$1.config.js $1 update;
}
pm2rev(){
pm2 deploy ./ecosystem.$1.config.js $1 revert;
}
#pm2
alias pm2init=pm2init
alias pm2up=pm2up
alias pm2rev=pm2rev
# 用法就是
# pm2init depoly_name => pm2init dev
複製代碼
module.exports = {
apps: [
{
name: 'stag-sx-share',
script: 'npm',
args: 'run start',
watch: ['.nuxt'], // 監控輸出目錄
watch_options: {
usePolling: true
},
env: {
HOST: '0.0.0.0',
PORT: 3333,
NODE_ENV: 'development'
},
env_production: {
NODE_ENV: 'production',
HOST: '0.0.0.0',
PORT: 3333
},
output: './logs/console.log',
error: './logs/consoleError.log',
merge_logs: true,
log_date_format: 'YYYY-MM-DD HH:mm Z'
}
],
deploy: {
dev: {
// SSH user
user: 'root',
// SSH host
host: ['xxxx'],
// SSH options with no command-line flag, see 'man ssh'
// can be either a single string or an array of strings
ssh_options: 'StrictHostKeyChecking=no',
// GIT remote/branch
ref: 'origin/master',
// GIT remote
repo: 'git@git.dev.tencent.com:lqh/nuxt-sx-mobile-share.git',
// path in the server
path: '/code/stag-nuxt-sx-share',
// Pre-setup command or path to a script on your local machine
'pre-setup': 'ls -la',
'pre-deploy': 'git pull',
// deploy hook
'post-deploy':
'npm install && pm2 reload ./ecosystem.dev.config.js --env production --force'
}
}
}
複製代碼
rsync
發佈就拿我寫的一條alias
來說解吧,仍是挺方便的;
# rsync 的幾個參數
# -r : 就是recursive,遞歸,必須的,你打包的文件不可能沒有子目錄吧!
# -c : 對文件進行校驗,必備的,穩一點總好
# -h : --human-readable 輸出傳送的數值變化比較符合人類閱讀的格式
# -v : 就是verbose, 就是進展過程
# --progress : 顯示傳輸文件的過程
# --delete : 從目標目錄刪除無關文件,就是不匹配的文件會被幹掉,多出來的!
alias fdumi="rsync -vrch --progress --delete /Users/linqunhe/Code/umi_dva_sx_admin/dist/* root@xxx.xxx.xxx:/code/umi-dva-sx-admin/dev"
複製代碼
不對之處請留言,會及時修正.謝謝閱讀