1.搭建一個適合于架構(gòu)師使用的開發(fā)與實現(xiàn)環(huán)境Linux
- 眾所周知彻坛,當(dāng)項目越來越大的時候炕淮,項目的設(shè)計也會越來越復(fù)雜咏瑟,一個線上運營的商業(yè)項目往往會涉及到多種編程語言與技術(shù)的使用矛双,比如php+nodejs扛施,ruby+nodejs鲫咽,java缺脉、python等上真。如果你覺得為這些不同種類的技術(shù)搭建環(huán)境就已經(jīng)夠頭痛了肚医,那么我想告訴你倚舀,還有更復(fù)雜的問題還在后頭,不同語言環(huán)境也是在不斷發(fā)展之中的忍宋,php從4.9到5.2再到7.0中間有著巨大的變化痕貌,代碼存在著大量的不兼容。
- java 1.x到j(luò)ava 6糠排、7 再到j(luò)ava8不止是語法上的變化舵稠,甚至連程序設(shè)計的思想與原則都發(fā)生了改變。類似的例子還有python和ruby入宦,這兩個語言在linux運維中使用非常廣泛哺徊,很多自動化運維腳本都是用python2.x與ruby1.x編寫的,然而現(xiàn)在社區(qū)中活躍的新版本確是python3.x和ruby2.x乾闰。大家不要覺得這些個語言與你們無關(guān)落追,很有可能你們在linux中使用的某些工具就是用老版本的python和ruby編寫的。
- 這么多的問題涯肩,是不是已經(jīng)讓大家頭大了呢轿钠?在大規(guī)模商業(yè)項目中,解決環(huán)境病苗、版本等問題其實有很成熟的解決方案疗垛。
現(xiàn)在的很多云計算廠商,利用虛擬化技術(shù)硫朦、容器技術(shù)贷腕,采用服務(wù)化方式進行開發(fā),比如現(xiàn)在流行的docker+微服務(wù)架構(gòu)就是其中的佼佼者咬展,關(guān)于更多容器技術(shù)與云計算的話題泽裳,我會在以后的活動中為大家分享。要完成這種規(guī)模的商業(yè)項目架構(gòu)設(shè)計破婆,架構(gòu)師常需要進行程序測試與驗證設(shè)計涮总,可要在筆記本上完成這樣的部署,無論是利用虛擬化技術(shù)(虛擬機)還是容器技術(shù)荠割,都顯得太重了妹卿,架構(gòu)師需要的應(yīng)該是一個全能的開發(fā)旺矾、部署與運維環(huán)境,環(huán)境需要與產(chǎn)品環(huán)境高度一致夺克,而且還應(yīng)該輕便箕宙,節(jié)省性能,方便管理铺纽。
那我們今天就來看一看柬帕,這樣的環(huán)境是如何搭建起來的
- 我們?nèi)绾巫屢慌_服務(wù)器同時支持多種不同的web服務(wù)器,比如如何同時讓我們的這臺測試機上面能跑起php狡门,nodejs陷寝,ruby on rails,如果有必要的話再加一個tomcat來跑jsp也是可以的其馏。
- 通常情況下凤跑,如果在一臺機器中啟動多個http服務(wù),我們必須給這些web服務(wù)分配不同的端口叛复,否則就會端口沖突仔引。然而標(biāo)準(zhǔn)的網(wǎng)頁服務(wù)走的是80端口,在瀏覽器中輸入一個網(wǎng)址褐奥,不指定端口號,這個請求就會發(fā)送到80端口咖耘。這樣說來,如果同時在多個端口開啟web服務(wù)基本不需要做太多額外的事情撬码,只要去各個服務(wù)器軟件中修改配置文件儿倒,把端口號調(diào)整為其它大于一千的端口且不重復(fù),這樣web服務(wù)就能跑起來了呜笑。
- 接著我們需要解決一個棘手的問題夫否,通常我們設(shè)計的restfulAPi接口以及默認(rèn)的用戶訪問,都是直接把http請求發(fā)送至80端口的蹈垢,80端口只有一個慷吊,自然是只能有一個程序去監(jiān)聽這個端口,不過這個解決起來也很簡單曹抬。之所以說這個最簡單,是因為很多http服務(wù)器程序都支持http代理功能急鳄。我們在這里即將介紹的是利用nginx反向代理實現(xiàn)多個web服務(wù)共享80端口谤民。
第一步,先讓nginx在80端口啟動疾宏,nginx啟動成功后再讓其它服務(wù)器在別的端口啟動服務(wù)张足。為了保險期間,自己可以先測試一下坎藐,各個服務(wù)在不同端口是否工作正常为牍。
然后我們就需要為各個服務(wù)創(chuàng)建虛擬主機哼绑,由于多個服務(wù)跑在一臺機器上,所以為了能有所區(qū)分碉咆,我們得給這些服務(wù)分別綁定不同域名抖韩,如果是在本機測試,域名綁定的工作可以選擇在自己筆記本的宿主機操作系統(tǒng)里面修改hosts文件疫铜。
-
這一步完成以后茂浮,我們在nginx的配置中增加虛擬主機配置,為了方便管理壳咕,每一個虛擬主機的配置最好是能有一個獨立的文件存放席揽。
下面是一個典型的虛擬主機反向代理配置:
server {
listen 80;
server_name test.ydma.cn;
location / {
proxy_set_header X-Rea $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://127.0.0.1:9001;
}
}
tip:如果是在ubuntu中,這個文件應(yīng)該放在/etc/nginx/sites-available里面谓厘,然后再通過ln -s 做一個軟連接放在sites-enabled文件夾中.之所以nginx能找到這個配置文件是因為在nginx.conf主配置文件中有這么兩行配置:
include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
我們可以看到上面的配置文件中 由nginx監(jiān)聽主機名為: server_name test.ydma.cn 幌羞, 端口號 listen 80; location設(shè)置為 proxy_pass http://127.0.0.1:9001; 也就是說把訪問test.ydma.cn:80的請求交給127.0.0.1的9001端口去處理: proxy_set_header的配置是為了將http請求的頭部信息做相應(yīng)的改寫。 如果沒有這些設(shè)置竟稳,轉(zhuǎn)發(fā)后的請求得到的請求信息就是nginx服務(wù)的信息新翎,而不是外部用戶的信息.
把這個文件復(fù)制幾份,只需要改寫server_name以及proxy_pass后的端口號住练,那么我們就可以讓nodes 地啰、ruby on rails 、apache讲逛、等多個web服務(wù)同時共用80端口跑起來了亏吝。多個web服務(wù)跑起來了,共用80端口了盏混,這樣服務(wù)與服務(wù)之間就可以通過標(biāo)準(zhǔn)的http協(xié)議做webservice調(diào)用了蔚鸥。
可現(xiàn)在還不是高興的時候,因為麻煩的還在后頭许赃,在項目開發(fā)過程中止喷,我們用到的各種工具和軟件,通常會有依賴混聊,比如hadoop弹谁,我們以hadoop2.x為例,它依賴jdk7句喜,我們制作的一款機器學(xué)習(xí)軟件大量使用java函數(shù)式編程预愤,需要jdk8,那么我們怎么樣解決這個問題呢?
通常做法是同時安裝兩個版本到不同路徑咳胃,
1. 比如/opt/java/jdk/1.7.x/目錄下安裝java7植康,/opt/java/jdk/1.8.x/下安裝java8
2. 然后可以在linux中配置用戶級別環(huán)境變量JAVA_HOME,通常環(huán)境變量應(yīng)該寫在文件 ~./bashrc 或者~/.bash_profile中
3. 然后再修改系統(tǒng)的PATH變量展懈,指向JAVA_HOME下的bin目錄销睁,
4. 這樣我希望用戶默認(rèn)環(huán)境下是java8那么我就把環(huán)境變量JAVA_HOME切換到j(luò)ava8的安裝目錄就可以了供璧,這樣我們自己寫的機器學(xué)習(xí)工具就能在我的用戶權(quán)限下跑起來了。如果我的機器學(xué)習(xí)程序需要訪問hadoop中的數(shù)據(jù)怎么辦冻记?hadoop2.x需要的是jdk7睡毒,而且要和我的java8程序一起在同一臺機器中使用。是不是依葫蘆畫瓢檩赢,然后其它語言多版本的問題都可以這樣結(jié)局呢吕嘀?事情遠遠比我們想象中復(fù)雜,比如python贞瞒,我們?yōu)榱耸褂矛F(xiàn)在社區(qū)中一些新的python工具偶房,必須把python升級到3.x版本,但操作系統(tǒng)中有些操作也需要python军浆,比如當(dāng)前ubuntu中用的是2.7棕洋,如果我們升級了python,系統(tǒng)的有些功能會無法正常使用乒融。ruby情況與python類似掰盘,由于ruby項目高度活躍,我們很可能需要同時使用3個以上甚至更多的ruby版本在一個系統(tǒng)中赞季,不止如此愧捕,還需要能靈活的管理我們的環(huán)境和版本。我們可以看到上面的配置文件中 由nginx監(jiān)聽主機名為 server_name test.ydma.cn 申钩,端口號 listen 80;
linux中的很多軟件都會有啟動腳本次绘,如果在啟動腳本中設(shè)定完整的java運行路徑,就可以用指定的java版本來運行程序了撒遣,像hadoop這樣的大型開源項目邮偎,已經(jīng)一早就為我們準(zhǔn)備了運行時環(huán)境設(shè)置的途徑。有一個很好的設(shè)計思路能解決這個問題义黎,無論你希望有多少個版本并存在操作系統(tǒng)且無沖突禾进。原理如下:
1. 首先,我們需要能把語言各個版本環(huán)境統(tǒng)一管理廉涕,也就是說把所有我們需要的版本都下載下來泻云,集中存放。
2. 然后我們建立一個該語言環(huán)境的目錄加入PATH火的,為語言環(huán)境以及bing中的命令建立替身壶愤,所有敲的命令以及執(zhí)行的腳本默認(rèn)都指向替身而不是命令本身.
tip:比如正常情況下如果敲python命令,系統(tǒng)會去path中查找python文件馏鹤,然后執(zhí)行.
由于通過path找到的python是替身而不是命令本身,我們可以利用替身幫我們做一些事情.
我們可以指明某個文件夾必須使用某個版本的python娇哆,這樣替身接到命令調(diào)用時就會先判斷湃累,這個文件夾是否有指明版本勃救,如果有指定,就再去調(diào)用指定版本的python去執(zhí)行命令.
當(dāng)然如果沒有指定文件夾治力,那么python就判斷蒙秒,當(dāng)前登陸的用戶有沒有指定python版本,如果沒有指定就再判斷宵统,有沒有指定默認(rèn)全局python版本.
這樣一來晕讲,我可以精確的去控制每一個文件夾,每一個用戶马澈,以及整個操作系統(tǒng)應(yīng)該是用的python版本瓢省,同樣的原理也適用于其它編程語言,而且也有這樣的開源項目來幫助我們做這樣的事情痊班。最早這樣管理環(huán)境的是ruby勤婚,ruby工程師發(fā)明了很多項目管理工具,早期的rvm就是管理版本環(huán)境與依賴的涤伐,功能比較強大馒胆,而另一個輕型解決方案叫做rbenv就是用我上面講的辦法來實現(xiàn)復(fù)雜的環(huán)境的管理,具體如何使用凝果,大家可以看一下我視頻直播中的演示祝迂。
由于有了rbenv這樣好用的工具管理ruby,因此就有人利用rbenv進行改造器净,誕生了pyenv來管理python型雳,還有phpenv等等。
其實在開發(fā)環(huán)境的配置和管理上掌动,值得探討的東西還有很多四啰,因為時間關(guān)系,無法在這里給大家介紹全部的細節(jié)粗恢,希望今天的分享能給大家?guī)韼椭躺梗x謝大家。