寫在前面
本學期軟件工程課程,老師要求咱們寫一個大做業,咱們小組選擇作一個資源分享的網站平臺。如今工做已經結束,我打算從頭開始回顧,並將其過程寫爲多篇連載的博客。php
工具選擇
開發最重要的準備工做就是環境搭建,咱們小組本次選擇使用apache+mysql+php開發這個網站,而且將網站部署在Linux機上。因此咱們須要準備的東西有:VMware虛擬機、Centos7鏡像文件。安裝一個centos虛擬機後在虛擬機上安裝apache、mysql和php環境。(ps:親身實踐,感受VMware比virtual box好用)html
安裝過程
如今個人pc上已經安裝好了一個centos7的虛擬機(具體過程能夠搜索教程)
node
如今打開虛擬機,個人虛擬機上只添加了一塊硬盤(20G,建議大一點,後來我安裝mysql時發現硬盤空間不夠用又加了一塊20G硬盤,具體什麼東西佔用了個人空間我還沒找到),分爲兩個分區(swap交換分區,大小4G,剩下的空間所有設爲根分區,其中根分區掛載到了根目錄下)。首先在根目錄下建立一個web目錄,做爲apache、mysql、php源代碼存放路徑,由於我將要使用源代碼方式安裝這三個軟件。mysql
使用源代碼方式安裝的很差之處在於,須要本身解決軟件安裝過程當中的所有依賴,並且下載源代碼包解壓縮後須要通過編譯才能安裝,好處在於能夠本身進行一些配置。我之因此選擇源代碼安裝方式是由於後面涉及到php的擴展時須要源代碼。c++
那麼安裝apache以前咱們須要獲取apache和其依賴軟件的源代碼:git
1. apache2.4: wget http://mirrors.hust.edu.cn/apache//httpd/httpd-2.4.37.tar.gz 2. apr-1.6.5.tar.gz:http://www.apache.org/dist/apr/ 3. apr-util-1.6.1.tar.gz:http://www.apache.org/dist/apr/ 4. pcre-8.42.tar.gz:wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz
第一個和第四個在虛擬機終端中直接輸入該命令便可下載,第二個和第三個須要到這個網站中去下載。無論怎麼樣,將下載獲得四個壓縮包都放入根目錄下的web目錄中,而後準備一一安裝。web
tar -zxvf apr-1.46.tar.gz cd apr-1.46 ./configure --prefix=/usr/local/apr #生成makefile編譯文件 make #編譯源代碼 make install #安裝
在生成編譯文件或編譯源代碼的時候,可能會報錯,告訴咱們gcc沒有安裝,此時安裝一下gcc便可,雖然咱們不用yum安裝apache,可是能夠用它來安裝其餘依賴文件,這樣對咱們的apache源碼沒有什麼影響。sql
yum install gcc* #安裝gcc
tar -zxvf apr-util-1.5.1.tar.gz cd apr-util-1.5.1 ./configure --with-apr=/usr/local/apr make make install
編譯過程當中可能會出現這個錯誤:xml/apr_xml.c:35:19: fatal error: expat.h: No such file or directory
只須要安裝expat-devel就好了數據庫
yum install expat-devel
tar -zxvf pcre-8.32.tar.gz cd pcre-8.32 ./configure --prefix=/usr/local/pcre(此處出現configure: error: You need a C++ compiler for C++ support sudo yum install gcc-c++) #因爲以前安裝過gcc,因此不會出現這個錯誤 make make install
tar -zxvf httpd-2.4.37.tar.gz cd httpd-2.4.37 ./configure --prefix=/usr/local/apache24 --enable-so --with-apr=/usr/local/apr/ --with-apr-til=/usr/local/apr/ --with-pcre=/usr/local/pcre/ make make install
若是進行make編譯的時候,出現這個錯誤:/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_GetErrorCode',是因爲缺乏xml的相關支持,使用yum安裝對應的依賴便可apache
①安裝libxml2-devel [root@test_01 ~]# yum install -y libxml2-devel ②刪除apr-util目錄而且從新編譯安裝(將/web目錄下的apr-util刪除,從新解壓縮編譯) ③從新編譯安裝httpd,成功解決。
apache已經安裝完成(若是編譯安裝過程出現其餘錯誤,我也不知道該怎麼辦,由於我沒有遇到),那麼接下在就是開啓apache服務,配置apache的配置文件。
[root@bogon ~]cd /usr/local/apache24/bin [root@bogon bin] ./apachectl start #開啓apache服務 [root@bogon bin] lsof -i:80 #查詢80端口是否被httpd服務佔用 [root@bogon bin] ./apachectl stop #關閉apache服務
這樣的話,每一次啓動服務都必須執行復雜的命令,有一種方法能夠將apache服務加入系統服務以後使用service httpd start便可開啓服務,這種方式這裏不作介紹。
接下來在瀏覽器中訪問apache服務,打開firefox在地址欄輸入:localhost,若是能夠看到It works即表示服務啓動成功。
apache配置文件的路徑:/usr/local/apache24/conf/httpd.conf
須要配置apache的web站點路徑、apache的端口號(默認爲80端口,能夠不用改)
#配置web站點 vim /usr/local/apache24/conf/httpd.conf #找到DocumentRoot,將這個路徑修改成你的web站點路徑,同時下面的Directory標籤也須要作相應的修改 #我將web項目放在第二塊硬盤上,也就是/mnt目錄下,項目名爲tshare Docuement "/mnt/tshare"
由於mysql被收購了,因此centos7中不在集成mysql了,而是集成mariadb,因此須要先卸載mariadb
#列出安裝的mysql。 rpm -qa | grep mariadb ###顯示mariadb-libs-5.5.56-2.el7.x86_64 #卸載 rpm -e mariadb-libs-5.5.56-2.el7.x86_64 ####會報以下錯誤 error: Failed dependencies: libmysqlclient.so.18()(64bit) is needed by (installed) postfix-2:2.10.1-6.el7.x86_64 libmysqlclient.so.18(libmysqlclient_18)(64bit) is needed by (installed) postfix-2:2.10.1-6.el7.x86_64 #強制卸載 rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64 #檢查是否有遺留文件。若是有刪除便可。 ls /etc/my.cnf ll /var/lib/mysql/ ll /var/lib64/mysql(64位)
mysql源代碼下載網址:https://dev.mysql.com/downloa...
mysql依賴軟件boost下載網址:http://www.boost.org/users/do... 。
將下載獲得的mysql源碼和boots源碼複製到/web目錄下
使用yum安裝其餘的依賴項:yum install -y cmake bison bison-devel libaio-devel gcc gcc-c++ git ncurses-devel
cd /web tar -zxvf mysql-8.0.16.tar.gz #解壓縮mysql源碼包 mv boost_1_69_0.tar.gz mysql-8.0.16 #將boost移動到解壓後的mysql目錄中 cd mysql-8.0.16 #進入mysql解壓目錄 tar -zxvf boost_1_69_0.tar.gz #解壓boost mkdir configure #建立cmake編譯目錄
cd configure #進入cmake編譯目錄 #下面這麼多行屬於同一條指令裏面的(#是註釋,不須要) cmake .. -DBUILD_CONFIG=mysql_release \ -DINSTALL_LAYOUT=STANDALONE \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DENABLE_DTRACE=OFF \ -DWITH_EMBEDDED_SERVER=OFF \ -DWITH_INNODB_MEMCACHED=ON \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_PAM=ON \ -DCMAKE_INSTALL_PREFIX=/var/mysql/ \ -DINSTALL_PLUGINDIR="/var/mysql/lib/plugin" \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EDITLINE=bundled \ -DFEATURE_SET=community \ -DCOMPILATION_COMMENT="MySQL Server (GPL)" \ -DWITH_DEBUG=OFF \ -DWITH_BOOST=..
最後一個參數「-DWITH_BOOST」的值表示boost所在的目錄,若是按上面的步驟來,此處不用修改(可是若是你發現仍是報錯的話,那最好把這裏改成絕對路徑),你能夠把boost解壓到其餘目錄而後在此處寫上路徑。
固然編譯過程不可能這麼順利,首先須要面對的問題就是cmake的版本問題,若是編譯出錯而且告訴你須要高版本的cmake,那麼你須要去下載高版本cmake而後安裝,
地址:https://cmake.org/files/v3.10...
[root@localhost ~]# tar -zxvf cmake-3.10.2.tar.gz [root@localhost ~]# cd cmake-3.10.2 [root@localhost cmake-3.10.2]# ./bootstrap --prefix=/usr/local [root@localhost cmake-3.10.2]# gmake [root@localhost cmake-3.10.2]# make install
解決cmake版本問題後,再次使用cmake編譯,若是報錯告訴你/usr/bin/cmake不存在,那麼你就寫上cmake的絕對路徑。以後再次cmake編譯,可能會出現GCC版本問題,centos使用yum安裝的gcc是4.8版本的,編譯mysql-8.0.16時須要5.3版本的gcc,須要下載devtoolset來安裝高版本gcc。
yum install centos-release-scl-rh centos-release-scl yum check-update yum install devtoolset-4-gcc devtoolset-4-gcc-c++ source /opt/rh/devtoolset-4/enable gcc -v #查看gcc版本
在此終端查看gcc版本爲5.3,可是其餘終端查看你的gcc版本仍爲4.8(我沒有研究是什麼緣由),因此不要關閉這個終端,咱們就在這個終端下編譯mysql。再次使用cmake編譯,若是出現「Cannot find appropriate system libraries for WITH_SSL=system」、「CMake Error at cmake/ssl.cmake:68 (MESSAGE):Please install the appropriate openssl developer package.」這樣的錯誤,那麼須要安裝ssl(yum install ncurses-devel 和 yum install openssl-devel)
再次執行cmake編譯
/usr/local/bin/cmake .. -DBUILD_CONFIG=mysql_release -DINSTALL_LAYOUT=STANDALONE -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_DTRACE=OFF -DWITH_EMBEDDED_SERVER=OFF -DWITH_INNODB_MEMCACHED=ON -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_PAM=ON -DCMAKE_INSTALL_PREFIX=/var/mysql/ -DINSTALL_PLUGINDIR="/var/mysql/lib/plugin" -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EDITLINE=bundled -DFEATURE_SET=community -DCOMPILATION_COMMENT="MySQL Server (GPL)" -DWITH_DEBUG=OFF -DWITH_BOOST=/usr/local/boost
我把新的cmake3安裝在/usr/local/bin/,因此最開始使用這個路徑下的cmake,因爲我最開始下載的是boost-1.70版本,因此後來從新下載了一個1.69版本的,把它放在了/usr/local目錄下,因此最後的-DWITH_BOOST的值設爲了這個(若是你一開始就下載的1.69版本的boost,那麼就不必修改這個值)。這些錯誤解決後我沒有遇到其餘的錯誤了,那麼最後的編譯結果以下:
能看到這兩個「done」表示咱們cmake編譯成功了(其實是生成了Makefile編譯文件)。
mysql安裝就完成了,接下來配置mysql用戶以及日誌文件
useradd -s /sbin/nologin mysql #添加名爲mysql的用戶 #建立mysql的數據和日誌目錄,考慮到第一塊硬盤空間不夠,因此將數據文件放在第二塊硬盤上。 #mkdir不能建立多層目錄,須要分開建立 mkdir /mnt/mysql_data mkdir /var/mysql/log chown -R mysql:mysql /mnt/mysql_data/ chown -R mysql:mysql /var/mysql/log
vim /etc/my.cnf #輸入以下內容 [mysqld] port=3306 datadir=/mnt/mysql_data log_error=/var/mysql/log/error.log basedir=/var/mysql #basedir只能是這個目錄,由於mysql啓動時須要/var/mysql/bin/mysqld_safe文件
/var/mysql/bin/mysqld --initialize --user=mysql
ll /mnt/mysql_data #顯示以下內容 -rw-r-----. 1 mysql mysql 56 May 28 08:04 auto.cnf -rw-------. 1 mysql mysql 1676 May 28 08:04 ca-key.pem -rw-r--r--. 1 mysql mysql 1112 May 28 08:04 ca.pem -rw-r--r--. 1 mysql mysql 1112 May 28 08:04 client-cert.pem -rw-------. 1 mysql mysql 1680 May 28 08:04 client-key.pem -rw-r-----. 1 mysql mysql 5284 May 28 08:05 ib_buffer_pool -rw-r-----. 1 mysql mysql 12582912 May 28 08:05 ibdata1 -rw-r-----. 1 mysql mysql 50331648 May 28 08:05 ib_logfile0 -rw-r-----. 1 mysql mysql 50331648 May 28 08:04 ib_logfile1 drwxr-x---. 2 mysql mysql 4096 May 28 08:05 #innodb_temp drwxr-x---. 2 mysql mysql 4096 May 28 08:04 mysql -rw-r-----. 1 mysql mysql 24117248 May 28 08:05 mysql.ibd drwxr-x---. 2 mysql mysql 4096 May 28 08:04 performance_schema -rw-------. 1 mysql mysql 1676 May 28 08:04 private_key.pem -rw-r--r--. 1 mysql mysql 452 May 28 08:04 public_key.pem -rw-r--r--. 1 mysql mysql 1112 May 28 08:04 server-cert.pem -rw-------. 1 mysql mysql 1676 May 28 08:04 server-key.pem drwxr-x---. 2 mysql mysql 4096 May 28 08:04 sys -rw-r-----. 1 mysql mysql 10485760 May 28 08:05 undo_001 -rw-r-----. 1 mysql mysql 10485760 May 28 08:05 undo_002 ll /mnt/mysql/log #顯示以下內容 -rw-r-----. 1 mysql mysql 1091 May 28 08:04 error.log
#將/var/mysql/support-files/mysql.server複製到/etc/init.d下並重命名爲mysqld cp /var/mysql/support-files/mysql.server /etc/init.d/mysqld #修改mysqld中的basedir和datadir爲上面你設置的目錄 vim mysqld
/etc/init.d/mysqld start #能夠增長環境變量使得在任何路徑下都能啓動服務,此處不作介紹
#第一次登陸mysql時有一個默認密碼,能夠查看 cat /var/mysql/log/error.log |grep 'A temporary password' #顯示以下一行內容,其中「:」後面的就是密碼即密碼爲「=?Jj.HhPk8hW」 2019-05-28T11:01:46.013790Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: =?Jj.HhPk8hW #登陸mysql,因爲/usr/bin並無mysql命令,因此使用絕對路徑/var/mysql/bin/mysql登陸,而後輸入密碼 /var/mysql/bin/mysql -uroot -p #修改密碼,將your_password替換爲你的密碼便可 alter user 'root'@'localhost' identified by 'your_password'; #退出從新登陸,確認密碼修改完成 exit /var/mysql/bin/mysql -uroot -p
php源代碼下載:php官網下載,我選擇了php-7.3.5版本(php-7.3.5.tar.gz)
將下載獲得的壓縮包移動到/web目錄下進行解壓縮,這個源代碼即便在編譯安裝完後也不要刪,後面會須要它內部的擴展文件
cd /web tar -zxvf php-7.3.5.tar.gz cd php-7.3.5 #下面這麼多行爲一條命令,和mysql編譯時差很少,此處開啓了php的一些擴展,例如zip、mysqli ./configure --prefix=/usr/local/php7 \ --with-apxs2=/usr/local/apache24/bin/apxs \ --with-config-file-path=/etc/php.ini \ --with-curl \ --with-freetype-dir \ --with-gd \ --with-gettext \ --with-iconv-dir \ --with-kerberos \ --with-libdir=lib64 \ --with-libxml-dir \ --with-mysqli \ --with-openssl \ --with-pcre-regex \ --with-pdo-mysql \ --with-pdo-sqlite \ --with-pear \ --with-png-dir \ --with-xmlrpc \ --with-xsl \ --with-zlib \ --enable-fpm \ --enable-bcmath \ --enable-libxml \ --enable-inline-optimization \ --enable-mbregex \ --enable-mbstring \ --enable-opcache \ --enable-pcntl \ --enable-shmop \ --enable-soap \ --enable-sockets \ --enable-sysvsem \ --enable-xml \ --enable-zip
第一行的--prefix設置的是php的安裝路徑,最好放在usr/local下
第二行的--with-apxs2的值若是是按照前面個人方式安裝的apache,那麼這個值是對的,若是你是用其餘方式安裝的apache,那麼你須要找到它的安裝目錄下的apxs文件
第三行的--with-config-file-path的值是設置php.ini的路徑,方便配置php
ps:在執行./configure命令生成php的編譯文件時,若是缺乏某些依賴項,而須要編譯安裝(以下面的curl和libzip安裝等等),請從新開一個終端,在/web目錄下安裝這些依賴項,千萬不要在php編譯目錄下安裝這些依賴
執行./configure時若是出現「checking for cURL 7.15.5 or greater... configure: error: cURL version 7.15.5 or later is required to compile php with cURL support」錯誤,則說明curl版本低,須要安裝高版本。
wget https://curl.haxx.se/download/curl-7.20.0.tar.gz #獲取curl源代碼包 tar -zxvf curl-7.20.0.tar.gz #解壓縮 cd curl-7.20.0 ./configure --prefix=/usr/local/curl #生成Makefile文件,並將安裝目錄設置爲/usr/local/curl make #編譯 make install #安裝
從新執行./configure命令,此時須要修改一下第三行的--with-curl的值爲/usr/local/curl
./configure --prefix=/usr/local/php7 \ --with-apxs2=/usr/local/apache24/bin/apxs \ --with-config-file-path=/etc/php.ini \ --with-curl=/usr/local/curl \ --with-freetype-dir \ --with-gd \ --with-gettext \ --with-iconv-dir \ --with-kerberos \ --with-libdir=lib64 \ --with-libxml-dir \ --with-mysqli \ --with-openssl \ --with-pcre-regex \ --with-pdo-mysql \ --with-pdo-sqlite \ --with-pear \ --with-png-dir \ --with-xmlrpc \ --with-xsl \ --with-zlib \ --enable-fpm \ --enable-bcmath \ --enable-libxml \ --enable-inline-optimization \ --enable-mbregex \ --enable-mbstring \ --enable-opcache \ --enable-pcntl \ --enable-shmop \ --enable-soap \ --enable-sockets \ --enable-sysvsem \ --enable-xml \ --enable-zip
若是有「configure: error: png.h not found.」的錯誤信息,說明libpng以及devel沒有安裝,安裝便可
yum install libpng yum install libpng-devel
再次執行./configure命令,若是出現「configure: error: freetype-config not found.」錯誤,執行yum install freetype-devel命令安裝便可。
然後再次執行./configure命令,若是出現「configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution」錯誤,執行yum -y install libxslt libxslt-devel命令安裝便可。
然後再次執行./configure命令,若是出現「configure: error: Please reinstall the libzip distribution」錯誤,則須要安裝libzip-devel,執行yum install libzip-devel命令安裝便可。
再次執行./configure命令,提示libzip版本太低,下載編譯安裝高版本libzip
yum remove libzip -y #刪除舊版本libzip wget https://nih.at/libzip/libzip-1.2.0.tar.gz tar -zxvf libzip-1.2.0.tar.gz cd libzip-1.2.0 ./configure make && make install
再次執行./configure命令,若是出現「configure: error: off_t undefined; check your library configuration」錯誤,則修改一下指定文件
vim /etc/ld.so.conf #添加以下幾行 /usr/local/lib64 /usr/local/lib /usr/lib /usr/lib64 #保存退出 :wq ldconfig -v # 使之生效
再次執行./configure,執行成功(可能會有一個警告信息,能夠不用管,也能夠把它指定的擴展項刪除,從新執行一次./configure)
最後執行編譯和安裝
make #編譯 make test make install
若是make的時候,出現zipconf.h找不到錯誤,則把/usr/local/lib/libzip/zipconf.h移動到指定文件夾。
執行php -v命令查看php版本,若是可以看到php 7.3.5則表示php已經安裝成功(若是提示php is not command則表示沒有配置php的環境變量,此時只能用usr/local/php7/bin/php才能調用php命令,不過這個命令咱們也不經常使用,能夠不配置)
#查看php版本 .usr/local/php7/bin/php -v
php.ini是php的配置文件,能夠在apache的httpd.conf中設置這個文件的路徑
vim /usr/local/apache24/conf/httpd.conf #在最後加入下面這一行 PHPIniDir /etc/php.ini
而後在源代碼目錄/web/php-7.3.5/build目錄下找到php.ini-development,複製到/etc下並重命名爲php.ini
cp /web/php-7.3.5/build/php.ini-development /etc/php.ini
以前咱們在apache配置文件中將web站點設在了/mnt/tshare,如今咱們進入這個目錄,新建一個index.php
cd /mnt/tshare vim index.php #開始編輯 <?php phpinfo(); ?> #保存退出 :wq #重啓apache服務,而後訪問:localhost/index.php /usr/local/apache24/bin/apachectl restart
若是瀏覽器沒有解析php代碼,而是將代碼打印出來了,說明apache配置不完善
#配置httpd.conf vim /usr/local/apache24/conf/httpd.conf #找到<IfModule mine_module>標籤 #插入以下兩句 AddType application/x-httpd-php .html .htm .php AddType application/x-httpd-php-source .phps #保存退出並重啓apache服務,再次訪問瀏覽器,就能看到php.ini中的配置信息了
「Loaded Configuration File」表示實際加載的php.ini文件,也就咱們在httpd.conf中設置的路徑
總結部分主要講安裝過程時須要哪些依賴,安裝過程當中碰見了哪些錯誤
依賴:apr、apr-util、pcre 錯誤:/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_GetErrorCode'
依賴:卸載mariadb、cmake、boost 錯誤: cmake版本太低 gcc版本太低 「Cannot find appropriate system libraries for WITH_SSL=system」 「CMake Error at cmake/ssl.cmake:68 (MESSAGE):Please install the appropriate openssl developer package.」
依賴:無 錯誤: 「checking for cURL 7.15.5 or greater... configure: error: cURL version 7.15.5 or later is required to compile php with cURL support」 「configure: error: png.h not found.」 「configure: error: freetype-config not found.」 「configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution」 「configure: error: Please reinstall the libzip distribution」 「configure: error: off_t undefined; check your library configuration」
若是是第一本身配置環境,建議使用我這種方式一步一步來,若是使用rpm或者yum方式安裝,可能以後你會有不少東西本身漲不到位置。一鍵安裝雖然好,可是初學時不建議使用。