最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

搭建測(cè)試服務(wù)器(源碼編譯方式)

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 13:07:24
文檔

搭建測(cè)試服務(wù)器(源碼編譯方式)

搭建測(cè)試服務(wù)器(源碼編譯方式):目前工作中開(kāi)發(fā)流程還比較初級(jí),甚至連測(cè)試服務(wù)器都沒(méi)有,代碼的變更都是直接先在開(kāi)發(fā)人員的本地機(jī)器上簡(jiǎn)單測(cè)試一下,然后直接部署到生產(chǎn)服務(wù)器上,這就相當(dāng)于生產(chǎn)服務(wù)器同時(shí)充當(dāng)了測(cè)試服務(wù)器的角色,雖然開(kāi)發(fā)的是面向公司內(nèi)部的系統(tǒng),但作為一個(gè)有理想有追
推薦度:
導(dǎo)讀搭建測(cè)試服務(wù)器(源碼編譯方式):目前工作中開(kāi)發(fā)流程還比較初級(jí),甚至連測(cè)試服務(wù)器都沒(méi)有,代碼的變更都是直接先在開(kāi)發(fā)人員的本地機(jī)器上簡(jiǎn)單測(cè)試一下,然后直接部署到生產(chǎn)服務(wù)器上,這就相當(dāng)于生產(chǎn)服務(wù)器同時(shí)充當(dāng)了測(cè)試服務(wù)器的角色,雖然開(kāi)發(fā)的是面向公司內(nèi)部的系統(tǒng),但作為一個(gè)有理想有追

目前工作中開(kāi)發(fā)流程還比較初級(jí),甚至連測(cè)試服務(wù)器都沒(méi)有,代碼的變更都是直接先在開(kāi)發(fā)人員的本地機(jī)器上簡(jiǎn)單測(cè)試一下,然后直接部署到生產(chǎn)服務(wù)器上,這就相當(dāng)于生產(chǎn)服務(wù)器同時(shí)充當(dāng)了測(cè)試服務(wù)器的角色,雖然開(kāi)發(fā)的是面向公司內(nèi)部的系統(tǒng),但作為一個(gè)有理想有追

目前工作中開(kāi)發(fā)流程還比較初級(jí),甚至連測(cè)試服務(wù)器都沒(méi)有,代碼的變更都是直接先在開(kāi)發(fā)人員的本地機(jī)器上簡(jiǎn)單測(cè)試一下,然后直接部署到生產(chǎn)服務(wù)器上,這就相當(dāng)于生產(chǎn)服務(wù)器同時(shí)充當(dāng)了測(cè)試服務(wù)器的角色,雖然開(kāi)發(fā)的是面向公司內(nèi)部的系統(tǒng),但作為一個(gè)有理想有追求的碼農(nóng),是不允許這樣粗糙混亂的開(kāi)發(fā)流程的,所以申請(qǐng)了臺(tái)服務(wù)器,自己搭建個(gè)測(cè)試服務(wù)器。

由于公司的服務(wù)器統(tǒng)一使用SUSE Linux Server操作系統(tǒng),并且版本較老。與Ubuntu、Centos等Linux發(fā)行版不同,SUSE Linux沒(méi)有可用的軟件源(不知是否與OpenSUSE的軟件源兼容?),即沒(méi)法使用系統(tǒng)的軟件包管理工具。這樣問(wèn)題就很多了。

我選擇源碼編譯的方式來(lái)安裝所有涉及的軟件。也許有人會(huì)說(shuō),為什么不在網(wǎng)絡(luò)上查找RPM包然后安裝呢?那么先想一下RPM包本質(zhì)上是個(gè)什么東西呢?RPM包(以及DEB包)其實(shí)就是將編譯好的一些程序以一定的規(guī)則打包在一起,然后系統(tǒng)的包管理工具(yum、zypper)按照相同的規(guī)則(在依賴(lài)滿(mǎn)足的情況下)將RPM包里文件復(fù)制到指定好的目錄里。如果RPM包的依賴(lài)沒(méi)有解決,是無(wú)法成功安裝的。即使安裝好了,若程序依賴(lài)的動(dòng)態(tài)鏈接庫(kù)等不存在或版本不匹配,也是無(wú)法正確運(yùn)行的,比如libc庫(kù)的版本過(guò)低,但明顯你不能輕易替換libc庫(kù),因?yàn)橄到y(tǒng)中已安裝的很多程序都依賴(lài)于libc庫(kù)。那么相比源碼編譯方式,RPM包方式的問(wèn)題更難解決。

需要安裝的軟件有Nginx、PHP、MySQL、Memcached、Redis、Mongodb、Python2.7(系統(tǒng)上自帶了2.4版本,版本過(guò)老)、Git、Gitlab、Ruby(Gitlab基于Ruby on Rails實(shí)現(xiàn)),運(yùn)維工具tmux、htop,以及基礎(chǔ)依賴(lài)庫(kù)curl(libcurl)、cmake、libxml2、libxslt、openssl、pcre、readline、zlib、ic4c、libevent等。

除Gitlab之外(因?yàn)镚itlab是個(gè)Web應(yīng)用)的所有軟件編譯安裝流程都類(lèi)似:

  1. wget [下載鏈接] # 對(duì)于https協(xié)議的鏈接,也許需要添加 --no-check-certificate 來(lái)避免證書(shū)驗(yàn)證。
  2. tar -xvf [軟件源碼壓縮包(*.tar.gz/*.tar)] / unzip [軟件源碼壓縮包(*.zip)]
  3. cd [源碼目錄](méi) && ./configure [--prefix=...] [...] # openssl的是./config [...]
  4. make && make install

其中最重要的步驟是./configure。在這一步中將指定軟件的安裝目錄,以及其他參數(shù)(比如依賴(lài)的路徑)。可以通過(guò)./configure --help來(lái)查看configure的選項(xiàng)列表,認(rèn)真閱讀一下,看看自己的編譯是否需要帶上某些選項(xiàng)。

軟件在編譯過(guò)程中可能會(huì)自動(dòng)查找借助某些工具,若找不到可能就會(huì)編譯失敗,其查找的規(guī)則一般就是環(huán)境變量PATH。所以若發(fā)現(xiàn)是因?yàn)檎也坏侥承┕ぞ哕浖?dǎo)致編譯失敗,那得確認(rèn)一下系統(tǒng)是否安裝該工具,若已安裝,則配置一下PATH(export PATH=$PATH:/path/to/tool/export PATH=/path/to/tool/:$PATH)。

軟件也可能依賴(lài)一些動(dòng)態(tài)或靜態(tài)鏈接庫(kù),其查找規(guī)則是/etc/ld.so.conf文件中指定的查找路徑。編譯過(guò)程中經(jīng)常會(huì)因?yàn)槲凑业絼?dòng)態(tài)鏈接庫(kù)而失敗,如果該庫(kù)已存在,可能需配置一下ld.so.conf,將依賴(lài)庫(kù)的路徑添加到ld.so.conf中,然后執(zhí)行l(wèi)dconfig。

很多時(shí)候編譯失敗了,但你并不知道編譯過(guò)程嘗試過(guò)去哪些路徑中查找某個(gè)依賴(lài)庫(kù)。直接閱讀Makefile并修改不是個(gè)好主意。這時(shí)strace神器就派上用場(chǎng)了。strace is a system call tracer, i.e. a debugging tool which prints out a trace of all the system calls made by a another process/program。比如:strace make,就會(huì)輸出大量跟蹤信息。當(dāng)編譯因未找到依賴(lài)而中止后,回溯輸出的跟蹤信息,看看make過(guò)程找過(guò)哪些路徑,然后將依賴(lài)文件軟鏈接到這些路徑中某一個(gè),再重新編譯。

從上述4個(gè)方面可以解決大多數(shù)編譯過(guò)程中的依賴(lài)問(wèn)題。


關(guān)于編譯安裝路徑,我個(gè)人的看法是,基礎(chǔ)依賴(lài)庫(kù),如openssl、zlib等在configure的時(shí)候不使用--prefix選項(xiàng),即使用默認(rèn)的安裝路徑,這樣其他依賴(lài)于這些基礎(chǔ)庫(kù)的軟件編譯過(guò)程中發(fā)生依賴(lài)缺失問(wèn)題的可能性要小一些。若系統(tǒng)原來(lái)存在老版本的依賴(lài)庫(kù),這樣的默認(rèn)安裝路徑方式一般并不會(huì)覆蓋老版本文件,所以也不用擔(dān)心會(huì)導(dǎo)致系統(tǒng)中已安裝的軟件運(yùn)行存在問(wèn)題。


關(guān)于mysql的編譯安裝過(guò)程可參考:Linux下源碼編譯MySQL 5.5 與安裝過(guò)程全記錄,過(guò)程較為復(fù)雜。


PHP源碼編譯默認(rèn)不會(huì)產(chǎn)生php-fpm(PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI implementation with some additional features useful for sites of any size, especially busier sites.),從./configure --help的輸出中可以看到這樣幾行:

--enable-fpm Enable building of the fpm SAPI executable
--with-fpm-user=USER Set the user for php-fpm to run as. (default: nobody)
--with-fpm-group=GRP Set the group for php-fpm to run as. For a system user, this
 should usually be set to match the fpm username (default: nobody)

這樣只要在configure的時(shí)候提供這幾個(gè)選項(xiàng)就可以啟用php-fpm了。

為保證測(cè)試服務(wù)器上的PHP啟用的擴(kuò)展模塊與生產(chǎn)服務(wù)器上的PHP一致,可通過(guò)phpinfo()函數(shù)來(lái)獲知生產(chǎn)服務(wù)器上的PHP在configure編譯的時(shí)候帶了哪些選項(xiàng)。如圖所示:

php-configure.jpg

但這樣你得額外編譯安裝zlib、libmcrypt、libpng、freetype等庫(kù)。

PHP configure的選項(xiàng)特別多。

最后我的configure命令為:

./configure --prefix=/usr/local/php --enable-fpm --with-mysql=/usr/local/mysql \
 --with-mysqli=/usr/local/mysql/bin/mysql_config --with-gd --enable-sockets \
 --enable-bcmath --enable-mbstring --enable-zip --with-zlib=/usr/local/zlib \
 --with-mcrypt --with-freetype-dir=/usr --with-curl

PHP安裝完成后,可能還需編譯安裝一些擴(kuò)展模塊,比如:Redis、memcache、APC等。PHP擴(kuò)展模塊的編譯安裝流程大致如下:

  1. /usr/local/php/bin/phpize
  2. ./configure --with-php-config=/usr/local/php/bin/php-config [...] # 可通過(guò)./configure --help查看該擴(kuò)展configure可帶的選項(xiàng)
  3. make && make install

如果擴(kuò)展模塊最后安裝的路徑并不是你期望的,則可以將所有編譯好的擴(kuò)展模塊統(tǒng)一復(fù)制到同一個(gè)路徑之下,然后修改php.ini(如果不存在,則可在/path/to/php/lib目錄下新建一個(gè))中extension_dir一項(xiàng)的值為擴(kuò)展模塊的統(tǒng)一路徑,并為每個(gè)新增的擴(kuò)展模塊添加一行extension=xxx.so,如:

extension=redis.so
extension=memcache.so
extension=apc.so

最后可通過(guò)phpinfo()函數(shù)來(lái)確認(rèn)是否成功安裝擴(kuò)展。


關(guān)于Python源碼編譯,除了可能存在依賴(lài)問(wèn)題外,默認(rèn)的配置(Modules/Setup.dist)沒(méi)有啟用一些標(biāo)準(zhǔn)庫(kù)模塊,這些模塊在實(shí)際中又非常基礎(chǔ)常用。所以在configure之前需要編輯Modules/Setup.dist文件,啟用某些必要的模塊(只需去除某些行前#符號(hào),稍微閱讀一下該文件就知道了),但某些模塊又有其他依賴(lài),從而導(dǎo)致Python編譯失敗,這樣的模塊可以不啟用,所以可能需要多次來(lái)回嘗試。在make編譯結(jié)束時(shí)的輸出信息中會(huì)提示哪些必要的模塊沒(méi)有啟用,以及哪些模塊已啟用但編譯失敗了。你可以忽略這些模塊,但之后Python的使用可能會(huì)存在一些問(wèn)題。


由于Git可以支持HTTP、GIT、HTTPS、SSH協(xié)議,會(huì)依賴(lài)libssl、libcrypto、libcurl、libmcrypt等庫(kù),libssl、libcrypto這兩個(gè)庫(kù)都由openssl編譯產(chǎn)生,libcurl由curl編譯產(chǎn)生。如果未能成功編譯ssl支持,也能通過(guò)編譯,只是在之后的使用中遇到HTTPS協(xié)議可能會(huì)有問(wèn)題。如果使用Git遇到HTTPS協(xié)議不能成功驗(yàn)證證書(shū)時(shí),可以設(shè)置git config --global http.sslVerify false來(lái)避免證書(shū)驗(yàn)證。


Gitlab是基于Ruby on Rails實(shí)現(xiàn)的類(lèi)Github代碼托管平臺(tái)。其官方的安裝教程見(jiàn):https://github.com/gitlabhq/gitlabhq/blob/5-0-stable/doc/install/installation.md,不同Gitlab版本的安裝過(guò)程有些不同,鏈接指向的是5-0-stable版本的安裝教程。官方的安裝教程是針對(duì)Ubuntu/Debian的,其他Linux發(fā)行版的安裝過(guò)程會(huì)略有不同。

由于我對(duì)于Ruby以及Ruby on Rails并不了解,以下內(nèi)容可能有些表述不正確的地方,請(qǐng)注意。

與Python的pip和easy_install一樣,Ruby使用gem來(lái)管理第三方庫(kù),并通常使用bundle來(lái)管理應(yīng)用的依賴(lài)問(wèn)題(Ruby on Rails就使用bundle來(lái)管理依賴(lài)),bundle其實(shí)又借助了gem。

與Python的pypi以及Linux發(fā)行版的軟件源一樣,RubyGems在世界各地也有很多鏡像。為了加快gem安裝第三方庫(kù)的過(guò)程,國(guó)內(nèi)可以選擇淘寶的RubyGems鏡像,更改鏡像的方法見(jiàn)淘寶RubyGems鏡像網(wǎng)站上的說(shuō)明。

對(duì)于bundle,要想修改它所使用的RubyGems鏡像,可以通過(guò)編輯應(yīng)用根目錄中的Gemfile文件的第一行source "http://xxxxx"來(lái)修改。

安裝Gitlab過(guò)程使用bundle安裝Mysql2 gem等依賴(lài)時(shí),可能會(huì)遇到這種類(lèi)似的問(wèn)題:

Installing mysql2 (0.3.11) with native extensions
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

這是由于gem未找到mysql的一些頭文件,即include目錄中的文件。在Ubuntu/Debian中,可能可以通過(guò)sudo apt-get install libmysqlclient-dev來(lái)解決問(wèn)題(可以通過(guò)系統(tǒng)包管理器安裝的軟件的dev包,其實(shí)就是源碼編譯安裝后include目錄中的內(nèi)容)。對(duì)于我所處的系統(tǒng)環(huán)境,只能想法子讓gem能找到include目錄。

執(zhí)行bundle install [...]后,找到mysql2 gem的目錄,比如在我的Gitlab中路徑為gitlab/vendor/bundle/ruby/1.9.1/gems/mysql2-0.3.11,再查看從子目錄ext/mysql2中的extconf.rb文件,文件中有這樣一段:

dirs = ENV['PATH'].split(File::PATH_SEPARATOR) + %w[
/opt
/opt/local
/opt/local/mysql
/opt/local/lib/mysql5
/usr
/usr/local
/usr/local/mysql
/usr/local/mysql-*
/usr/local/lib/mysql5
].map{|dir| "#{dir}/bin" }

我bundle install的時(shí)候之所以失敗,是因?yàn)槲野裮ysql安裝到了/usr/local/mysql56目錄,所以gem找不到mysql的include目錄。直接在extconf.rb文件中添加mysql安裝路徑是沒(méi)用的,因?yàn)槊看螆?zhí)行bundle install都會(huì)重新生成該文件,所以我執(zhí)行cp -r /usr/local/mysql56 /usr/local/mysql來(lái)創(chuàng)建了mysql目錄,應(yīng)該也可以通過(guò)軟鏈接來(lái)實(shí)現(xiàn)。

其他某些gem依賴(lài)可能也會(huì)有這樣的問(wèn)題,可以通過(guò)這樣類(lèi)似的方式解決。

Ubuntu/Debian中安裝nginx后,在nginx配置目錄/etc/nginx中會(huì)自動(dòng)生成sites-available、sites-enabled這兩個(gè)目錄,這兩目錄的關(guān)系是這樣的:在sites-available目錄中為每個(gè)可能需要nginx服務(wù)的應(yīng)用編寫(xiě)一個(gè)虛擬主機(jī)配置文件(對(duì)于nginx配置即server模塊),若某個(gè)應(yīng)用現(xiàn)在需要nginx服務(wù),則將它的配置文件從sites-available軟鏈接到sites-enabled,而nginx的主配置文件nginx.conf的http模塊的最后通過(guò)include sites-enabled/*將sites-enabled中所有的軟鏈接配置文件包含進(jìn)來(lái)。這種方式的好處在于模塊化配置文件,非常靈活方便。但在SUSE中編譯安裝后,conf目錄下并沒(méi)有這兩個(gè)目錄,所以只能自己創(chuàng)建,并修改nginx.conf的http模塊最后手動(dòng)添加include sites-enabled/*一行即可。

之后在試用Gitlab時(shí),發(fā)現(xiàn)無(wú)法查看代碼文件中的內(nèi)容,通過(guò)瀏覽器的開(kāi)發(fā)者工具看到是個(gè)500 Server Error響應(yīng)。查看gitlab/log目錄中的unicorn.stderr.log日志文件,有如下錯(cuò)誤信息:

ActionView::Template::Error (Failed to get header.):
9: .file_content.code
10: - unless blob.empty?
11: %div{class: user_color_scheme_class}
12: = raw blob.colorize(formatter: :gitlab)
13: - else
14: %p.nothing_here_message Empty file
app/models/tree.rb:6:in `colorize'
app/views/tree/blob/_text.html.haml:12:in `_app_views_tree_blob__text_html_haml__128024721089489703_57418280'
app/views/tree/_blob.html.haml:9:in `_app_views_tree__blob_html_haml__1829533197002461340_55995660'
app/views/tree/_tree.html.haml:16:in `_app_views_tree__tree_html_haml___4517474428772753218_46927720'
app/views/tree/show.html.haml:4:in `_app_views_tree_show_html_haml__3020201194833589280_44750920'
app/controllers/tree_controller.rb:17:in `show'

查看網(wǎng)絡(luò)資料可以知道這是由于代碼高亮渲染的時(shí)候出了問(wèn)題。Gitlab使用pygments.rb來(lái)高亮代碼。pygments.rb是Ruby wrapper for the Python pygments syntax highlighter。那么,高亮渲染失敗可能有三種可能:(1)未找到合適的Python版本,pygments.rb依賴(lài)于Python 2.5+,(2)沒(méi)有安裝Python的pygments第三方庫(kù),(3)其他原因。很不幸,我遇到的是第三種可能。官方Trouble-Shooting-Guide對(duì)于該問(wèn)題給出解決方案是針對(duì)第一種可能的。

在pyments.rb gem目錄gitlab/vendor/bundle/ruby/1.9.1/gems/pygments.rb-0.4.2的子目錄lib/pygments中有(且僅有)一個(gè)可執(zhí)行的python源碼文件mentos.py,pygments.rb應(yīng)該就是通過(guò)該程序文件調(diào)用Python的pygments庫(kù)來(lái)高亮代碼的,我嘗試執(zhí)行該文件,執(zhí)行失敗,原因是標(biāo)準(zhǔn)庫(kù)json的某行代碼中對(duì)象調(diào)用了encode('hex')方法失敗,提示不存在hex編碼。經(jīng)分析查找原因,問(wèn)題出在標(biāo)準(zhǔn)庫(kù)模塊binascii(The binascii module contains a number of methods to convert between binary and various ASCII-encoded binary representations)未編譯安裝。該模塊需要編輯Modules/Setup.dist文件啟用。啟用后(可能還有其他相關(guān)模塊,我是把其他很多模塊一起啟用了)重新編譯Python就可以了。


源碼編譯安裝軟件遇到最多的問(wèn)題是依賴(lài)缺失,有時(shí)會(huì)非常繁瑣。經(jīng)過(guò)這次經(jīng)歷,我深感操作系統(tǒng)的軟件包管理器是多么的重要,能節(jié)省我們很多很多時(shí)間和精力!

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

搭建測(cè)試服務(wù)器(源碼編譯方式)

搭建測(cè)試服務(wù)器(源碼編譯方式):目前工作中開(kāi)發(fā)流程還比較初級(jí),甚至連測(cè)試服務(wù)器都沒(méi)有,代碼的變更都是直接先在開(kāi)發(fā)人員的本地機(jī)器上簡(jiǎn)單測(cè)試一下,然后直接部署到生產(chǎn)服務(wù)器上,這就相當(dāng)于生產(chǎn)服務(wù)器同時(shí)充當(dāng)了測(cè)試服務(wù)器的角色,雖然開(kāi)發(fā)的是面向公司內(nèi)部的系統(tǒng),但作為一個(gè)有理想有追
推薦度:
  • 熱門(mén)焦點(diǎn)

最新推薦

猜你喜歡

熱門(mén)推薦

專(zhuān)題
Top