WEB平臺架構之:LNMP(CentOS6.5+Nginx+MySQL+Php)
爲了寫Nginx的系列教程,在介紹Nginx的各項功能時,能有個測試的環境,因此於此寫一篇LNMP的架構搭建,使那些看文檔的人能夠搭建自己的環境來測試Nginx的功能。但是通常情況下nginx用作純web站點不是很多,更多的是將nginx用在反向代理環境中。但是由於nginx處理靜態文件的優越性能,也常常會使用nginx配合php來實現動靜分離,起到web響應加速的功能.
1.準備工作
OS:CentOS6.5x64
hostname:test2.lxm.com
ip:10.0.10.12
software: /root/soft/
nginx-1.6.1.tar.gz
pcre-8.33.tar.gz
openssl-1.0.1i.tar.gz
mysql-5.5.27.tar.gz
php-5.5.16.tar.gz
libmcrypt-2.5.7.tar.gz
mhash-0.9.9.tar.gz
software install path:/usr/local/
注意:在準備工作中,要準備好一臺centos系統,配置好網絡環境和yum源,準備好要用的軟件包,決定好軟件包放置的位置和要安裝的位置。其次安裝過程全部採用源碼包編譯安裝。
#yum -y install gcc* compact-gcc* autoconf automake make cmake
//安裝編譯安裝需要的編譯軟件,如果系統已經安裝過了,則無需再次安裝
#iptables -F;service iptables stop;chkconfig iptables off
//關閉防火牆,生產環境中不建議關閉iptables
//臨時關閉selinux
#setenforce 0
如果想永久關閉selinux,則修改配置文件
2.安裝nginx
#cd /root/soft
#tar -zxvf openssl-1.0.1i.tar.gz
#tar -zxvf pcre-8.35.tar.gz
#tar -zxvf nginx-1.6.1.tar.gz
#cd nginx-1.6.1
#mkdir -pv /usr/local/nginx {client_body_temp,proxy_temp,fastcgi_temp,uwsgi_temp,scgi_temp}
#./configure --prefix=/usr/local/nginx/ --with-pcre=/root/soft/pcre-8.35 --with-http_ssl_module --with-openssl=/root/soft/openssl-1.0.1i --with-http_gzip_static_module --with-http_realip_module --with-http_stub_status_module --http-client-body-temp-path=/usr/local/nginx/client_body_temp/ --http-proxy-temp-path=/usr/local/nginx/proxy_temp/ --http-fastcgi-temp-path=/usr/local/nginx/fastcgi_temp/ --http-uwsgi-temp-path=/usr/local/nginx/uwsgi_temp/ --http-scgi-temp-path=/usr/local/nginx/scgi_temp/
#make && make install
#make clean
到此,如果沒有什麼報錯,則基本安裝成功。不過要注意的是pcre和openssl用的都是源碼包
測試nginx:
#/usr/local/nginx/sbin/nginx //啓動nginx
#ps aux | grep nginx //查看nginx進程是否啓動成功
#netstat -nultp | grep 80 //查看80端口是否監聽,nginx默認監聽在80端口
瀏覽器測試;
http://10.0.10.12 //如果正常出現nginx的歡迎頁面,則表示nginx安裝成功
拓展:
給大家介紹一個linux下的文本瀏覽器elinks,以後本地測試時,可以直接在linux系統中進行測試。
#yum -y install elinks
#links --dump http://10.0.10.12 //直接打印出web站點的內容,如果想以交互式的界面訪問,則直接敲入elinks回車即可。
3.安裝MySQL
#yum -y install zlib-devel openssl-devel ncurses-devel bison//因爲下面編譯mysql用到了這幾個開發文件,所以必須安裝好
#cd /root/soft/
#tar -zxvf mysql-5.5.27.tar.gz
#cd mysql-5.5.27
#mkdir /usr/local/mysql
#useradd -s /sbin/nologin mysql -M
#cmake
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/data/mysqldata (注:這裏在企業環境中,通常會用一個單獨的目錄來存放mysql的數據文件,如果業務小可以不用,默認放在/var/lib/mysql下面)
-DSYSCONFDIR=/etc
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock
-DENABLED_LOCAL_INFILE=1
-DWITH_READLINE=1
-DWITH_SSL=system
-DWITH_ZLIB=system
-DWITH_LIBWRAP=0
-DMYSQL_TCP_PORT=3306
-DEXTRA_CHARSETS=all
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_EXTRA_CHARSETS:STRING=all
-DMYSQL_USER=mysql
-DWITH_DEBUG=0
#make
#make install
#make clean
#chown -R mysql.mysql /usr/local/mysql
#chown -R mysql.mysql /data/mysqldata
#cd /usr/local/mysql/scripts
#mysql_install_db --datadir=/data/mysqldata --basedir=/usr/local/mysql --user=mysql
#cd ../support-files
#cp my-large.cnf /etc/rc.d/my.cnf
#cp -p mysql.server /etc/rc.d/init.d/mysqld
#chown -R root.mysql /usr/local/mysql
#service mysqld start
#mysqladmin -u root passwod "lxm" //設置MySQL root用戶的密碼
#mysql -u root -p
輸入root密碼,測試mysql安裝是否成功
到此,如果一切都沒有錯誤,則表示mysql安裝成功
4.安裝PHP
php的安裝和使用,確實是值得一說的技術,但是這裏只做簡單的安裝使用。關於詳細的安裝使用將在LAMP中詳細的聊一聊。。。
安裝必須的軟件包:
#yum -y install ncurses-devel net-snmp-devel bzip2 bzip2-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype-devel libxml2 libxml2-devel libxslt libxslt-devel zlib zlib-devel expat expat-devel openssl openssl-devel gd php-gd libjpeg libjpeg-devel libtool libtool-ltdl libtool-ltdl-devel
安裝libmcrypt和mhash //這兩個東西都是爲php提供加密算法相關的庫文件的
#cd /root/soft
#tar -zxvf libmcrypt-2.5.7.tar.gz
#cd libmcrypt-2.5.7
#mkdir /usr/local/libmcrypt
#./configure --prefix=/usr/local/libmcrypt
#make && make install
#make clean
#cd /root/soft
#tar -zxvf mhash-0.9.9.tar.gz
#cd mhash-0.9.9
#mkdir /usr/local/mhash
#./configure --prefix=/usr/local/mhash
#make && make install
#make clean
安裝php:
#cd /root/soft/
#tar -zxvf php-5.5.16.tar.gz
#cd php-5.5.16
#mkdir /usr/local/php55
#./configure --prefix=/usr/local/php55/ --with-libxml-dir=/usr/include/libxml2/ --with-config-file-path=/etc --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-gd --enable-gd-native-ttf --with-zlib --with-mcrypt=/usr/local/libmcrypt/ --with-mhash=/usr/local/mhash/ --with-pdo-mysql=mysqlnd --enable-fpm --enable-shmop --enable-soap --enable-sockets --enable-wddx --enable-zip --with-xmlrpc --enable-mbstring --with-zlib-dir=/usr/lib --with-bz2 --with-curl --enable-exif --enable-ftp --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-freetype-dir=/usr/lib --with-pcre-dir --enable-bcmath --with-config-file-scan-dir=/etc/php.d/ --with-openssl
如果沒有錯誤,將會顯示下面的內容:
Generating files
configure: creating ./config.status
creating main/internal_functions.c
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
| License: |
| This software is subject to the PHP License, available in this |
| distribution in the file LICENSE. By continuing this installation |
| process, you are bound by the terms of this license agreement. |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point. |
+--------------------------------------------------------------------+
Thank you for using PHP.
config.status: creating php5.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/fpm/php-fpm.conf
config.status: creating sapi/fpm/init.d.php-fpm
config.status: creating sapi/fpm/php-fpm.service
config.status: creating sapi/fpm/php-fpm.8
config.status: creating sapi/fpm/status.html
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands
#make && make install
如果沒有錯誤將顯示下面的內容:
Installing shared extensions: /usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/
Installing PHP CLI binary: /usr/local/php55/bin/
Installing PHP CLI man page: /usr/local/php55/php/man/man1/
Installing PHP FPM binary: /usr/local/php55/sbin/
Installing PHP FPM config: /usr/local/php55/etc/
Installing PHP FPM man page: /usr/local/php55/php/man/man8/
Installing PHP FPM status page: /usr/local/php55/php/fpm/
Installing PHP CGI binary: /usr/local/php55/bin/
Installing PHP CGI man page: /usr/local/php55/php/man/man1/
Installing build environment: /usr/local/php55/lib/php/build/
Installing header files: /usr/local/php55/include/php/
Installing helper programs: /usr/local/php55/bin/
program: phpize
program: php-config
Installing man pages: /usr/local/php55/php/man/man1/
page: phpize.1
page: php-config.1
Installing PEAR environment: /usr/local/php55/lib/php/
[PEAR] Archive_Tar - installed: 1.3.12
[PEAR] Console_Getopt - installed: 1.3.1
[PEAR] Structures_Graph- installed: 1.0.4
[PEAR] XML_Util - installed: 1.2.3
[PEAR] PEAR - installed: 1.9.5
Wrote PEAR system config file at: /usr/local/php55/etc/pear.conf
You may want to add: /usr/local/php55/lib/php to your php.ini include_path
/root/soft/php-5.5.16/build/shtool install -c ext/phar/phar.phar /usr/local/php55/bin
ln -s -f /usr/local/php55/bin/phar.phar /usr/local/php55/bin/phar
Installing PDO headers: /usr/local/php55/include/php/ext/pdo/
#make clean
#cp php.ini-production /etc/php.ini
#cd /usr/local/php55/bin
#./php -m | less // 查看php編譯內置的模塊,如果沒有你需要的則需要額外添加,具體怎麼配置請見LAMP
注意:測試php模塊時常見的一個錯誤是提示你不能加載某些模塊,例如:PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/curl.so' - /usr/local/php55/lib/php/extensions/no-debug-non-zts-20121212/curl.so: cannot open shared object file: No such file or directory in Unknown on line 0 。出現這樣的錯誤,不要緊張。這是因爲你是編譯安裝的php模塊,而這裏提示你不能加載的模塊通常都是你rpm包安裝時需要加載的模塊。這些模塊的配置文件通常都在/etc/php.d/目錄下,你只需要刪除這些文件即可,再次測試就不會有錯。而你發現未能加載的模塊,在php的內置模塊中已經可以使用了,這就是php的源碼編譯。
#cd /usr/local/php55/etc/ //提示:爲什麼總是用絕對路徑,就是怕有些人不知道我切來切去,切哪裏去了。笨蛋的技術,必須讓你知道所以然。。。。
#cp -p php-fpm.conf.default php-fpm.conf
[root@test2 etc]# /usr/local/php55/sbin/php-fpm //啓動fpm進程
[root@test2 etc]# ps aux | grep fpm
root 17161 0.0 0.9 207092 4972 ? Ss 10:38 0:00 php-fpm: master process (/usr/local/php55/etc/php-fpm.conf)
nobody 17162 0.0 0.8 207092 4388 ? S 10:38 0:00 php-fpm: pool www
nobody 17163 0.0 0.8 207092 4388 ? S 10:38 0:00 php-fpm: pool www
root 17165 0.0 0.1 103244 848 pts/0 S+ 10:38 0:00 grep fpm
[root@test2 etc]# netstat -nultp | grep fpm
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 17161/php-fpm
由上面的信息可知,php-fpm已經成功啓動,並監管php程序的解釋
相關內容介紹:
1.freetype:是一些常用的字體庫
2.zlib:是互聯網上通用格式的壓縮庫
3.--enable-sockets:讓php可以支持套接字通信
4.mcrypt:支持加密功能的額外加密庫
5.如果使用PHP5.3以上版本,爲了連接MySQL數據庫,可以指定mysqlnd,這樣在本機就不用先安裝MySQL或MySQL開發包了。mysqlnd從php5.3開始可用,可以編譯時綁定到它(而不用和具體的MySQL客戶端綁定形成依賴,但從php5.4開始它就是默認的了。
#./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
6.--enalbe-fpm 該選項是將php編譯成單獨的由php-fpm管理的服務器。nginx沒有像apache那樣把php集成到內部的功能,因此編譯php時必須加上該選項,否則nginx與php將不可通過fastcgi進行整合。也正是由於這個功能,可以將php做成集羣。
5.整合nginx和php
nginx和php的整合可以通過proxy_pass和fastcgi兩種方式來整合,但是通常是通過fastcgi的方式來進行整合,至於fastcgi的好處,請自行查閱。。。
修改配置文件:/usr/local/nginx/conf/nginx.conf
確保有如下整合php的配置:
location ~ \.php$ {
root /usr/local/nginx/html; //這是指定網站的根目錄,在網站根目錄以外的php文件是不會被解釋的,會提示file not found。
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; // 這是nginx文檔裏面默認的配置,但是在新版的nginx當中已經無效,會提示招不到根目錄
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#service nginx configtest //檢查配置文件是否有語法錯誤
#service nginx restart // 我已經配置nginx的啓動文件,如果你也需要,請到nginx的安裝部署裏面拷貝一個。
#cd /usr/local/nginx/html
創建一個index.php的測試文件,內容如下:
<?php
phpinfo();
?>
測試php頁面是否能夠正常解析並訪問:
瀏覽器:
http://10.0.10.12/index.php
如果一切正常,會返回php的測試頁面,該頁面也是查看php相關參數和功能的頁面,必須要會
6.測試LNMP架構
安裝好了nginx,mysql,php,最後就要測通這三個程序在linux平臺上是否能夠跑通,這裏利用一個簡單的php測試文件即可。
#cd /usr/local/nginx/html
#vim index.php
修改該配置文件內容如下:
<?php
$links = mysql_connect('localhost','root','lxm');
if ($links)
echo "yes";
else
echo "no";
?>
流程:當客戶端請求該php文件時,nginx會將該php文件提交給後端的php-fpm進行解析,然後php調用mysql_connect對後端數據庫進行連接測試,如果成功則返回yes,失敗則返回no
測試:
http://10.0.10.12/index.php
此時返回的結果是:no
這是why?查看日誌:
看上面的報錯,好像是說mysql_connect這個函數沒有找到。奇怪爲什麼?經過多番測試,發現原來是mysql的sock文件的位置問題。在上面編譯時,使用了--enable-sockets,php默認是查找/var/lib/mysql下的mysqld.sock文件,這也是mysql默認存放sock的位置,但是此文檔在安裝mysql時,將sock放到了tmp目錄下,因此需要修改php.ini文件指定sock文件的位置。
#vim /etc/php.ini
找到下面的選項並指定soket位置
mysql.default_socket = /tmp/mysqld.sock
重啓php-fpm:
#pkill php-fpm
#/usr/local/php55/sbin/php-fpm
此時再次測試,返回yes,表示測試成功,也表示整個LNMP架構已經測通。
到此,LNMP平臺就搭建完成,更多技術文檔請看下回分解。。。。。
結束!!!
笨蛋的技術------不怕你不會!!!!