大話centos下部署phalcon框架
Centos還是ubuntu?
當我沿用這個標題的時候,心里在想“我能說我之前用的windows嗎?",windows下xampp,wamp一鍵配置啊,有木有!我剛開始的時候就很傻很天真的在剛買的阿里雲服務器安裝了window Server 2008,着手部署xampp,兩個小時把解析環境全部配置好了,心里各種吐槽什么服務器難搞定,在本大(diao)神(si)眼里全是渣!心里各種喜悅啊,開始樂呵樂呵的測試公司的網站(根本沒問題啊),然后我就沒多想了(果然還是太年輕),之后的幾天開始沉浸在項目開發中無法自拔,就沒去折騰服務器了。
由於項目接近尾聲,開始試上線,我就把本地程序上傳到了服務器(由於服務器是windows環境,桌面遠程連接(我真是忍不住要吐槽)在mac實在是難用),由於沒有配置好windows下遠程FTP連接,然后就悲劇的共享磁盤驅動來更新程序(誰用誰知道),各種慢就不說了,還總是丟失。但是這些都沒有讓我產生放棄windows懷抱的想法。
因為項目前后台都是我自己弄的,前端用的h5+js,免不了各種ajax調用數據接口,然后悲劇就此產生~ windows的apache 2會三五分鍾就嗝屁,客戶后台總是登不進去,基本就是一會一個電話,我心里想還是換linux系統,就此開始了我3 * 24小時的CentOs+nginx+php+mysql+phpmyadmin+phalcon折騰之旅(據說nginx是7*24小時不重啟的小金剛)。
因為最開始我是部署的unbun12.04的系統,在開始之前還是有思考過要用ubuntu還是用centos呢?最后,我還是選擇了centos,原因是因為我覺得名字感覺大氣一點(任性一把)。
環境安裝
-
因為PHP-FPM 在 CentOS 的官方程序庫中不存在,所以我們首先得添加第三方擴展軟件源,運行以下命令:
rpm --import https://fedoraproject.org/static/0608B895.txt rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel- release-6-8.noarch.rpm rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi rpm -ivh http://rpms.famillecollet.com/enterprise/remi- release-6.rpm yum install yum-priorities
-
然后,編輯:vi /etc/yum.repos.d/epel.repo:
[epel] name=Extra Packages for Enterprise Linux 6 - $basearch baseurl=http://mirrors.aliyun.com/epel/6/$basearch http://mirrors.aliyuncs.com/epel/6/$basearch mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch failovermethod=priority enabled=1 priority=10 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
-
接着:vi /etc/yum.repos.d/remi.repo:
[remi] name=Les RPM de remi pour Enterprise Linux 6 - $basearch baseurl=http://rpms.famillecollet.com/enterprise/6/remi/$basearch/ mirrorlist=http://rpms.famillecollet.com/enterprise/6/remi/mirror enabled=1 priority=10 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
下面我們就可以安裝所需要的包文件了:
安裝MySQL服務器
yum install mysql mysql-server
-安裝Nginx
yum install nginx
安裝PHP及相關組件
yum install php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidy php-pecl-apc
-
啟動MySQL
chkconfig --levels 235 mysqld on service mysqld start
-
啟動Nginx
chkconfig --levels 235 nginx on service nginx start
-
啟動PHP-FPM
chkconfig --levels 235 php-fpm on service php-fpm start
-
若 Nginx 啟動失敗,則有可能是因為 Apache httpd 服務占用了該接口,這時,要么我們修改 Nginx 的堅挺端口,要么修改Apache httpd的或者直接刪除 Apache httpd。
apachectl stop yum remove httpd chkconfig --level 235 httpd off
-
修改mysql密碼
-
運行 mysql_secure_installation 命令,因為我們是首次安裝所以直接回車,然后進入設置新密碼
配置 PHP
- 打開 PHP 配置文件:vi /etc/php.ini
- 設置 cgi.fix_pathinfo=0:(此處有坑~!)
[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]
設置 upload_max_filesize 最大文件上傳尺寸為 upload_max_filesize 為 16MB:
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 16M
設置 post_max_size 為 32MB:
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 32M
打開:vi /etc/php-fpm.d/www.conf :
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock;
以及:
listen.owner = www
listen.group = www
listen.mode = 0660
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = www
; RPM: Keep a group allowed to write in log dir.
group = www
- 以上就是所有環境配置基本完畢(一般1個小時所有就能搞定,2M帶寬的話),以上安裝配置參考 潘韜 個人博客:http://xingzhewujiang.org/press/install-nginx-mysql-php-fpm-pahclon-on-centos-65.html。
配置完這些我當時覺得我應該是離配置完成不遠了,感覺自己棒棒噠啊~
域名解析
-由於之前就已經解析好了域名,所以我只需要配置一下nginx虛擬主機
-
靜態解析
-
靜態解析按照nginx提供的virtual.conf里面提供的例子解析即可
listen 80;
server_name somename alias another.alias;location / {
root html;
index index.html index.htm;
}
} -
動態解析,因為nginx本身不能解析php,所以它會把php轉發到9000端口,提交給php-fpm去解析,這里我貼出我的配置文件
server { listen 80; server_name yourservername.com(需要解析的域名); index index.html index.htm index.php; set $root_path yourpath(項目入口文件位置); root $root_path; try_files $uri $uri/ @rewrite; location @rewrite { rewrite ^/(.*)$ /index.php?_url=/$1; } location ~ \.php { fastcgi_pass 127.0.0.1:9000; fastcgi_index /index.php; include /etc/nginx/fastcgi_params; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name; } location ~* ^/(css|img|js|flv|swf|download)/(.+)$ { root $root_path; } location ~ /\.ht { deny all; } }
-這里有一個地方需要注意,如果你在重啟nginx的時候,出現無法識別$document_root,你需要將你的 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;里面的$document_root換成你項目入口文件位置,我就在這個地方糾結了好久,弄半天才整出來,這個解析規則基本能滿足大部分php項目解析。
安裝phpmyadmin
-
資源下載
-
解析phpmyadmin
-
配置一個虛擬主機解析到phpmyadmin根目錄下,還是沿用上方動態解析規則即可。
常見錯誤
-
安裝完成之后,一個經常會出現的錯誤出現了,訪問phpmyadmin的時候,出現錯誤代碼如下:
-
Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.
-
這個時候網上提供什么5個步驟就能解決神馬的,我就很認(sha)真(bi)的一一試過,然后····神奇的事情發生了,根本沒用!類似這種解決方案(http://www.7edown.com/edu/article/soft_4365_1.html),全是復制粘貼的答案,根- 本沒有用(因為缺失前后文關系,大家就亂搞)。
-
最后我根據session的配置文件,找到phpmyadmin/ libraries/session.inc.php ,修改一下代碼:
if (! isset($_COOKIE[$session_name])) { // on first start of session we check for errors // f.e. session dir cannot be accessed - session file not created $orig_error_count = $GLOBALS['error_handler']->countErrors(); //session_save_path('./tmp'); session_save_path("/tmp"); $r = session_start(); if ($r !== true || $orig_error_count != $GLOBALS['error_handler']->countErrors() ) { setcookie($session_name, '', 1); /* * Session initialization is done before selecting language, so we * can not use translations here. */ PMA_fatalError('Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly. Also ensure that cookies are enabled in your browser.'); } unset($orig_error_count); } else { session_save_path("/tmp"); session_start(); }
-
記得在根目錄下新建tep文件夾,給予讀寫權限(chmod 777 ./),我的比較簡單粗暴,有一點安全隱患。
-
至此,打開虛擬主機域名就可以正常訪問phpmyadmin了!
phalcon環境的搭建
-
因為以上步驟基本已經搭建好了前台環境,最后需要搭建今天的主角嘉賓(phalcon框架)的搭建了。
-
phalcon介紹(http://www.phalconphp.com/)
-
phalcon是一款由c語言直接編寫的php框架,以靈活性(低耦合),可拓展性強,高性能聞名,也是以組建注冊,工廠服務形式存在的php框架。
-
因為我們的系統是Centos,所以根據官方給我們的案例(http://phalconphp.com/zh/download,我們需要自己手動編譯phalcon模塊
-
安裝兩個編譯環境和工具:
yum install gcc libtool make git yum install php55w-devel (此處應該根據你自己的php版本去安裝,具體版本信息可以輸出phpinfo()查看)。
-
下載最新的phalcon文件
git clone git://github.com/phalcon/cphalcon.git cd cphalcon/build
-
然后執行
./install
-
編譯好的.so文件目錄地址:
/usr/lib64/php/moudels/phalcon.so
-
常見錯誤
-
最后我們需要把.so拓展文件引用至.ini文件中,這個地方需要注意的是Centos不可以直接在/etc/php.ini中直接加入:extension=phalcon.so,這樣重啟php-fpm的時候會報 php:startup()這個錯誤。
-
我們需要在/etc/php.d中新建一個 phalcon.ini文件,
vi phacon.ini
-
加入一下內容:
extension=phalcon.so
-
然后保存,重啟php-fpm服務,這個地方搞了我好幾個小時,因為開始的時候沒有仔細閱讀文檔,查半天返現centos需要重新新建一個.ini文件才能加載進來。
-
其次我被php-fpm重啟也坑了半天,其重啟命令是
services php-fpm restart
我在/etc/init.d/php-fpm restart半天也沒反應,一直重啟不起來,原來搞半天口令都錯了。
-
至此,phalcon框架算是加載進來了,然后就是部署項目到服務器了
-
同樣,解析一個域名到服務器,然后沿用之前的動態解析配置文件,然后我們只需要在瀏覽器輕輕的輸入您的網址,不出意外,報錯!
-
如果你仔細看我之前寫的文檔,你就會發現我們在配置nginx環境修改php.ini的時候我寫了一個此處有坑,我們需要找到etc/php.ini:
cgi.fix_pathinfo=0改成 cgi.fix_pathinfo=1
-
修改完成之后重啟服務器,緊接着出現第二個錯誤
-
第二個錯誤應該是權限錯誤,錯誤代碼:Volt can't be writen!,我們需要給項目文件讀寫權限(775)chmod 755 -R ./
-
之后我們就可以看到熟悉的phalcon界面了!
-
開心~撒花。
目前服務器配置如上,基本能滿足小型項目需求,但是nginx對於后台php等解析還是不是特別理想,所以我打算再抽出幾天時間把前后台服務器分離,前端用ubuntu+nginx+mongodb,后台用apache2+centos+mysql(postgresql)+php,最后后台實現業務與數據持久層分離,把數據接口和數據庫放到另外一台服務器上面,實現一個分布式架構。
附錄:
-
centos常用命令:
php-fpm重啟命令: services php-fpm restart nginx重啟命令:services nginx restart 抑或在/etc/init.d/nginx -s reload
-
賦予權限:
chmod 777 -R ./ chrow www:www(用戶組:用戶名) -R ./
-
如果您對本文檔有任何疑問或者建議,請您發送郵箱至zhoukai@dreamzk.cn,我會在第一時間給您答復,謝謝。
轉載請表明出處,謝謝。