如何架設(shè)自己的Linux開(kāi)發(fā)環(huán)境

背景

  • 眾所周知,當(dāng)項(xiàng)目越來(lái)越大的時(shí)候磅网,項(xiàng)目的設(shè)計(jì)也會(huì)越來(lái)越復(fù)雜婆咸,一個(gè)線上運(yùn)營(yíng)的商業(yè)項(xiàng)目往往會(huì)涉及到多種編程語(yǔ)言與技術(shù)的使用坊罢,比如php+nodejs,ruby+nodejs擅耽,java活孩、python等。比如在不同目錄下python腳本乖仇,使用不同版本python運(yùn)行憾儒;解決版本兼容的問(wèn)題,一個(gè)服務(wù)器構(gòu)架多套使用不同編程語(yǔ)言的WEB服務(wù)(node,python,php,java)乃沙。

問(wèn)題

  • 不同語(yǔ)言環(huán)境是在不斷發(fā)展之中起趾,php從4.9到5.2再到7.0中間有著巨大的變化,代碼存在著大量的不兼容警儒。
    java 1.x到j(luò)ava 6训裆、7 再到j(luò)ava8不止是語(yǔ)法上的變化眶根,甚至連程序設(shè)計(jì)的思想與原則都發(fā)生了改變。
  • python和ruby边琉,這兩個(gè)語(yǔ)言在linux運(yùn)維中使用非常廣泛属百,很多自動(dòng)化運(yùn)維腳本都是用python2.x與ruby1.x編寫(xiě)的,然而現(xiàn)在社區(qū)中活躍的新版本確是python3.x和ruby2.x变姨。

方案

  • 現(xiàn)在的很多云計(jì)算廠商族扰,利用虛擬化技術(shù)、容器技術(shù)定欧,采用服務(wù)化方式進(jìn)行開(kāi)發(fā)渔呵,比如現(xiàn)在流行的docker+微服務(wù)架構(gòu)就是其中的佼佼者,關(guān)于更多容器技術(shù)與云計(jì)算的話題
  • 要完成這種規(guī)模的商業(yè)項(xiàng)目架構(gòu)設(shè)計(jì)砍鸠,架構(gòu)師常需要進(jìn)行程序測(cè)試與驗(yàn)證設(shè)計(jì)扩氢,可要在筆記本上完成這樣的部署,無(wú)論是利用虛擬化技術(shù)(虛擬機(jī))還是容器技術(shù)爷辱,都顯得太重了录豺,架構(gòu)師需要的應(yīng)該是一個(gè)全能的開(kāi)發(fā)、部署與運(yùn)維環(huán)境托嚣,環(huán)境需要與產(chǎn)品環(huán)境高度一致巩检,而且還應(yīng)該輕便,節(jié)省性能示启,方便管理兢哭。

場(chǎng)景

我們?nèi)绾巫屢慌_(tái)服務(wù)器同時(shí)支持多種不同的web服務(wù)器,比如如何同時(shí)讓我們的這臺(tái)測(cè)試機(jī)上面能跑起php夫嗓,nodejs迟螺,ruby on rails,如果有必要的話再加一個(gè)tomcat來(lái)跑jsp也是可以的舍咖。

  • 通常情況下矩父,如果在一臺(tái)機(jī)器中啟動(dòng)多個(gè)http服務(wù),我們必須給這些web服務(wù)分配不同的端口排霉,否則就會(huì)端口沖突窍株。然而標(biāo)準(zhǔn)的網(wǎng)頁(yè)服務(wù)走的是80端口,在瀏覽器中輸入一個(gè)網(wǎng)址攻柠,不指定端口號(hào)球订,者這個(gè)請(qǐng)求就會(huì)發(fā)送到80端口

  • 這樣說(shuō)來(lái),如果同時(shí)在多個(gè)端口開(kāi)啟web服務(wù)基本不需要做太多額外的事情瑰钮,只要去各個(gè)服務(wù)器軟件中修改配置文件冒滩,把端口號(hào)調(diào)整為其它大于一千的端口且不重復(fù),這樣web服務(wù)就能跑起來(lái)了浪谴。接著我們需要解決一個(gè)棘手的問(wèn)題开睡,通常我們?cè)O(shè)計(jì)的restfulAPi接口以及默認(rèn)的用戶訪問(wèn)因苹,都是直接把http請(qǐng)求發(fā)送至80端口的,80端口只有一個(gè)篇恒,自然是只能有一個(gè)程序去監(jiān)聽(tīng)這個(gè)端口扶檐,不過(guò)這個(gè)解決起來(lái)也很簡(jiǎn)單。

問(wèn)題與解決思路

問(wèn)題1: 一臺(tái)服務(wù)器共用80端口提供web服務(wù)

** 利用 **:nginx反向代理實(shí)現(xiàn)多個(gè)web服務(wù)共享80端口

  1. 第一步婚度,先讓nginx在80端口啟動(dòng)蘸秘,nginx啟動(dòng)成功后再讓其它服務(wù)器在別的端口啟動(dòng)服務(wù)官卡。為了保險(xiǎn)期間蝗茁,自己可以先測(cè)試一下,各個(gè)服務(wù)在不同端口是否工作正常寻咒。
  2. 然后我們就需要為各個(gè)服務(wù)創(chuàng)建虛擬主機(jī)哮翘,由于多個(gè)服務(wù)跑在一臺(tái)機(jī)器上,所以為了能有所區(qū)分毛秘,我們得給這些服務(wù)分別綁定不同域名饭寺,如果是在本機(jī)測(cè)試,域名綁定的工作可以選擇在自己筆記本的宿主機(jī)操作系統(tǒng)里面修改hosts文件
  3. 這一步完成以后叫挟,我們?cè)趎ginx的配置中增加虛擬主機(jī)配置艰匙,為了方便管理,每一個(gè)虛擬主機(jī)的配置最好是能有一個(gè)獨(dú)立的文件存放
  4. 虛擬主機(jī)反向代理配置
server {
    listen 80;
    server_name test.ydma.cn;
    location / {
          proxy_set_header X-Real-IP $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;
    }
        
    location ~ \.jsp$ {#后綴為jsp的網(wǎng)址訪問(wèn)規(guī)則
        proxy_pass http://jsp;
    }

    location ~ \.js$ {#后綴為js的網(wǎng)址訪問(wèn)規(guī)則
        proxy_pass http://nodejs;
    }
    location ~ \.php$ {#后綴為php的網(wǎng)址訪問(wèn)規(guī)則
        proxy_pass http://php;
    }
}

備注:在ubuntu中抹恳,這個(gè)文件應(yīng)該放在/etc/nginx/sites-available里面员凝,然后再通過(guò)ln -s 做一個(gè)軟連接放在sites-enabled文件夾中,nginx.conf主配置文件中有這么兩行配置include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;

解析:我們可以看到上面的配置文件中 由nginx監(jiān)聽(tīng)主機(jī)名為 server_name test.ydma.cn 奋献,端口號(hào) listen 80 ; location設(shè)置為 proxy_pass http://127.0.0.1:9001健霹,也就是說(shuō)把訪問(wèn)test.ydma.cn:80的請(qǐng)求交給127.0.0.1:9001端口去處理,proxy_set_header的配置是為了將http請(qǐng)求的頭部信息做相應(yīng)的改寫(xiě)瓶蚂,如果沒(méi)有這些設(shè)置糖埋,轉(zhuǎn)發(fā)后的請(qǐng)求得到的請(qǐng)求信息就是nginx服務(wù)的信息,而不是外部用戶的信息窃这。把這個(gè)文件復(fù)制幾分瞳别,只需要改寫(xiě)server_name以及proxy_pass后的端口號(hào),那么我們就可以讓nodes 杭攻、ruby on rails 祟敛、apache、等多個(gè)web服務(wù)同時(shí)共用80端口跑起來(lái)了朴上。

完整配置:

server {
    listen       3001;
    server_name  localhost;

    root /web/www/html/a;
    index index.php index.html index.htm;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

    location ~ \.php$ {
        root           /web/www/html/a;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;  #出現(xiàn)下載問(wèn)題
        include        fastcgi_params;
    }

}

server {
        listen       80;   #設(shè)置監(jiān)聽(tīng)的端口
        server_name  local.a.com; #設(shè)置監(jiān)聽(tīng)的域名
        location / {
            index  index.html index.htm index.php;
            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_pass http://127.0.0.1:3001; #設(shè)置跳轉(zhuǎn)的域名和端口
            #autoindex  on;
        }
}

問(wèn)題2:在項(xiàng)目開(kāi)發(fā)過(guò)程中垒棋,我們用到的各種工具和軟件,通常會(huì)有依賴痪宰,比如hadoop叼架,我們以hadoop2.x為例畔裕,它依賴jdk7,我們制作的一款機(jī)器學(xué)習(xí)軟件大量使用java函數(shù)式編程乖订,需要jdk8扮饶,那么我們?cè)趺礃咏鉀Q這個(gè)問(wèn)題呢?

** 利用 **:配置環(huán)境變量

  • 通常做法是同時(shí)安裝兩個(gè)版本到不同路徑乍构,比如/opt/java/jdk/1.7.x/目錄下安裝java7甜无,/opt/java/jdk/1.8.x/下安裝java8,然后可以在linux中配置用戶級(jí)別環(huán)境變量JAVA_HOME哥遮,通常環(huán)境變量應(yīng)該寫(xiě)在文件 ~./bashrc 或者~/.bash_profile中,然后再修改系統(tǒng)的PATH變量岂丘,指向JAVA_HOME下的bin目錄,這樣我希望用戶默認(rèn)環(huán)境下是java8那么我就把環(huán)境變量JAVA_HOME切換到j(luò)ava8的安裝目錄就可以了眠饮,這樣我們自己寫(xiě)的機(jī)器學(xué)習(xí)工具就能在我的用戶權(quán)限下跑起來(lái)了奥帘。

  • 問(wèn)題復(fù)雜度

  • 事情遠(yuǎn)遠(yuǎn)比我們想象中復(fù)雜,比如python仪召,我們?yōu)榱耸褂矛F(xiàn)在社區(qū)中一些新的python工具寨蹋,必須把python升級(jí)到3.x版本,但操作系統(tǒng)中有些操作也需要python扔茅,比如當(dāng)前ubuntu中用的是2.7已旧,如果我們升級(jí)了python,系統(tǒng)的有些功能會(huì)無(wú)法正常使用召娜。

  • ruby情況與python類似运褪,由于ruby項(xiàng)目高度活躍,我們很可能需要同時(shí)使用3個(gè)以上甚至更多的ruby版本在一個(gè)系統(tǒng)中萤晴,不止如此吐句,還需要能靈活的管理我們的環(huán)境和版本。

  • linux中的很多軟件都會(huì)有啟動(dòng)腳本店读,如果在啟動(dòng)腳本中設(shè)定完整的java運(yùn)行路徑嗦枢,就可以用指定的java版本來(lái)運(yùn)行程序了,像hadoop這樣的大型開(kāi)源項(xiàng)目屯断,已經(jīng)一早就為我們準(zhǔn)備了運(yùn)行時(shí)環(huán)境設(shè)置的途徑文虏。

設(shè)計(jì)思路

有一個(gè)很好的設(shè)計(jì)思路能解決這個(gè)問(wèn)題,無(wú)論你希望有多少個(gè)版本并存在操作系統(tǒng)且無(wú)沖突殖演。

  • 首先氧秘,我們需要能把語(yǔ)言各個(gè)版本環(huán)境統(tǒng)一管理,也就是說(shuō)把所有我們需要的版本都下載下來(lái)趴久,集中存放

  • 然后我們建立一個(gè)該語(yǔ)言環(huán)境的目錄加入PATH丸相,為語(yǔ)言環(huán)境以及bing中的命令建立替身,所有敲的命令以及執(zhí)行的腳本默認(rèn)都指向替身而不是命令本身彼棍,比如正常情況下如果敲python命令灭忠,系統(tǒng)會(huì)去path中查找python文件膳算,然后執(zhí)行,由于通過(guò)path找到的python是替身而不是命令本身弛作,我們可以利用替身幫我們做一些事情

  • 我們可以指明某個(gè)文件夾必須使用某個(gè)版本的python涕蜂,這樣替身接到命令調(diào)用時(shí)就會(huì)先判斷,這個(gè)文件夾是否有指明版本映琳,如果有指定机隙,就再去調(diào)用指定版本的python去執(zhí)行命令,當(dāng)然如果沒(méi)有指定文件夾萨西,那么python就判斷有鹿,當(dāng)前登陸的用戶有沒(méi)有指定python版本,如果沒(méi)有指定就再判斷原杂,有沒(méi)有指定默認(rèn)全局python版本印颤,這樣一來(lái)您机,我可以精確的去控制每一個(gè)文件夾穿肄,每一個(gè)用戶,以及整個(gè)操作系統(tǒng)應(yīng)該是用的python版本

  • 同樣的原理也適用于其它編程語(yǔ)言际看,而且也有這樣的開(kāi)源項(xiàng)目來(lái)幫助我們做這樣的事情咸产。
    最早這樣管理環(huán)境的是ruby,ruby工程師發(fā)明了很多項(xiàng)目管理工具仲闽,早期的rvm就是管理版本環(huán)境與依賴的脑溢,功能比較強(qiáng)大,而另一個(gè)輕型解決方案叫做rbenv就是用上面講的辦法來(lái)實(shí)現(xiàn)復(fù)雜的環(huán)境的管理(phpenv,pyenv等)赖欣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屑彻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子顶吮,更是在濱河造成了極大的恐慌社牲,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悴了,死亡現(xiàn)場(chǎng)離奇詭異搏恤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)湃交,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)熟空,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人搞莺,你說(shuō)我怎么就攤上這事息罗。” “怎么了才沧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵迈喉,是天一觀的道長(zhǎng)俏扩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)弊添,這世上最難降的妖魔是什么录淡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮油坝,結(jié)果婚禮上嫉戚,老公的妹妹穿的比我還像新娘。我一直安慰自己澈圈,他們只是感情好彬檀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瞬女,像睡著了一般窍帝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诽偷,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天坤学,我揣著相機(jī)與錄音,去河邊找鬼报慕。 笑死深浮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眠冈。 我是一名探鬼主播飞苇,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜗顽!你這毒婦竟也來(lái)了布卡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雇盖,失蹤者是張志新(化名)和其女友劉穎忿等,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刊懈,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡这弧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虚汛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匾浪。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卷哩,靈堂內(nèi)的尸體忽然破棺而出蛋辈,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布冷溶,位于F島的核電站渐白,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逞频。R本人自食惡果不足惜纯衍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苗胀。 院中可真熱鬧襟诸,春花似錦、人聲如沸基协。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)澜驮。三九已至陷揪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杂穷,已是汗流浹背悍缠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亭畜,地道東北人扮休。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拴鸵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜗搔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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