如何讓多個程序搭建在一個服務(wù)器上

1.搭建一個適合于架構(gòu)師使用的開發(fā)與實現(xiàn)環(huán)境Linux

  1. 眾所周知彻坛,當(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中間有著巨大的變化痕貌,代碼存在著大量的不兼容。
  2. 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編寫的。
  3. 這么多的問題涯肩,是不是已經(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)境是如何搭建起來的

  1. 我們?nèi)绾巫屢慌_服務(wù)器同時支持多種不同的web服務(wù)器,比如如何同時讓我們的這臺測試機上面能跑起php狡门,nodejs陷寝,ruby on rails,如果有必要的話再加一個tomcat來跑jsp也是可以的其馏。
  2. 通常情況下凤跑,如果在一臺機器中啟動多個http服務(wù),我們必須給這些web服務(wù)分配不同的端口叛复,否則就會端口沖突仔引。然而標(biāo)準(zhǔn)的網(wǎng)頁服務(wù)走的是80端口,在瀏覽器中輸入一個網(wǎng)址褐奥,不指定端口號,這個請求就會發(fā)送到80端口咖耘。這樣說來,如果同時在多個端口開啟web服務(wù)基本不需要做太多額外的事情撬码,只要去各個服務(wù)器軟件中修改配置文件儿倒,把端口號調(diào)整為其它大于一千的端口且不重復(fù),這樣web服務(wù)就能跑起來了呜笑。
  3. 接著我們需要解決一個棘手的問題夫否,通常我們設(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謝大家。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眷射,一起剝皮案震驚了整個濱河市匙赞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妖碉,老刑警劉巖涌庭,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異欧宜,居然都是意外死亡坐榆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門冗茸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來席镀,“玉大人匹中,你說我怎么就攤上這事『阑澹” “怎么了顶捷?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屎篱。 經(jīng)常有香客問我服赎,道長,這世上最難降的妖魔是什么交播? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任重虑,我火速辦了婚禮,結(jié)果婚禮上堪侯,老公的妹妹穿的比我還像新娘嚎尤。我一直安慰自己,他們只是感情好伍宦,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布芽死。 她就那樣靜靜地躺著,像睡著了一般次洼。 火紅的嫁衣襯著肌膚如雪关贵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天卖毁,我揣著相機與錄音揖曾,去河邊找鬼。 笑死亥啦,一個胖子當(dāng)著我的面吹牛炭剪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翔脱,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼奴拦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了届吁?” 一聲冷哼從身側(cè)響起错妖,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疚沐,沒想到半個月后暂氯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡亮蛔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年痴施,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡晾剖,死狀恐怖锉矢,靈堂內(nèi)的尸體忽然破棺而出梯嗽,到底是詐尸還是另有隱情齿尽,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布灯节,位于F島的核電站循头,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炎疆。R本人自食惡果不足惜卡骂,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望形入。 院中可真熱鬧全跨,春花似錦、人聲如沸亿遂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛇数。三九已至挪钓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耳舅,已是汗流浹背碌上。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浦徊,地道東北人馏予。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像盔性,于是被迫代替她去往敵國和親霞丧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容