常見的web框架結構;
例如:lnmp和;amp
L=LINUX N=NGINX A=APACHE P=php T=Tomcat
lnmp的原理
在LNMP組合工作時,首先是用戶通過瀏覽器輸入域名請求Nginx Web服務,如果請求是靜態資源,則由Nginx解析返回給用戶;如果是動態請求(.php結尾),那么Nginx就會把它通過FastCGI接口(生產常用方法)發送給PHP引擎服務(FastCGI進程php-fpm)進行解析,如果這個動態請求要讀取數據庫數據,那么PHP就會繼續向后請求MySQL數據庫,以讀取需要的數據,並最終通過Nginx服務把獲取的數據返回給用戶,這就是LNMP環境的基本請求順序流程。這個請求流程是企業使用LNMP環境的常用流程。
CGI的全稱為“通用網關接口”(Common Gateway Interface),為HTTP服務器與其他機器上的程序服務通信交流的一種工具,CGI程序須運行在網絡服務器上。
傳統CGI接口方式的主要缺點是性能較差,因為每次HTTP服務器遇到動態程序時都需要重新啟動解析器來執行解析,之后結果才會被返回給HTTP服務器。這在處理高並發訪問時幾乎是不可用的,因此就誕生了FastCGI。另外,傳統的CGI接口方式安全性也很差,故而現在已經很少被使用了。
什么是fastcgi
FastCGI是一個可伸縮的,高速地在HTTP服務器和動態腳本語言間通信的接口(在Linux下,FastCGI接口即為socket,這個socket可以是文件socket,也可以是IP socket),主要優點是把動態語言和HTTP服務器分離出來。多數流行的HTTP服務器都支持FastCGI,包括Apache,Nginx和Lighttpd等。
同時,FastCGI也被許多腳本語言所支持,例如當前比較流程的腳本語言PHP。FastCGI接口采用的是C/S架構,它可以將HTTP服務器和腳本解析服務器分開,同時還能在腳本解析服務器上啟動一個或多個腳本來解析守護進程。當HTTP服務器遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然后將得到的結果返回給瀏覽器。這種方式可以讓HTTP服務器專一地處理靜態請求,或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。
fastcgi的特點。
- HTTP服務器和動態腳本語言間通信的接口或工具。
- 可把動態語言解析和HTTP服務器分離開。
- Nginx,Apache,Lighttpd,以及多數動態語言都支持FastCGI。
- FastCGI接口方式采用C/S結構,分為客戶端(HTTP服務器)和服務器端(動態語言解析服務器)
- PHP動態語言服務器端可以啟動多個FastCGI的守護進程(例如php-fpm(fcgi process mangement))
- HTTP服務器通過(例如Nginx fastcgi_pass)FastCGI客戶端和動態語言FastCGI服務器端通信(例如php-fpm)
Nginx fastcgi的運行原理
Nginx不支持對外部動態程序的直接調用或者解析,所有的外部程序(包括PHP)必須通過FastCGI接口來調用。FastCGI接口在Linux下是socket,為了調用CGI程序,還需要一個FastCGI的wrapper(可以理解為用於啟動另一個程序的程序),這個wrappper綁定在某個固定的socket上,如端口或文件socket。當Nginx將CGI請求發送給這個socket的時候,通過FastCGI接口,wrapper接收到請求,然后派生出一個新的線程,這個線程調用解釋器或外部程序處理腳本來讀取返回的數據;接着,wrapper再將返回的數據通過FastCGI接口,沿着固定的socket傳遞給Nginx;最后,Nginx將返回的數據發送給客戶端,這就是Nginx+FastCGI的整個運作過程。
開始搭建
首先我們要有mysql,和Nginx。(可以查看Nginx的搭建,和mysql的搭建博客)
我們要搭建php
具體搭建PHP的步驟
- 先安裝php的支持包
[root@localhost ~]# yum -y install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel [root@localhost ~]# yum -y install freetype-devel libpng-devel gd libcurl-devel libxslt-devel
- [x] :每個lib一般都會存在對應的以“*-devel”命名的包,安裝lib對應的-devel包后,對應的lib包就會自動安裝好,例如安裝gd-devel時就會安裝gd。
- [x] :這些lib庫不是必須安裝的,但是目前的企業環境下一般都需要安裝。否則,PHP程序運行時會出現問題,例如驗證碼無法顯示等。
安裝完的結果如下
[root@localhost ~]# rpm -qa zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel zlib-devel-1.2.3-29.el6.x86_64 libxml2-devel-2.7.6-14.el6.x86_64 libjpeg-turbo-devel-1.2.1-1.el6.x86_64 #這里僅缺少libiconv-devel包
缺少的包也可以下包安裝
[root@localhost ~]# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz [root@localhost ~]# ls anaconda-ks.cfg install.log libiconv-1.14.tar.gz nginx-1.10.2.tar.gz index.html install.log.syslog mysql-5.5.32-linux2.6-x86_64.tar.gz [root@localhost ~]# tar xf libiconv-1.14.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/libiconv-1.14/ [root@localhost libiconv-1.14]# ./configure --prefix=/usr/local/libiconv && make && make install
缺少的libiconv的包我們要從雲yum上安裝,如果不安裝會出現后續的無法安裝。
安裝libiconv的命令
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum -y clean all yum makecache yum -y install libmcrypt-devel
我們還需要安裝3個庫,注意都要在雲yum上安裝
在雲yum上安裝libmcrypt庫 yum -y install libmcrypt-devel 安裝mhash加密擴展庫 yum -y install mhash 安裝mcrvpt加密擴展庫 yum -y install mcrypt
開始安裝php服務
獲取php的安裝包
wget http://cn2.php.net/get/php-5.3.28.tar.gz/from/this/mirror
解壓並配置,初始化php
[root@localhost ~]# tar xf php-5.3.28.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/php-5.3.28/ [root@localhost php-5.3.28]# ./configure \ > --prefix=/usr/local/php5.3.28 \ (#注釋這里是幾的版本寫幾的后綴就可以) > --with-mysql=/usr/local/mysql \ (#注釋現在是php和數據庫在一台服務器上,如果不在一台服務器上需要改為--with-mysql=mysqlnd) > --with-iconv-dir=/usr/local/libiconv \ > --with-freetype-dir \ > --with-jpeg-dir \ > --with-png-dir \ > --with-zlib \ > --with-libxml-dir=/usr \ > --enable-xml \ > --disable-rpath \ > --enable-safe-mode \ > --enable-bcmath \ > --enable-shmop \ > --enable-sysvsem \ > --enable-inline-optimization \ > --with-curl \ > --with-curlwrappers \ > --enable-mbregex \ > --enable-fpm \ > --enable-mbstring \ > --with-mcrypt \ > --with-gd \ > --enable-gd-native-ttf \ > --with-openssl \ > --with-mhash \ > --enable-pcntl \ > --enable-sockets \ > --with-xmlrpc \ > --enable-zip \ > --enable-soap \ > --enable-short-tags \ > --enable-zend-multibyte \ > --enable-static \ > --with-xsl \ > --with-fpm-user=www \ (#注釋nginx表示指定PHP-FPM進程管理的用戶為www,此處要和Nginx服務的程序用戶統一) > --with-fpm-group=www \ (#注釋表示指定PHP-FPM進程管理的組為www,此處要和Nginx服務的程序用戶組統一。) > --enable-ftp (#注釋表示激活PHP-FPM方式服務,即以FastCGIF方式運行PHP服務。) #特別強調:上述每行結尾的換行符反斜線(\)之后不能再有任何字符包括空格
成功了會顯示如下的頁面
開始編譯php
[root@localhost php-5.3.28]# cd /usr/src/php-5.3.2.8 [root@localhost php-5.3.28]# ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/ [root@localhost php-5.3.28]# touch ext/phar/phar.phar [root@localhost php-5.3.28]# make
make編譯成功以后的顯示字樣
#make最后的正確提示 Build complete. Don't forget to run 'make test'.
然后make install 編譯
[root@localhost php-5.3.28]# make install
開始配置php的引擎文件php.ini
我們要設置軟連接
[root@localhost ~]# ln -s /usr/local/php5.3.28/ /usr/local/php [root@localhost ~]# ls -l /usr/local/php lrwxrwxrwx. 1 root root 21 Jul 14 13:06 /usr/local/php -> /usr/local/php5.3.28/
查看配置文件的模板,一個是生產的,一個是測試的
[root@localhost ~]# cd /usr/src/php-5.3.28/ [root@localhost php-5.3.28]# ls php.ini* php.ini-development php.ini-production
兩個文件有差異可通過diff或vimdiff命令比較
復制生產的配置文件到PHP默認目錄,並更改文件名稱為php.ini(php的解析器)
[root@localhost php-5.3.28]# cp php.ini-production /usr/local/php/lib/php.ini [root@localhost php-5.3.28]# ls -l /usr/local/php/lib/php.ini -rw-r--r--. 1 root root 69627 Jul 14 13:25 /usr/local/php/lib/php.ini
配置php的配置文件php-fpm.com
[root@localhost php-5.3.28]# cd /usr/local/php/etc/ [root@localhost etc]# ls pear.conf php-fpm.conf.default [root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
接下來可以啟動php服務了
[root@localhost etc]# /usr/local/php/sbin/php-fpm
啟動完了以后就是修改Nginx的配置,建立網頁。
[root@localhost etc]# cd /usr/local/nginx/conf/ [root@localhost conf]# cat extra/blog.conf server { listen 80; server_name blog.yunjisuan.com; location / { root /var/www/html/blogcom; (#注釋,靜態的網頁首頁) index index.html index.htm; } location ~ .*\.(php|php5)?$ {(#注釋,動態的網頁) root /var/www/html/blogcom;(#注釋,動態和靜態要在同一個目錄下。) fastcgi_pass 127.0.0.1:9000;(#動態推送到fastcgi的參數,如果是兩台服務器要以ip的形式寫) fastcgi_index index.php;(#動態的網頁注意) include fastcgi.conf;(#應用參數) } }
啟動Nginx
[root@localhost conf]# /usr/local/nginx/sbin/nginx -t (此步在生產環境很關鍵,如不提前檢查語法,重啟后發現語法錯誤會導致Nginx無法提供服務,,給用戶訪問體驗帶來不好的影響。) nginx: the configuration file /usr/local/nginx-1.10.2//conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx-1.10.2//conf/nginx.conf test is successful [root@localhost conf]# /usr/local/nginx/sbin/nginx -s reload
測試lnmp的環境
測試php解析是否正常
[root@localhost conf]# cd /var/www/html/blogcom/ [root@localhost blogcom]# echo "<?php phpinfo(); ?>" >test_info.php [root@localhost blogcom]# cat test_info.php <?php phpinfo(); ?>
調整映射,linux要調整,Windows也要調整,在linux上還要映射下主機名,
echo "192.168.200.129 lnmp blog.yunjisuan.com" >> /etc/hosts
在瀏覽器上輸入測試的url
http://blog.yunjisuan.com/test_info.php
會出現以下的的頁面
開始測試php和mysql的連接
編輯以下的內容
[root@localhost blogcom]# cat test_mysql.php <?php //$link_id=mysql_connect('主機名','用戶','密碼'); $link_id=mysql_connect('localhost','root','123123'); if($link_id){ echo "mysql successful by nange !"; }else{ echo mysql_error(); } ?>
用php測試下
php test_mysql.php
會輸出成功的字樣
這樣我們的lnmp環境就搭建好了,還沒有優化。
我們開始WordPress
wordPress 是一套利用PHP語言和MySQL數據庫開發的開源免費的blog(博客,網站)程序,用戶可以在支持PHP環境和MySQL數據庫的服務器上建立blog站點。它的功能非常強大,擁有眾多插件,易於擴充功能。其安裝和使用也都非常方便。目前WordPress已經成為搭建blog平台的主流,很多發布平台都是根據WordPress二次開發的,如果你也想像他們一樣擁有自己的blog,可購買網上的域名及空間,然后搭建LNMP環境,部署WordPress程序后就可以輕松成就自己的夢想了。
我們要先登錄數據庫,創建一個庫
mysql -uroot -p密碼 mysql> create database wordpress; #創建一個數據庫,名字為wordpress Query OK, 1 row affected (0.00 sec)
數據庫要授權一個用戶
mysql> grant all on wordpress.* to wordpress@'localhost' identified by '123123'; #localhost為客戶端地址 Query OK, 0 rows affected (0.00 sec)
添加Nginx一個主頁,在配置文件里然后從起
root@localhost extra]# cat blog.conf server { listen 80; server_name blog.yunjisuan.com; location / { root /var/www/html/blogcom; index index.php index.html index.htm; #補充一個首頁文件index.php } location ~ .*\.(php|php5)?$ { root /var/www/html/blogcom; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } } [root@localhost extra]# /usr/local/nginx/sbin/nginx -s reload
解壓WordPress的壓縮包,並將這個目錄移動答Nginx主頁目錄下,在移動之前要情況Nginx的主頁目錄
[root@localhost]#tar xf wordpress-4.7.4-zh_CN.tar.gz #解壓 [root@localhost blogcom]# rm -f index.html test_info.php test_mysql.php #刪除無用文件,注意位置 [root@localhost blogcom]# mv wordpress/* . #把目錄里的內容移動到blogcom根目錄下 [root@localhost blogcom]# ls -l #完整的blog程序內容 total 192 -rw-r--r--. 1 nobody 65534 418 Sep 24 2013 index.php -rw-r--r--. 1 nobody 65534 19935 Jan 2 2017 license.txt -rw-r--r--. 1 nobody 65534 6956 Apr 23 09:24 readme.html drwxr-xr-x. 2 nobody 65534 4096 Jul 14 16:04 wordpress -rw-r--r--. 1 nobody 65534 5447 Sep 27 2016 wp-activate.php drwxr-xr-x. 9 nobody 65534 4096 Apr 23 09:24 wp-admin -rw-r--r--. 1 nobody 65534 364 Dec 19 2015 wp-blog-header.php -rw-r--r--. 1 nobody 65534 1627 Aug 29 2016 wp-comments-post.php -rw-r--r--. 1 nobody 65534 2930 Apr 23 09:24 wp-config-sample.php drwxr-xr-x. 5 nobody 65534 4096 Apr 23 09:24 wp-content -rw-r--r--. 1 nobody 65534 3286 May 24 2015 wp-cron.php drwxr-xr-x. 18 nobody 65534 12288 Apr 23 09:24 wp-includes -rw-r--r--. 1 nobody 65534 2422 Nov 20 2016 wp-links-opml.php -rw-r--r--. 1 nobody 65534 3301 Oct 24 2016 wp-load.php -rw-r--r--. 1 nobody 65534 33939 Nov 20 2016 wp-login.php -rw-r--r--. 1 nobody 65534 8048 Jan 11 2017 wp-mail.php -rw-r--r--. 1 nobody 65534 16255 Apr 6 14:23 wp-settings.php -rw-r--r--. 1 nobody 65534 29896 Oct 19 2016 wp-signup.php -rw-r--r--. 1 nobody 65534 4513 Oct 14 2016 wp-trackback.php -rw-r--r--. 1 nobody 65534 3065 Aug 31 2016 xmlrpc.php root@localhost blogcom]# chown -R www.www ../blogcom/ #授權用戶訪問 [root@localhost blogcom]# ls -l #最終博客目錄和權限,要Nginx,php的用戶一樣。 total 192 -rw-r--r--. 1 www www 418 Sep 24 2013 index.php -rw-r--r--. 1 www www 19935 Jan 2 2017 license.txt -rw-r--r--. 1 www www 6956 Apr 23 09:24 readme.html drwxr-xr-x. 2 www www 4096 Jul 14 16:04 wordpress -rw-r--r--. 1 www www 5447 Sep 27 2016 wp-activate.php drwxr-xr-x. 9 www www 4096 Apr 23 09:24 wp-admin -rw-r--r--. 1 www www 364 Dec 19 2015 wp-blog-header.php -rw-r--r--. 1 www www 1627 Aug 29 2016 wp-comments-post.php -rw-r--r--. 1 www www 2930 Apr 23 09:24 wp-config-sample.php drwxr-xr-x. 5 www www 4096 Apr 23 09:24 wp-content -rw-r--r--. 1 www www 3286 May 24 2015 wp-cron.php drwxr-xr-x. 18 www www 12288 Apr 23 09:24 wp-includes -rw-r--r--. 1 www www 2422 Nov 20 2016 wp-links-opml.php -rw-r--r--. 1 www www 3301 Oct 24 2016 wp-load.php -rw-r--r--. 1 www www 33939 Nov 20 2016 wp-login.php -rw-r--r--. 1 www www 8048 Jan 11 2017 wp-mail.php -rw-r--r--. 1 www www 16255 Apr 6 14:23 wp-settings.php -rw-r--r--. 1 www www 29896 Oct 19 2016 wp-signup.php -rw-r--r--. 1 www www 4513 Oct 14 2016 wp-trackback.php -rw-r--r--. 1 www www 3065 Aug 31 2016 xmlrpc.php
開始安裝博客。
在瀏覽器上上輸入映射的網址
打開瀏覽器輸入blog.yunjisuan.com(提前做好hosts或DNS解析),回車后,出現下圖:
然后開始按着步驟來寫
然后設置自己的登陸密碼,和你的博客名字,點擊登陸就可以
實現url靜態化
實現此功能時,首先要在WordPress后台依次單擊設置--->固定鏈接--->自定義結構,然后輸入下面的代碼,並保存更改。
/archives/%post_id%.html
#說明:%post_id%是數據庫對應博文內容的唯一ID,例如423
然后修改Nginx的server
[root@localhost extra]# cat blog.conf server { listen 80; server_name blog.yunjisuan.com; root /var/www/html/blogcom; location / { index index.php index.html index.htm; if (-f $request_filename/index.html){ rewrite (.*) $1/index.html break; } if (-f $request_filename/index.php){ rewrite (.*) $1/index.php; } if (!-f $request_filename){ rewrite (.*) /index.php; } } location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }
最后檢查重啟Nginx就可以了
[root@localhost extra]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx-1.10.2//conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx-1.10.2//conf/nginx.conf test is successful [root@localhost extra]# /usr/local/nginx/sbin/nginx -s reload
在輸入網址就可以了