20 使用LNMP架構部署動態網站環境
20.1 源碼包程序
源碼包的可移植性非常好,幾乎可以在任何Linux系統中安裝使用,而RPM軟件包是針對特定系統和架構編寫的指令集,必須嚴格地符合執行環境才能順利安裝(即只會去“生硬地”安裝服務程序)。
使用源碼包安裝服務程序時會有一個編譯過程,因此可以更好地適應安裝主機的系統環境,運行效率和優化程度都會強於使用RPM軟件包安裝的服務程序。也就是說,可以將采用源碼包安裝服務程序的方式看作是針對系統的“量體裁衣”。
第1步:下載及解壓源碼包文件。為了方便在網絡中傳輸,源碼包文件通常會在歸檔后使用gzip或bzip2等格式進行壓縮,因此一般會具有.tar.gz與.tar.bz2的后綴。要想使用源碼包安裝服務程序,必須先把里面的內容解壓出來,然后再切換到源碼包文件的目錄中:
[root@linuxprobe ~]# tar xzvf FileName.tar.gz
[root@linuxprobe ~]# cd FileDirectory
第2步:編譯源碼包代碼。在正式使用源碼包安裝服務程序之前,還需要使用編譯腳本針對當前系統進行一系列的評估工作,包括對源碼包文件、軟件之間及函數庫之間的依賴關系、編譯器、匯編器及連接器進行檢查。我們還可以根據需要來追加--prefix參數,以指定稍后源碼包程序的安裝路徑,從而對服務程序的安裝過程更加可控。當編譯工作結束后,如果系統環境符合安裝要求,一般會自動在當前目錄下生成一個Makefile安裝文件。
[root@linuxprobe ~]# ./configure --prefix=/usr/local/program
第3步:生成二進制安裝程序。剛剛生成的Makefile文件中會保存有關系統環境、軟件依賴關系和安裝規則等內容,接下來便可以使用make命令來根據Makefile文件內容提供的合適規則編譯生成出真正可供用戶安裝服務程序的二進制可執行文件了。
[root@linuxprobe ~]# make
第4步:運行二進制的服務程序安裝包。由於不需要再檢查系統環境,也不需要再編譯代碼,因此運行二進制的服務程序安裝包應該是速度最快的步驟。如果在源碼包編譯階段使用了--prefix參數,那么此時服務程序就會被安裝到那個目錄,如果沒有自行使用參數定義目錄的話,一般會被默認安裝到/usr/local/bin目錄中。
[root@linuxprobe ~]# make install
第5步:清理源碼包臨時文件。由於在安裝服務程序的過程中進行了代碼編譯的工作,因此在安裝后目錄中會遺留下很多臨時垃圾文件,本着盡量不要浪費磁盤存儲空間的原則,可以使用make clean命令對臨時文件進行徹底的清理工作。
[root@linuxprobe ~]# make clean
估計有讀者會有疑問,為什么通常是安裝一個服務程序,源碼包的編譯工作(configure)與生成二進制文件的工作(make)會使用這么長的時間,而采用RPM軟件包安裝就特別有效率呢?其實原因很簡單,其實RPM軟件包就是把軟件的源碼包和一個針對特定系統、架構、環境編寫的安裝規定打包成一起的指令集,因此為了讓用戶都能使用這個軟件包來安裝程序,通常一個軟件程序會發布多種格式的RPM軟件包(例如i386、x86_64等架構)來讓用戶選擇。而源碼包的軟件作者肯定希望自己的軟件能夠被安裝到更多的系統上面,能夠被更多的用戶所了解、使用,因此便會在編譯階段(configure)來檢查用戶當前系統的情況,然后制定出一份可行的安裝方案,所以會占用很多的系統資源,需要更長的等待時間。
20.2 LNMP動態網站架構
在使用源碼包安裝服務程序之前,首先要讓安裝主機具備編譯程序源碼的環境,他需要具備C語言、C++語言、Perl語言的編譯器,以及各種常見的編譯支持函數庫程序。因此請先配置妥當Yum軟件倉庫,然后把下面列出的這些軟件包都統統安裝上:
[root@linuxprobe ~]# yum install -y apr* autoconf automake bison bzip2 bzip2* compat* cpp curl curl-devel fontconfig fontconfig-devel freetype freetype* freetype-devel gcc gcc-c++ gd gettext gettext-devel glibc kernel kernel-headers keyutils keyutils-libs-devel krb5-devel libcom_err-devel libpng libpng-devel libjpeg* libsepol-devel libselinux-devel libstdc++-devel libtool* libgomp libxml2 libxml2-devel libXpm* libtiff libtiff* make mpfr ncurses* ntp openssl openssl-devel patch pcre-devel perl php-common php-gd policycoreutils telnet t1lib t1lib* nasm nasm* wget zlib-devel
Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
………………省略部分安裝過程………………
Installing:
apr x86_64 1.4.8-3.el7 rhel7 103 k
apr-devel x86_64 1.4.8-3.el7 rhel7 188 k
apr-util x86_64 1.5.2-6.el7 rhel7 92 k
apr-util-devel x86_64 1.5.2-6.el7 rhel7 76 k
autoconf noarch 2.69-11.el7 rhel7 701 k
automake noarch 1.13.4-3.el7 rhel7 679 k
bison x86_64 2.7-4.el7 rhel7 578 k
bzip2-devel x86_64 1.0.6-12.el7 rhel7 218 k
compat-dapl x86_64 1:1.2.19-3.el7 rhel7 109 k
compat-db-headers noarch 4.7.25-27.el7 rhel7 48 k
compat-db47 x86_64 4.7.25-27.el7 rhel7 795 k
compat-gcc-44 x86_64 4.4.7-8.el7 rhel7 10 M
compat-gcc-44-c++ x86_64 4.4.7-8.el7 rhel7 6.3 M
compat-glibc x86_64 1:2.12-4.el7 rhel7 1.2 M
compat-glibc-headers x86_64 1:2.12-4.el7 rhel7 452 k
compat-libcap1 x86_64 1.10-7.el7 rhel7 19 k
compat-libf2c-34 x86_64 3.4.6-32.el7 rhel7 155 k
compat-libgfortran-41 x86_64 4.1.2-44.el7 rhel7 142 k
compat-libtiff3 x86_64 3.9.4-11.el7 rhel7 135 k
compat-openldap x86_64 1:2.3.43-5.el7 rhel7 174 k
cpp x86_64 4.8.2-16.el7 rhel7 5.9 M
fontconfig-devel x86_64 2.10.95-7.el7 rhel7 128 k
freetype-devel x86_64 2.4.11-9.el7 rhel7 355 k
gcc x86_64 4.8.2-16.el7 rhel7 16 M
gcc-c++ x86_64 4.8.2-16.el7 rhel7 7.1 M
………………省略部分安裝過程………………
Complete!
把安裝LNMP動態網站部署架構所需的16個軟件源碼包和1個用於檢查效果的論壇網站系統軟件包上傳到與本書配套的站點服務器上。大家可以在Windows系統中下載后通過ssh服務傳送到打算部署LNMP動態網站架構的Linux服務器中,也可以直接在Linux服務器中使用wget命令下載這些源碼包文件。根據第6章講解的FHS協議,建議把要安裝的軟件包存放在/usr/local/src目錄中:
[root@linuxprobe ~]# cd /usr/local/src
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/cmake-2.8.11.2.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/Discuz_X3.2_SC_GBK.zip
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/freetype-2.5.3.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/jpegsrc.v9a.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/libgd-2.1.0.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/libmcrypt-2.5.8.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/libpng-1.6.12.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/libvpx-v1.3.0.tar.bz2
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/mysql-5.6.19.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/nginx-1.6.0.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/openssl-1.0.1h.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/php-5.5.14.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/pcre-8.35.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/t1lib-5.1.2.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/tiff-4.0.3.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/yasm-1.2.0.tar.gz
[root@linuxprobe src] # wget https://www.linuxprobe.com/Software/zlib-1.2.8.tar.gz
[root@linuxprobe src]# ls
zlib-1.2.8.tar.gz libmcrypt-2.5.8.tar.gz pcre-8.35.tar.gz
cmake-2.8.11.2.tar.gz libpng-1.6.12.tar.gz php-5.5.14.tar.gz
Discuz_X3.2_SC_GBK.zip libvpx-v1.3.0.tar.bz2 t1lib-5.1.2.tar.gz
freetype-2.5.3.tar.gz mysql-5.6.19.tar.gz tiff-4.0.3.tar.gz
jpegsrc.v9a.tar.gz nginx-1.6.0.tar.gz yasm-1.2.0.tar.gz
libgd-2.1.0.tar.gz openssl-1.0.1h.tar.gz
CMake是Linux系統中一款常用的編譯工具。要想通過源碼包安裝服務程序,就一定要嚴格遵守上面總結的安裝步驟—下載及解壓源碼包文件、編譯源碼包代碼、生成二進制安裝程序、運行二進制的服務程序安裝包。接下來在解壓、編譯各個軟件包源碼程序時,都會生成大量的輸出信息,下文中將其省略,請讀者以實際操作為准。
[root@linuxprobe src]# tar xzvf cmake-2.8.11.2.tar.gz
[root@linuxprobe src]# cd cmake-2.8.11.2/
[root@linuxprobe cmake-2.8.11.2]# ./configure
[root@linuxprobe cmake-2.8.11.2]# make
[root@linuxprobe cmake-2.8.11.2]# make install
20.2.1 配置Mysql服務
本書在第18章講解過MySQL和MariaDB數據庫管理系統之間的因緣和特性,也狠狠地誇獎了MariaDB數據庫,但是MySQL數據庫當前依然是生產環境中最常使用的關系型數據庫管理系統之一,坐擁極大的市場份額,並且已經通過十幾年不斷的發展向業界證明了自身的穩定性和安全性。另外,雖然第18章已經講解了基本的數據庫管理知識,但是為了進一步幫助大家夯實基礎,本章依然在這里整合了MySQL數據庫內容,使大家在溫故的同時可以知新。
在使用Yum軟件倉庫安裝服務程序時,系統會自動根據RPM軟件包中的指令集完整軟件配置等工作。但是一旦選擇使用源碼包的方式來安裝,這一切就需要自己來完成了。針對MySQL數據庫來講,我們需要在系統中創建一個名為mysql的用戶,專門用於負責運行MySQL數據庫。請記得要把這類賬戶的Bash終端設置成nologin解釋器,避免黑客通過該用戶登錄到服務器中,從而提高系統安全性。
[root@linuxprobe cmake-2.8.11.2]# cd ..
[root@linuxprobe src]# useradd mysql -s /sbin/nologin
創建一個用於保存MySQL數據庫程序和數據庫文件的目錄,並把該目錄的所有者和所屬組身份修改為mysql。其中,/usr/local/mysql是用於保存MySQL數據庫服務程序的目錄,/usr/local/mysql/var則是用於保存真實數據庫文件的目錄。
[root@linuxprobe src]# mkdir -p /usr/local/mysql/var
[root@linuxprobe src]# chown -Rf mysql:mysql /usr/local/mysql
接下來解壓、編譯、安裝MySQL數據庫服務程序。在編譯數據庫時使用的是cmake命令,其中,-DCMAKE_INSTALL_PREFIX參數用於定義數據庫服務程序的保存目錄,-DMYSQL_DATADIR參數用於定義真實數據庫文件的目錄,-DSYSCONFDIR則是定義MySQL數據庫配置文件的保存目錄。由於MySQL數據庫服務程序比較大,因此編譯的過程比較漫長,在此期間可以稍微休息一下。
[root@linuxprobe src]# tar xzvf mysql-5.6.19.tar.gz
[root@linuxprobe src]# cd mysql-5.6.19/
[root@linuxprobe mysql-5.6.19]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/var -DSYSCONFDIR=/etc
[root@linuxprobe mysql-5.6.19]# make
[root@linuxprobe mysql-5.6.19]# make install
為了讓MySQL數據庫程序正常運轉起來,需要先刪除/etc目錄中的默認配置文件,然后在MySQL數據庫程序的保存目錄scripts內找到一個名為mysql_install_db的腳本程序,執行這個腳本程序並使用--user參數指定MySQL服務的對應賬號名稱(在前面步驟已經創建),使用--basedir參數指定MySQL服務程序的保存目錄,使用--datadir參數指定MySQL真實數據庫的文件保存目錄,這樣即可生成系統數據庫文件,也會生成出新的MySQL服務配置文件。
[root@linuxprobe mysql-5.6.19]# rm -rf /etc/my.cnf
[root@linuxprobe mysql-5.6.19]# cd /usr/local/mysql
[root@linuxprobe mysql]# ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var
把系統新生成的MySQL數據庫配置文件鏈接到/etc目錄中,然后把程序目錄中的開機程序文件復制到/etc/rc.d/init.d目錄中,以便通過service命令來管理MySQL數據庫服務程序。記得把數據庫腳本文件的權限修改成755以便於讓用戶有執行該腳本的權限:
[root@linuxprobe mysql]# ln -s my.cnf /etc/my.cnf
[root@linuxprobe mysql]# cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@linuxprobe mysql]# chmod 755 /etc/rc.d/init.d/mysqld
編輯剛復制的MySQL數據庫腳本文件,把第46、47行的basedir與datadir參數分別修改為MySQL數據庫程序的保存目錄和真實數據庫的文件內容。
[root@linuxprobe mysql]# vim /etc/rc.d/init.d/mysqld
………………省略部分輸出信息………………
39 #
40 # If you want to affect other MySQL variables, you should make your changes
41 # in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files.
42
43 # If you change base dir, you must also change datadir. These may get
44 # overwritten by settings in the MySQL configuration files.
45
46 basedir=/usr/local/mysql
47 datadir=/usr/local/mysql/var
48
………………省略部分輸出信息………………
配置好腳本文件后便可以用service命令啟動mysqld數據庫服務了。mysqld是MySQL數據庫程序的服務名稱,注意不要寫錯。順帶再使用chkconfig命令把mysqld服務程序加入到開機啟動項中。
[root@Linuxprobe mysql]# service mysqld start
Starting MySQL. SUCCESS!
[root@linuxprobe mysql]# chkconfig mysqld on
MySQL數據庫程序自帶了許多命令,但是Bash終端的PATH變量並不會包含這些命令所存放的目錄,因此我們也無法順利地對MySQL數據庫進行初始化,也就不能使用MySQL數據庫自帶的命令了。想要把命令所保存的目錄永久性地定義到PATH變量中,需要編輯/etc/profile文件並寫入追加的命令目錄,這樣當物理設備在下一次重啟時就會永久生效了。如果不想通過重啟設備的方式來生效,也可以使用source命令加載一下/ect/profile文件,此時新的PATH變量也可以立即生效了。
[root@linuxprobe mysql]# vim /etc/profile
………………省略部分輸出信息………………
64
65 for i in /etc/profile.d/*.sh ; do
66 if [ -r "$i" ]; then
67 if [ "${-#*i}" != "$-" ]; then
68 . "$i"
69 else
70 . "$i" >/dev/null
71 fi
72 fi
73 done
74 export PATH=$PATH:/usr/local/mysql/bin
75 unset i
76 unset -f pathmunge
[root@linuxprobe mysql]# source /etc/profile
MySQL數據庫服務程序還會調用到一些程序文件和函數庫文件。由於當前是通過源碼包方式安裝MySQL數據庫,因此現在也必須以手動方式把這些文件鏈接過來。
[root@linuxprobe mysql]# mkdir /var/lib/mysql
[root@linuxprobe mysql]# ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
[root@linuxprobe mysql]# ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
[root@linuxprobe mysql]# ln -s /usr/local/mysql/include/mysql /usr/include/mysql
現在,MySQL數據庫服務程序已經啟動,調用的各個函數文件已經就位,PATH環境變量中也加入了MySQL數據庫命令的所在目錄。接下來准備對MySQL數據庫進行初始化,這個初始化的配置過程與MariaDB數據庫是一樣的,只是最后變成了Thanks for using MySQL!
[root@linuxprobe mysql]# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none): 此處只需按下回車鍵
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n] y (要為root管理員設置數據庫的密碼)
New password: 輸入要為root管理員設置的數據庫密碼
Re-enter new password: 再輸入一次密碼
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y (刪除匿名賬戶)
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y (禁止root管理員從遠程登錄)
... Success!
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y (刪除test數據庫並取消對其的訪問權限)
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y (刷新授權表,讓初始化后的設定立即生效)
... Success!
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!
Cleaning up...
20.2.2 配置Nginx服務
在正式安裝Nginx服務程序之前,我們還需要為其解決相關的軟件依賴關系,例如用於提供Perl語言兼容的正則表達式庫的軟件包pcre,就是Nginx服務程序用於實現偽靜態功能必不可少的依賴包。下面來解壓、編譯、生成、安裝Nginx服務程序的源碼文件:
[root@linuxprobe ~]# cd /usr/local/src
[root@linuxprobe src]# tar xzvf pcre-8.35.tar.gz
[root@linuxprobe src]# cd pcre-8.35
[root@linuxprobe pcre-8.35]# ./configure --prefix=/usr/local/pcre
[root@linuxprobe pcre-8.35]# make
[root@linuxprobe pcre-8.35]# make install
openssl軟件包是用於提供網站加密證書服務的程序文件,在安裝該程序時需要自定義服務程序的安裝目錄,以便於稍后調用它們的時候更可控。
[root@linuxprobe pcre-8.35]# cd /usr/local/src
[root@linuxprobe src]# tar xzvf openssl-1.0.1h.tar.gz
[root@linuxprobe src]# cd openssl-1.0.1h
[root@linuxprobe openssl-1.0.1h]# ./config --prefix=/usr/local/openssl
[root@linuxprobe openssl-1.0.1h]# make
[root@linuxprobe openssl-1.0.1h]# make install
openssl軟件包安裝后默認會在/usr/local/openssl/bin目錄中提供很多的可用命令,我們需要像前面的操作那樣,將這個目錄添加到PATH環境變量中,並寫入到配置文件中,最后執行source命令以便讓新的PATH環境變量內容可以立即生效:
[root@linuxprobe pcre-8.35]# vim /etc/profile
………………省略部分輸出信息………………
64
65 for i in /etc/profile.d/*.sh ; do
66 if [ -r "$i" ]; then
67 if [ "${-#*i}" != "$-" ]; then
68 . "$i"
69 else
70 . "$i" >/dev/null
71 fi
72 fi
73 done
74 export PATH=$PATH:/usr/local/mysql/bin:/usr/local/openssl/bin
75 unset i
76 unset -f pathmunge
[root@linuxprobe pcre-8.35]# source /etc/profile
zlib軟件包是用於提供壓縮功能的函數庫文件。其實Nginx服務程序調用的這些服務程序無需深入了解,只要大致了解其作用就已經足夠了:
[root@linuxprobe pcre-8.35]# cd /usr/local/src
[root@linuxprobe src]# tar xzvf zlib-1.2.8.tar.gz
[root@linuxprobe src]# cd zlib-1.2.8
[root@linuxprobe zlib-1.2.8]# ./configure --prefix=/usr/local/zlib
[root@linuxprobe zlib-1.2.8]# make
[root@linuxprobe zlib-1.2.8]# make install
在安裝部署好具有依賴關系的軟件包之后,創建一個用於執行Nginx服務程序的賬戶。賬戶名稱可以自定義,但一定別忘記,因為在后續需要調用:
[root@linuxprobe zlib-1.2.8]# cd ..
[root@linuxprobe src]# useradd www -s /sbin/nologin
在使用命令編譯Nginx服務程序時,需要設置特別多的參數,其中,--prefix參數用於定義服務程序稍后安裝到的位置,--user與--group參數用於指定執行Nginx服務程序的用戶名和用戶組。在使用參數調用openssl、zlib、pcre軟件包時,請寫出軟件源碼包的解壓路徑,而不是程序的安裝路徑:
[root@linuxprobe src]# tar xzvf nginx-1.6.0.tar.gz
[root@linuxprobe src]# cd nginx-1.6.0/
[root@linuxprobe nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --without-http_memcached_module --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-openssl=/usr/local/src/openssl-1.0.1h --with-zlib=/usr/local/src/zlib-1.2.8 --with-pcre=/usr/local/src/pcre-8.35
[root@linuxprobe nginx-1.6.0]# make
[root@linuxprobe nginx-1.6.0]# make install
要想啟動Nginx服務程序以及將其加入到開機啟動項中,也需要有腳本文件。可惜的是,在安裝完Nginx軟件包之后默認並沒有為用戶提供腳本文件,因此給各位讀者准備了一份可用的啟動腳本文件,大家只需在/etc/rc.d/init.d目錄中創建腳本文件並直接復制下面的腳本內容即可(相信各位讀者在掌握了第4章的內容之后,應該可以順利看懂這個腳本文件)。
[root@linuxprobe nginx-1.6.0]# vim /etc/rc.d/init.d/nginx
#!/bin/bash
# nginx - this script starts and stops the nginx daemon
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
if [ -z "`grep $user /etc/passwd`" ]; then
useradd -M -s /bin/nologin $user
fi
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
#configtest || return $?
stop
sleep 1
start
}
reload() {
#configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
保存腳本文件后記得為其賦予755權限,以便能夠執行這個腳本。然后以絕對路徑的方式執行這個腳本,通過restart參數重啟Nginx服務程序,最后再使用chkconfig命令將Nginx服務程序添加至開機啟動項中。大功告成!
[root@linuxprobe nginx-1.6.0]# chmod 755 /etc/rc.d/init.d/nginx
[root@linuxprobe nginx-1.6.0]# /etc/rc.d/init.d/nginx restart
Restarting nginx (via systemctl): [ OK ]
[root@linuxprobe nginx-1.6.0]# chkconfig nginx on
Nginx服務程序在啟動后就可以在瀏覽器中輸入服務器的IP地址來查看到默認網頁了。相較於Apache服務程序的紅色默認頁面,Nginx服務程序的默認頁面顯得更加簡潔,如圖20-2所示。
圖20-3 Nginx服務程序的默認頁面
20.2.3 配置php服務
PHP(Hypertxt Preprocessor,超文本預處理器)是一種通用的開源腳本語言,發明於1995年,它吸取了C語言、Java語言及Perl語言的很多優點,具有開源、免費、快捷、跨平台性強、效率高等優良特性,是目前Web開發領域最常用的語言之一。本書的配套站點就是基於PHP語言編寫的。
使用源碼包的方式編譯安裝PHP語言環境其實並不復雜,難點在於解決PHP的程序包和其他軟件的依賴關系。為此需要先安裝部署將近十個用於搭建網站頁面的軟件程序包,然后才能正式安裝PHP程序。
yasm源碼包是一款常見的開源匯編器,其解壓、編譯、安裝過程中生成的輸出信息均已省略:
[root@linuxprobe nginx-1.6.0]# cd ..
[root@linuxprobe src]# tar zxvf yasm-1.2.0.tar.gz
[root@linuxprobe src]# cd yasm-1.2.0
[root@linuxprobe yasm-1.2.0]# ./configure
[root@linuxprobe yasm-1.2.0]# make
[root@linuxprobe yasm-1.2.0]# make install
libmcrypt源碼包是用於加密算法的擴展庫程序,其解壓、編譯、安裝過程中生成的輸出信息均已省略:
[root@linuxprobe yasm-1.2.0]# cd ..
[root@linuxprobe src]# tar zxvf libmcrypt-2.5.8.tar.gz
[root@linuxprobe src]# cd libmcrypt-2.5.8
[root@linuxprobe libmcrypt-2.5.8]# ./configure
[root@linuxprobe libmcrypt-2.5.8]# make
[root@linuxprobe libmcrypt-2.5.8]# make install
libvpx源碼包是用於提供視頻編碼器的服務程序,其解壓、編譯、安裝過程中生成的輸出信息均已省略。相信會有很多粗心的讀者順手使用了tar命令的xzvf參數,但如果仔細觀察就會發現libvpx源碼包的后綴是.tar.bz2,即表示使用bzip2格式進行的壓縮,因此正確的解壓參數應該是xjvf:
[root@linuxprobe libmcrypt-2.5.8]# cd ..
[root@linuxprobe src]# tar xjvf libvpx-v1.3.0.tar.bz2
[root@linuxprobe src]# cd libvpx-v1.3.0
[root@linuxprobe libvpx-v1.3.0]# ./configure --prefix=/usr/local/libvpx --enable-shared --enable-vp9
[root@linuxprobe libvpx-v1.3.0]# make
[root@linuxprobe libvpx-v1.3.0]# make install
tiff源碼包是用於提供標簽圖像文件格式的服務程序,其解壓、編譯、安裝過程中生成的輸出信息均已省略:
[root@linuxprobe libvpx-v1.3.0]# cd ..
[root@linuxprobe src]# tar zxvf tiff-4.0.3.tar.gz
[root@linuxprobe src]# cd tiff-4.0.3
[root@linuxprobe tiff-4.0.3]# ./configure --prefix=/usr/local/tiff --enable-shared
[root@linuxprobe tiff-4.0.3]# make
[root@linuxprobe tiff-4.0.3]# make install
libpng源碼包是用於提供png圖片格式支持函數庫的服務程序,其解壓、編譯、安裝過程中生成的輸出信息均已省略:
[root@linuxprobe tiff-4.0.3]# cd ..
[root@linuxprobe src]# tar zxvf libpng-1.6.12.tar.gz
[root@linuxprobe src]# cd libpng-1.6.12
[root@linuxprobe libpng-1.6.12]# ./configure --prefix=/usr/local/libpng --enable-shared
[root@linuxprobe libpng-1.6.12]# make
[root@linuxprobe libpng-1.6.12]# make install
freetype源碼包是用於提供字體支持引擎的服務程序,其解壓、編譯、安裝過程中生成的輸出信息均已省略:
[root@linuxprobe libpng-1.6.12]# cd ..
[root@linuxprobe src]# tar zxvf freetype-2.5.3.tar.gz
[root@linuxprobe src]# cd freetype-2.5.3
[root@linuxprobe freetype-2.5.3]# ./configure --prefix=/usr/local/freetype --enable-shared
[root@linuxprobe freetype-2.5.3]# make
[root@linuxprobe freetype-2.5.3]# make install
jpeg源碼包是用於提供jpeg圖片格式支持函數庫的服務程序,其解壓、編譯、安裝過程中生成的輸出信息均已省略:
[root@linuxprobe freetype-2.5.3]# cd ..
[root@linuxprobe src]# tar zxvf jpegsrc.v9a.tar.gz
[root@linuxprobe src]# cd jpeg-9a
[root@linuxprobe jpeg-9a]# ./configure --prefix=/usr/local/jpeg --enable-shared
[root@linuxprobe jpeg-9a]# make
[root@linuxprobe jpeg-9a]# make install
libgd源碼包是用於提供圖形處理的服務程序,其解壓、編譯、安裝過程中生成的輸出信息均已省略。在編譯libgd源碼包時,請記得寫入的是jpeg、libpng、freetype、tiff、libvpx等服務程序在系統中的安裝路徑,即在上面安裝過程中使用--prefix參數指定的目錄路徑:
[root@linuxprobe jpeg-9a]# cd ..
[root@linuxprobe src]# tar zxvf libgd-2.1.0.tar.gz
[root@linuxprobe src]# cd libgd-2.1.0
[root@linuxprobe libgd-2.1.0]# ./configure --prefix=/usr/local/libgd --enable-shared --with-jpeg=/usr/local/jpeg --with-png=/usr/local/libpng --with-freetype=/usr/local/freetype --with-fontconfig=/usr/local/freetype --with-xpm=/usr/ --with-tiff=/usr/local/tiff --with-vpx=/usr/local/libvpx
[root@linuxprobe libgd-2.1.0]# make
[root@linuxprobe libgd-2.1.0]# make install
t1lib源碼包是用於提供圖片生成函數庫的服務程序,其解壓、編譯、安裝過程中生成的輸出信息均已省略。安裝后把/usr/lib64目錄中的函數文件鏈接到/usr/lib目錄中,以便系統能夠順利調取到函數文件:
[root@linuxprobe cd libgd-2.1.0]# cd ..
[root@linuxprobe src]# tar zxvf t1lib-5.1.2.tar.gz
[root@linuxprobe src]# cd t1lib-5.1.2
[root@linuxprobe t1lib-5.1.2]# ./configure --prefix=/usr/local/t1lib --enable-shared
[root@linuxprobe t1lib-5.1.2]# make
[root@linuxprobe t1lib-5.1.2]# make install
[root@linuxprobe t1lib-5.1.2]# ln -s /usr/lib64/libltdl.so /usr/lib/libltdl.so
[root@linuxprobe t1lib-5.1.2]# cp -frp /usr/lib64/libXpm.so* /usr/lib/
此時終於把編譯php服務源碼包的相關軟件包都已經安裝部署妥當了。在開始編譯php源碼包之前,先定義一個名為LD_LIBRARY_PATH的全局環境變量,該環境變量的作用是幫助系統找到指定的動態鏈接庫文件,這些文件是編譯php服務源碼包的必須元素之一。編譯php服務源碼包時,除了定義要安裝到的目錄以外,還需要依次定義配置php服務程序配置文件的保存目錄、MySQL數據庫服務程序所在目錄、MySQL數據庫服務程序配置文件所在目錄,以及libpng、jpeg、freetype、libvpx、zlib、t1lib等服務程序的安裝目錄路徑,並通過參數啟動php服務程序的諸多默認功能:
[root@linuxprobe t1lib-5.1.2]# cd ..
[root@linuxprobe src]# tar -zvxf php-5.5.14.tar.gz
[root@linuxprobe src]# cd php-5.5.14
[root@linuxprobe php-5.5.14]# export LD_LIBRARY_PATH=/usr/local/libgd/lib
[root@linuxprobe php-5.5.14]# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-mysql-sock=/tmp/mysql.sock --with-pdo-mysql=/usr/local/mysql --with-gd --with-png-dir=/usr/local/libpng --with-jpeg-dir=/usr/local/jpeg --with-freetype-dir=/usr/local/freetype --with-xpm-dir=/usr/ --with-vpx-dir=/usr/local/libvpx/ --with-zlib-dir=/usr/local/zlib --with-t1lib=/usr/local/t1lib --with-iconv --enable-libxml --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-opcache --enable-mbregex --enable-fpm --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --enable-session --with-mcrypt --with-curl --enable-ctype
[root@linuxprobe php-5.5.14]# make
[root@linuxprobe php-5.5.14]# make install
在php源碼包程序安裝完成后,需要刪除當前默認的配置文件,然后將php服務程序目錄中相應的配置文件復制過來:
[root@linuxprobe php-5.5.14]# rm -rf /etc/php.ini
[root@linuxprobe php-5.5.14]# ln -s /usr/local/php/etc/php.ini /etc/php.ini
[root@linuxprobe php-5.5.14]# cp php.ini-production /usr/local/php/etc/php.ini
[root@linuxprobe php-5.5.14]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
[root@linuxprobe php-5.5.14]# ln -s /usr/local/php/etc/php-fpm.conf /etc/php-fpm.conf
php-fpm.conf是php服務程序重要的配置文件之一,我們需要啟用該配置文件中第25行左右的pid文件保存目錄,然后分別將第148和149行的user與group參數分別修改為www賬戶和用戶組名稱:
[root@linuxprobe php-5.5.14]# vim /usr/local/php/etc/php-fpm.conf
1 ;;;;;;;;;;;;;;;;;;;;;
2 ; FPM Configuration ;
3 ;;;;;;;;;;;;;;;;;;;;;
4
5 ; All relative paths in this configuration file are relative to PHP's instal l
6 ; prefix (/usr/local/php). This prefix can be dynamically changed by using t he
7 ; '-p' argument from the command line.
8
9 ; Include one or more files. If glob(3) exists, it is used to include a bunc h of
10 ; files from a glob(3) pattern. This directive can be used everywhere in the
11 ; file.
12 ; Relative path can also be used. They will be prefixed by:
13 ; - the global prefix if it's been set (-p argument)
14 ; - /usr/local/php otherwise
15 ;include=etc/fpm.d/*.conf
16
17 ;;;;;;;;;;;;;;;;;;
18 ; Global Options ;
19 ;;;;;;;;;;;;;;;;;;
20
21 [global]
22 ; Pid file
23 ; Note: the default prefix is /usr/local/php/var
24 ; Default Value: none
25 pid = run/php-fpm.pid
26
………………省略部分輸出信息………………
145 ; Unix user/group of processes
146 ; Note: The user is mandatory. If the group is not set, the default user's g roup
147 ; will be used.
148 user = www
149 group = www
150
………………省略部分輸出信息………………
配置妥當后便可把用於管理php服務的腳本文件復制到/etc/rc.d/init.d中了。為了能夠執行腳本,請記得為腳本賦予755權限。最后把php-fpm服務程序加入到開機啟動項中:
[root@linuxprobe php-5.5.14]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
[root@linuxprobe php-5.5.14]# chmod 755 /etc/rc.d/init.d/php-fpm
[root@linuxprobe php-5.5.14]# chkconfig php-fpm on
由於php服務程序的配置參數直接會影響到Web服務服務的運行環境,因此,如果默認開啟了一些不必要且高危的功能(如允許用戶在網頁中執行Linux命令),則會降低網站被入侵的難度,入侵人員甚至可以拿到整台Web服務器的管理權限。因此我們需要編輯php.ini配置文件,在305行的disable_functions參數后面追加上要禁止的功能。下面的禁用功能名單是依據網站運行的經驗而定制的,不見得適合每個生產環境,建議大家在此基礎上根據自身工作需求酌情刪減:
[root@linuxprobe php-5.5.14]# vim /usr/local/php/etc/php.ini
………………省略部分輸出信息………………
300
301 ; This directive allows you to disable certain functions for security reasons.
302 ; It receives a comma-delimited list of function names. This directive is
303 ; *NOT* affected by whether Safe Mode is turned On or Off.
304 ; http://php.net/disable-functions
305 disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restor e,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,g etservbyname,getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,po six_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix_getppid,posix_getpwnam,posix_ getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_ setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname
306
………………省略部分輸出信息………………
這樣就把php服務程序配置妥當了。最后,還需要編輯Nginx服務程序的主配置文件,把第2行的井號(#)刪除,然后在后面寫上負責運行Nginx服務程序的賬戶名稱和用戶組名稱;在第45行的index參數后面寫上網站的首頁名稱。最后是將第65~71行參數前的井號(#)刪除來啟用參數,主要是修改第69行的腳本名稱路徑參數,其中$document_root變量即為網站信息存儲的根目錄路徑,若沒有設置該變量,則Nginx服務程序無法找到網站信息,因此會提示“404頁面未找到”的報錯信息。在確認參數信息填寫正確后便可重啟Nginx服務與php-fpm服務。
[root@linuxprobe php-5.5.14]# vim /usr/local/nginx/conf/nginx.conf
1
2 user www www;
3 worker_processes 1;
4
5 #error_log logs/error.log;
6 #error_log logs/error.log notice;
7 #error_log logs/error.log info;
8
9 #pid logs/nginx.pid;
10
11
………………省略部分輸出信息………………
40
41 #access_log logs/host.access.log main;
42
43 location / {
44 root html;
45 index index.html index.htm index.php;
46 }
47
………………省略部分輸出信息………………
62
63 #pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
64
65 location ~ \.php$ {
66 root html;
67 fastcgi_pass 127.0.0.1:9000;
68 fastcgi_index index.php;
69 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
70 include fastcgi_params;
71 }
72
………………省略部分輸出信息………………
[root@linuxprobe php-5.5.14]# systemctl restart nginx
[root@linuxprobe php-5.5.14]# systemctl restart php-fpm
至此,LNMP動態網站環境架構的配置實驗全部結束。
20.3 搭建Discuz論壇
為了檢驗LNMP動態網站環境是否配置妥當,可以使用在上面部署Discuz!系統,然后查看結果。如果能夠在LNMP動態網站環境中成功安裝使用Discuz!論壇系統,也就意味着這套架構是可用的。Discuz! X3.2是國內最常見的社區論壇系統,在經過十多年的研發后已經成為了全球成熟度最高、覆蓋率最廣的論壇網站系統之一。
Discuz! X3.2軟件包的后綴是.zip格式,因此應當使用專用的unzip命令來進行解壓。解壓后會在當前目錄中出現一個名為upload的文件目錄,這里面保存的就是Discuz!論壇的系統程序。我們把Nginx服務程序網站根目錄的內容清空后,就可以把這些這個目錄中的文件都復制進去了。記得把Nginx服務程序的網站根目錄的所有者和所屬組修改為本地的www用戶(已在20.2.2小節創建),並為其賦予755權限以便於能夠讀、寫、執行該論壇系統內的文件。
[root@linuxprobe php-5.5.14 ]# cd /usr/local/src/
[root@linuxprobe src]# unzip Discuz_X3.2_SC_GBK.zip
[root@linuxprobe src]# rm -rf /usr/local/nginx/html/{index.html,50x.html}*
[root@linuxprobe src]# mv upload/* /usr/local/nginx/html/
[root@linuxprobe src]# chown -Rf www:www /usr/local/nginx/html
[root@linuxprobe src]# chmod -Rf 755 /usr/local/nginx/html
第1步:接受Discuz!安裝向導的許可協議。在把Discuz!論壇系統程序(即剛才upload目錄中的內容)復制Nginx服務網站根目錄后便可刷新瀏覽器頁面,這將自動跳轉到Discuz! X3.2論壇系統的安裝界面,此處需單擊“我同意”按鈕,進入下一步的安裝過程中,如圖20-4所示。
圖20-4 接受Discuz! X3.2論壇系統的安裝許可
第2步:檢查Discuz! X3.2論壇系統的安裝環境及目錄權限。我們部署的LNMP動態網站環境版本和軟件都與Discuz!論壇的要求相符合,如果圖20-5框中的目錄狀態為不可寫,請自行檢查目錄的所有者和所屬組是否為www用戶,以及是否對目錄設置了755權限,然后單擊“下一步”按鈕。
圖20-5 檢查Discuz! X3.2論壇系統的安裝環境及目錄權限
第3步:選擇“全新安裝Discuz! X(含UCenter Server)”。UCenter Server是站點的管理平台,能夠在多個站點之間同步會員賬戶及密碼信息,單擊“下一步”按鈕,如圖20-6所示。
圖20-6 選擇全新安裝Discuz!論壇及UCenter Server
第4步:填寫服務器的數據庫信息與論壇系統管理員信息。網站系統使用由服務器本地(localhost)提供的數據庫服務,數據名稱與數據表前綴可由用戶自行填寫,其中數據庫的用戶名和密碼則為用於登錄MySQL數據庫的信息(以初始化MySQL服務程序時填寫的信息為准)。論壇系統的管理員賬戶為今后登錄、管理Discuz!論壇時使用的驗證信息,其中賬戶可以設置得簡單好記一些,但是要將密碼設置得盡可能復雜一下。在信息填寫正確后單擊“下一步”按鈕,如圖20-7所示。
圖20-7 填寫服務器的數據庫信息與論壇系統管理員信息
第5步:等待Discuz! X3.2論壇系統安裝完畢,如圖20-8所示。這個安裝過程是非常快速的,大概只需要30秒左右,然后就可看到論壇安裝完成的歡迎界面了。由於虛擬機主機可能並沒有連接到互聯網,因此該界面中可能無法正常顯示Discuz!論壇系統的廣告信息。在接入了互聯網的服務器上成功安裝完Discuz! X3.2論壇系統之后,其界面如圖20-9所示。隨后單擊“您的論壇已完成安裝,點此訪問”按鈕,即可訪問到論壇首頁,如圖20-10所示。
圖20-8 等待Discuz! X3.2論壇系統安裝完畢
圖20-9 成功安裝Discuz! X3.2論壇系統后的歡迎界面
圖20-10 Discuz! X3.2論壇系統的首頁界面
20.4 選購服務器主機
我們日常訪問的網站是由域名、網站源程序和主機共同組成的,其中,主機則是用於存放網頁源代碼並能夠把網頁內容展示給用戶的服務器。在本書即將結束之際.
虛擬主機:在一台服務器中划分一定的磁盤空間供用戶放置網站信息、存放數據等;僅提供基礎的網站訪問、數據存放與傳輸功能;能夠極大地降低用戶費用,也幾乎不需要用戶來維護網站以外的服務;適合小型網站。
VPS(Virtual Private Server,虛擬專用服務器):在一台服務器中利用OpenVZ、Xen或KVM等虛擬化技術模擬出多台“主機”(即VPS),每個主機都有獨立的IP地址、操作系統;不同VPS之間的磁盤空間、內存、CPU、進程與系統配置完全隔離,用戶可自由使用分配到的主機中的所有資源,為此需要具備一定的維護系統的能力;適合小型網站。
ECS(Elastic Compute Service,雲服務器):是一種整合了計算、存儲、網絡,能夠做到彈性伸縮的計算服務;使用起來與VPS幾乎一樣,差別是雲服務器是建立在一組集群服務器中,每個服務器都會保存一個主機的鏡像(備份),從而大大提升了安全性和穩定性;另外還具備靈活性與擴展性;用戶只需按使用量付費即可;適合大中小型網站。
獨立服務器:這台服務器僅提供給用戶一個人使用,其使用方式分為租用方式與托管方式。租用方式是用戶將服務器的硬件配置要求告知IDC服務商,按照月、季、年為單位來租用它們的硬件設備。這些硬件設備由IDC服務商的機房負責維護,用戶一般需要自行安裝相應的軟件並部署網站服務,這減輕了用戶在硬件設備上的投入,適合大中型網站。托管方式則是用戶需要自行購置服務器硬件設備,並將其交給IDC服務供應商進行管理(需要繳納管理服務費)。用戶對服務器硬件配置有完全的控制權,自主性強,但需要自行維護、修理服務器硬件設備,適合大中型網站。