接著昨天的進度,繼續(xù)梳理思路剖煌。運維工作對我而言是陌生領域材鹦,涉及太多的配置工作,除了按手冊進行配置耕姊,還要把每個配置的意義搞清楚桶唐,如果做不到了然于胸,運維就要冒很大風險茉兰,不知道哪里埋的坑將來會突然蹦出來尤泽,到時候就更難解決。所以每天梳理進度時规脸,發(fā)現(xiàn)如果按探明的路線來走坯约,也就幾分鐘的事情,但探索出這條路卻要走很多彎路莫鸭。
昨天已經(jīng)完成了django的uwsgi托管闹丐,今天是探索vue的nginx托管。這其中會涉及一些ubuntu的常用指令被因、全局變量配置卿拴、nginx服務器的配置衫仑、nodejs的安裝和配置、FTP服務器的安裝和配置堕花、nginx反向代理的實現(xiàn)文狱。
昨天安裝了nginx,今天重啟電腦后發(fā)現(xiàn)nginx已經(jīng)默認隨系統(tǒng)啟動缘挽,由于需要修改nginx的端口分配瞄崇,修改后重啟nginx才能生效,想到的最粗暴方式就是查看nginx當前占用的端口進程壕曼,sudo lsof -i:9999苏研,這個9999端口是我昨天配置的,查出來占用這個端口的進程PID窝稿,通過sudo kill -9 PID殺掉楣富。這里有兩個需要注意的地方,lsof查看端口進程時伴榔,由于nginx是隨系統(tǒng)啟動的守護進程纹蝴,需要在root權限下才可查看到,當前用戶權限是查不出結果的踪少。第二個需要記住的就是這個kill指令塘安,以后應該會常用。kill指令不加-9參數(shù)時援奢,默認是-15兼犯,屬于正常關閉,被通知關閉的進程會自行做一些善后處理集漾;但對于系統(tǒng)的后臺進程切黔、守護進程,這樣的柔性關閉是會被忽略的具篇,通過添加-9參數(shù)纬霞,可以強制關閉,被關閉的進程沒有善后余地驱显,類似于windows任務管理器中的結束進程诗芜。當然,除了這么粗暴的方式埃疫,肯定有更優(yōu)雅的方式伏恐。nigix程序接受以下四種常用參數(shù)。不附加任何參數(shù)栓霜,則是啟動服務器翠桦。
sudo nginx -s reload #重啟
sudo nginx -s stop #關停
sudo nginx -t #測試配置文件語法
sudo nginx -v #查看nginx版本號
安裝vue需要先安裝npm,安裝npm需要先安裝nodejs胳蛮,npm是nodejs的package manager秤掌,類似于ubuntu的apt愁铺、python的pip,這些都是好東西啊闻鉴。通過apt安裝的nodejs版本比較低,若想通過apt安裝高版本的nodejs茂洒,需要手工修改apt源孟岛,很劃不來的感覺。那就直接到nodejs的官網(wǎng)下載最新的LST版本督勺。為什么對nodejs版本有要求呢渠羞?因為10.0之前的版本都沒有自帶npm,安裝nodejs后還需要手工再安裝配置npm智哀,10.0之后的版本都自帶了npm次询。打開下載頁https://nodejs.org/en,網(wǎng)站自動檢測到我的操作系統(tǒng)型號瓷叫,直接推給我適合的程序包屯吊。下載解壓后,將文件夾移動到/usr/local/node目錄下摹菠,因為既要移動又要修改文件夾名盒卸,ubuntu的圖形化操作不如windows方便,那就用終端的mv指令吧次氨,在下載目錄中右擊打開終端蔽介,sudo mv nodejs14.x.x /usr/local/node,移動和改名一次性完成煮寡。接下來的問題是如何讓這個node可以被全局調用呢虹蓄?跟windows一樣,需要配置環(huán)境變量幸撕。我們只需要配置用戶環(huán)境變量就可以薇组,沒必要配置系統(tǒng)環(huán)境變量。用戶環(huán)境變量在~/.bashrc文件中杈帐,波浪線~表示用戶目錄体箕,相當于windows系統(tǒng)里的my document,在終端中輸入echo ~可以看到是/home/xx挑童。關于這個波浪線累铅,得補充一句,這個只是bash shell(也就是現(xiàn)在用的這個終端)簡寫用戶目錄的符號站叼,在其他配置文件中可不能使用娃兽,比如在nginx配置文件中,如果使用這個波浪線來指定網(wǎng)站目錄尽楔,nginx不能理解投储,這也是理所當然的第练,nginx發(fā)布的網(wǎng)站總不能因為登錄用戶的不同而改變網(wǎng)站目錄吧÷贶瘢回到配置環(huán)境變量娇掏,打開~/.bashrc,這是個只讀文件勋眯,需要動用root權限婴梧,那就在終端中sudo gedit ~/.bashrc,輸入密碼客蹋,以可編輯方式打開了塞蹭。在文末添加如下兩句:
export NODE=/usr/local/node
export PATH=$NODE/bin:$PATH
保存后,在終端中輸入source ~/.bashrc讶坯,加載修改后的環(huán)境變量番电。你可以在終端中輸入echo $PATH看一下輸出結果,是不是node的bin地址已經(jīng)被加載到環(huán)境變量中了辆琅。注意是大寫字母PATH漱办,大小寫敏感。其實我們打開/usr/local/node/bin目錄看一下涎跨,里面有node程序文件洼冻,還有指向npm的link,所以配置了這個bin目錄到環(huán)境變量隅很,就可以到處npm了撞牢,爽不爽?還不是很爽叔营,因為npm用的是境外源屋彪,跨海光纖加GFW(長城防火墻)速度很慢連接也不穩(wěn)定。那就換用國內的唄绒尊,國內的叫cnpm畜挥,npm此生唯一用途就是來裝一個自己的替代品npm install -g cnpm。怕慢婴谱,那就在后面再加個參數(shù)蟹但,--registry=https://registry.npm.taoboa.org,這個是淘寶源谭羔,速度如飛华糖。這里稍微展開一下npm的幾個參數(shù),-g是全局安裝的意思瘟裸,其不在具體項目的node_modules目錄中保存模塊客叉,模塊依賴關系也不寫入項目的package.json中的dependencies屬性中。當換成--save開關參數(shù)時,模塊會安裝在項目的node_modules目錄中兼搏,且會在dependencies中添加依賴關系卵慰,將來build項目時,會與項目一同打包發(fā)布佛呻。還有一種是--save-dev開關參數(shù)裳朋,因為有些依賴包僅僅在開發(fā)時會使用,比如gulp用于壓縮css吓著、js模塊再扭,正式部署時不需要,通過這個開關參數(shù)安裝的包會出現(xiàn)在項目的node_modules目錄中夜矗,但不會添加項目依賴項,在npm install -production時不會打包到發(fā)布文件中让虐。記住一個原則就很簡單紊撕,項目發(fā)布后要用的包,用--save赡突,僅項目開發(fā)過程中需要用的包对扶,用--save-dev,不是某個項目使用惭缰,而是全局調用的(如腳手架工具)浪南,那就-g。
有了cnpm漱受,一切就變得容易络凿。首先安裝vue的腳手架工具cnmp install -g vue-cli,為什么cnpm也能全局使用呢昂羡?好奇的你可以打開/usr/local/node/bin目錄看一下絮记,是不是cnpm的link赫然在列,驚不驚喜意不意外虐先。當然這個腳手架也需要全局使用怨愤,所以也是-g開關。安裝好了vue-cli蛹批,再到剛才那個目錄看一下撰洗,是不是又驚喜地發(fā)現(xiàn)指向vue的link也在安裝腳手架時自動創(chuàng)建好了,這意味著vue也可以全局調用了腐芍。誰說linux不人性化差导,越用越覺得體貼。在終端里大膽地輸入vue -V甸赃,可以看到vue的版本號了吧柿汛,不僅要大膽,V還要記得大寫。
切換到想要創(chuàng)建vue項目的目錄络断,終端里輸入vue init webpack vuetest裁替,vue腳手架工具幫我們自動創(chuàng)建了一個叫vuetest的初始項目目錄結構,cd進入vuetest貌笨,cnpm install弱判,安裝項目以來的模塊,這個helloword項目就可以測試運行锥惋。輸入npm run dev昌腰,通過瀏覽器訪問localhost:8080就可以看到vue的歡迎頁。如果想通過IP地址訪問膀跌,需要修改config/index.js文件中的host:"0.0.0.0"遭商,重新npm run dev,試試IP地址訪問捅伤。
unbunt中安裝免費的webstrom需要申請學生或者教師許可(其他方法我真的不懂)劫流,那就用微軟的vscode吧,配合vuter插件對vue開發(fā)也很友好丛忆。vscode在ubuntu的程序商店中就有祠汇,免費的,安裝也很快熄诡。安裝好后可很,打開剛才那個vuetest目錄,作為一個vscode項目凰浮,點擊左側Extension按鈕我抠,搜索Vuter,安裝這個插件导坟,vue的語法就能被vscode識別和智能補齊了屿良。當然,和webstrom一樣惫周,vscode也可以在底部調試窗口旁邊打開一個terminal終端尘惧,很多工作在這個終端中一樣完成,沒必要勞師動眾打開系統(tǒng)終端了递递。
vue能使用npm運行了喷橙,那怎么托管到nginx上呢?在vscode剛才介紹的那個terminal中登舞,輸入npm run build贰逾,npm就開始對vue項目進行打包發(fā)布,發(fā)布后的文件在dist文件夾中(這里用npm和cnpm是一樣的菠秒,因為不需要用網(wǎng)絡去下載模塊)疙剑。接下來只需要修改nginx配置文件氯迂,將這個dist目錄作為網(wǎng)站目錄即可。
nginx的配置文件在/etc/nginx/目錄下言缤,主配置文件叫nginx.conf嚼蚀,這個文件會加載sites-enabled目錄下的default配置文件。管理端口管挟、代理轉發(fā)轿曙、虛擬目錄等都是在這個default文件中配置。內容如下僻孝,其中有幾點一解釋就很清楚明了导帝。首先要理解一點,同一個端口穿铆,可以開多個server您单,通過域名來定向server。比如我申請了www.a.com荞雏,www.b.com睹限,www.c.com三個域名,都指向我服務器的IP:80端口讯檐,而不同的域名將會處理不同的業(yè)務,就可以通過配置文件中的server_name進行區(qū)分染服。但偏偏有人不通過域名别洪,而通過ip地址或者其他還未綁定業(yè)務的域名(域名指向了我的IP,但我還沒為這個域名配置server)柳刮,那所有這類訪問會被nginx泛解析挖垛,如果不配置default_server,則會用第一個server處理這類請求秉颗。當然痢毒,如果存在多個類似default這樣的配置文件時,運維可能也搞不清楚到底哪個server會被第一個加載蚕甥,這時就可以通過添加default_server這個參數(shù)來指定處理這類泛解析的請求哪替,
如下面第一個server,顯式指定了default_server菇怀。有人看到[::]:80這個可能會有疑問凭舶,這個是IPv6的表示而已。這第一個server配置的server_name為_爱沟,只是表示與業(yè)務域名無關的名字帅霜,隨便取一個,大家都用_那就用_呼伸,沒有什么神秘之處身冀。
第二個server,同樣監(jiān)聽80端口,但server_name就是IP地址了搂根,所以只有通過IP地址的方式訪問80端口珍促,才會打開配置在這個server上的網(wǎng)站(根目錄設置為vue剛才生成的dist目錄,這樣vue就發(fā)布到nginx上了)兄墅。location參數(shù)里寫了三個:try_files $uri $uri/=404踢星,這表示首先以文件形式處理請求,如果不存在這個文件隙咸,則以url的方式處理沐悦,如果url也解析不到,那就返回404頁面五督。
第三個server就是昨天日志里所說的多做的一半無用功藏否,用nginx代理轉發(fā)8080端口的請求到uwsgi所在的8888端口。其實配置vue的ajax跨域代理轉發(fā)跟這個方法類似充包,都是在location中添加映射副签,只不過是對vue所在server下的某個alias進行端口映射,具體以后再說基矮。補充一點淆储,如果這里開啟了這個代理轉發(fā),那uwsgi配置文件中就不能用http監(jiān)聽家浇,而應該改為socket監(jiān)聽本砰,否則瀏覽器訪問8080端口時會出現(xiàn)gateway錯誤。
今天最后還配置了ubuntu的vsftpd钢悲,方便與windows下的開發(fā)環(huán)境同步項目点额。跨過下面這段配置文件再看莺琳。
server{
listen 80 default_server;?
listen [::]:80 default_server;
server_name _;
return 403;
}
server{
listen 80;
server_name 192.168.31.111;
root /home/wu/VSCodeProjects/vuetest/dist;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
server{
listen 8080;
server_name 127.0.0.1;
charset UTF-8;
access_log /var/log/nginx/django_access.log;
error_log /var/log/nginx/django_error.log;
client_max_body_size 75M;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8888;
uwsgi_read_timeout 2;
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /home/wu/PycharmProjects/testweb/static;
}
}
linux下的ftp服務器軟件vsftpd算比較常見还棱,此外還有proftpd+gadmin-proftpd的組合套件,可以圖形化的配置ftp惭等,但這么小的一個東西珍手,沒必要搞組合套件,直接vsftpd吧辞做。
sudo apt install vsftpd珠十,安裝好后打開它的配置文件,又要摸索一番配置方法凭豪。配置文件在/etc/vsftpd.config中焙蹭。是不是經(jīng)常看到etc這個目錄嫂伞,etc就是英文其他的縮寫孔厉,Unix時代本來是用來存放一些雜七雜八的其他的東西拯钻,現(xiàn)在發(fā)展為存放各種配置文件。因為這個ftp是給開發(fā)使用撰豺,不需要配置匿名用戶粪般,也不需要配置其他用戶,直接用可以登錄ubuntu系統(tǒng)的本地用戶就可以污桦。所以在配置文件第一行就將匿名用戶關閉亩歹。其他都有詳細注釋,一看就懂凡橱,唯一是加粗傾斜的三個參數(shù)需要解釋一下:allow_writeable_chroot小作、chroot_list_enable、chroot_list_file稼钩。
allow_writeabl_chroot=YES時顾稀,將用戶在ftp登錄時的根路徑鎖定到用戶在ubuntu中的~目錄(還記得波浪線~的意思不,回第一段復習)坝撑。這樣可以避免ftp能操作到ubuntu系統(tǒng)的root目錄静秆。后面兩個參數(shù)時配合這個參數(shù)一起使用的,chroot_list_enable表示是否有例外的用戶巡李,比如ubuntu有好幾個用戶抚笔,其中有一個超級用戶需要通過ftp訪問到~目錄以上的目錄,那就可以給他配置一個例外侨拦,將chroot_list_enable=YES塔沃,nginx就會加載chroot_list_file指定的文件,這個文件中寫上這個超級用戶的用戶名就可以了阳谍。如果chroot_list_enable=YES開啟后,chroot_list_file指定的文件并不存在螃概,那nginx會在啟動時就報錯無法啟動矫夯。既然是例外,那聰明的小伙伴可能已經(jīng)想到吊洼,如果allow_writeabl_chroot=NO训貌,即不把用戶限制到~目錄,所有用戶都能通過ftp訪問到~以上的所有目錄冒窍,那這個例外是不是又指其他意思了递沪。對的,其實就是一個取反的作用综液,所有人都有權限時款慨,可以通過這個chroot_list_enable=YES,加載chroot_list_file谬莹,這個file中指定的用戶就只能訪問~以下的目錄檩奠。細品就能理解了桩了。
anonymous_enable=NO????#接受匿名用戶
local_enable=YES????????????#接受本地用戶
write_enable=YES
local_umask=022????????????#本地用戶上傳文件的umask(umask是文件權限,022是最高權限)
xferlog_enable=YES????????#使用上傳/下載日志,日志文件默認為/var/log/vsftpd.log,可以通過xferlog_file選項修改
xferlog_std_format=YES????#日志使用標準xferlog格式
ftpd_banner=Welcome to my FTP.????#login時的歡迎信息
#local_root=/home/wu????????#本地用戶login后所在目錄,若沒有設置此項,則本地用戶login后將在他的home目錄中
chroot_local_user=YES????????#用戶被限制home目錄
allow_writeable_chroot=YES????#vsftpd增強了安全檢查埠戳,用戶被限定在主目錄井誉,則默認主目錄不能具有寫權限.如果檢查發(fā)現(xiàn)還有寫權限,就會報錯誤,整胃。
chroot_list_enable=NO????#chroot_list_file生效,且存放限制home目錄訪問的用戶(為空會報錯)
#chroot_list_file=/etc/vsftpd/chroot_list????#若設置為YES則記錄在userlist_file選項指定文件(默認是/etc/vsftpd.user_list)中的用戶將無法login,并且將檢察下面的userlist_deny選項
listen=YES????#服務器以standalong模式運行,這樣可以進行下面的控制
local_max_rate=512000????#本地用戶的傳輸比率(b/s)
max_clients=100????#可接受的最大client數(shù)目
max_per_ip=10????#每個ip的最大client數(shù)目
connect_from_port_20=YES
tcp_wrappers=YES
pam_service_name=vsftpd