以前流行過一段時間的Nginx+以fastCGI方式運行的PHP來搭建Web站點的方法。可是通過一段時間考量以後,你們常常發現會出現一些 502的錯誤。其實通常是Nginx+fastCGIPHP的形式不太穩定形成。因而嘗試了牛人推薦的一種是用Nginx作前端轉發PHP請求給 Apache的方法來進行服務器平臺建設。這種方法有效的避免了Apache在應付大併發時候的些許不足和Nginx配合fastCGIPHP不太穩定的弊端。同時又在必定程度上利用了Nginx速度上的優點。說白了就是一些靜態文件有Nginx來處理,PHP請求轉發給後端Apache來處理。可是在效率上或者內存等資源佔用上不如Nginx+fastCGI方式。
在PHP頁面處理使用了suPHP,關於suPHP各位能夠參照這裏。suPHP其實如今被應用在不少空間租用商的服務器上。主要功能爲了使用目錄全部者的權限來執行特定位置的PHP頁面,不是使用Apache默認Apache或者wwwdata或者nobody用戶。這樣的好處主要有兩點:1.空間租用者(使用者)不須要在設置複雜權限了,在本身空間中PHP擁有徹底權限。2.空間租用者(使用者)存放網站文件的目錄更安全,不須要開啓 Apache,wwwdate或者nobody之類權限對於本身站點,避免了777這樣的高危權限。可是suPHP要求在編譯安裝PHP的時候必須編譯爲 PHP-CGI形式才能是用,也就是不能使用平時咱們所使用的CLI啓動方式。javascript
簡單原理以下: CLI傳統模式的圖解:PHP是做爲Apache一個模塊存在,就像Apache的一個功能同樣。
php
suPHP模式圖解:suPHP做爲Apache一個模塊,在須要的時候以特定用戶權限來啓動PHP-CGI,從而實現以目錄全部者權限執行PHP的功能。
css
最終原理圖大體以下:由Nginx接受所有目的端口爲80的Web請求,根據請求內容的不一樣進行過濾。靜態文件例如:MP三、GIF、JPG、JS 等文件由Nginx處理,其餘PHP Web請求轉發到後端Apache服務器上。Apache服務器利用suPHP模塊按照目錄全部者權限運行PHP程序從而返回頁面給客戶端。稍加改動就能夠實現跨越多臺計算機的羣集功能。html
1、升級系統安裝必須軟件前端
# yum update # yum install gcc gcc-c++ bison patch unzip mlocate flex wget automake \ autoconf gd cpp gettext readline-devel libjpeg libjpeg-devel libpng \ libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib \ zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel \ ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \ libidn libidn-devel openldap openldap-devel openldap-clients \ openldap-servers nss_ldap expat-devel libtool libtool-ltdl-devel \ kernel-devel autoconf213 vim-common vim-enhanced diff* |
編譯安裝PHP和MySQL所需庫文件java
#解壓縮而且安裝libiconv,是一個基於GNU協議的開源庫,主要是解決多語言編碼處理轉換等應用問題。 #安裝libevent,是一個輕量級的開源高性能網絡庫,使用者衆多。好比memcached、Vomit、Nylon、Netchat等等。 #安裝libmcrypt,mhash,mcrypt等加密所需庫文件。 |
編譯安裝MySQLnginx
#能夠提升MySQL在內存分配方面的性能和效率。 #真的開始安裝MySQL # vim ~/.bashrc |
編譯安裝Apache
# cd ~/na #編輯/etc/init.d/httpd,在首行#!/bin/sh下添加: |
編譯安裝PHP這裏編譯成了CGI-PHP
# tar -zxf php-5.2.14.tar.gz #以PHP-CGI形式編譯PHP #安裝PHP memcache擴展。 #安裝PHP的加速器eaccelerator。 #安裝ImageMagick圖像處理軟件。 #安裝ImageMagick的PHP擴展。 #安裝PHP擴展Suhosin用來加強php語言的安全性。 #用來支持被加密的PHP頁面。 #安裝ZendOptimizer用來支持Zend加密頁面 |
安裝suPHP
#suPHP可讓用戶已目錄全部者的權限訪問PHP Web站點目錄 # tar -zxf suphp-0.7.1.tar.gz # cd suphp-0.7.1 # ./configure --with-apxs=/usr/local/apache/bin/apxs \ --with-apache-user=nobody \ --with-logfile=/usr/local/apache/logs/suphp.log \ --with-setid-mode=paranoid --sysconfdir=/usr/local/apache/conf/ \ --with-apr=/usr/local/apache/bin/apr-1-config \ --with-php=/usr/local/php/bin/php-cgi \ --enable-SUPHP_USE_USERGROUP=yes # make # make install |
安裝memcached
#memcached是能夠有效提升PHP訪問效率的內存緩存機制 |
安裝Nginx
#安裝Nginx須要的pcre,perl 兼容的正規表達式庫,這些在執行正規表達式模式匹配時用與Perl 5一樣的語法和語義是頗有用的。 #真的開始安裝nginx了 #編寫啓動腳本 #授予開機腳本執行權限 #安裝rpaf插件,使Apache日誌能夠正確記錄訪問者IP地址。 |
安裝Pure-FTP
# tar -zxf pure-ftpd-1.0.29.tar.gz # cd pure-ftpd-1.0.29 # ./configure --prefix=/usr/local/pureftpd \ --with-language=simplified-chinese --with-everything # make # make install # chmod u+x configuration-file/pure-config.pl # cp configuration-file/pure-config.pl /usr/local/pureftpd/sbin/ # mkdir /usr/local/pureftpd/etc/ # cp configuration-file/pure-ftpd.conf /usr/local/pureftpd/etc/ # ln -s /usr/local/pureftpd/bin/pure-pw /usr/local/bin/ |
修改目錄權限提升安全性
# chmod 711 /home # chmod 711 /usr/local/pureftpd # chmod 711 /usr/local/apache/conf/vhosts # chmod 711 /usr/local/nginx/conf/vhosts # chmod 711 /usr/local/apache/domlogs # chmod 711 /usr/local/apache/logs |
2、編輯Apache、PHP、suPHP、Nginx、Pure-FTP配置文件 編輯Apache主配置文件
#配置apache配置參數文件httpd.conf,位於/usr/local/apache/conf/目錄。 Timeout 300 # LoadModule perl_module modules/mod_perl.so LoadModule rpaf_module modules/mod_rpaf-2.0.so DocumentRoot "/usr/local/apache/htdocs" <Directory "/"> <Directory "/usr/local/apache/htdocs"> DefaultType text/plain <IfModule dir_module> <Files ~ "^error_log$"> <FilesMatch "^\.ht"> ErrorLog "logs/error_log" <IfModule log_config_module> <IfModule alias_module> <Directory "/usr/local/apache/cgi-bin"> <IfModule mpm_prefork_module> <IfModule mod_headers.c> ReadmeName README.html IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t Include conf/extra/httpd-languages.conf <Location /server-status> <Location /server-info> <IfModule ssl_module> #Vhosts <VirtualHost 204.74.291.132:81 *> Include conf/vhosts/* |
編輯PHP配置文件
# vim /etc/php.ini #查找/etc/php.ini中的extension_dir = "./".將其修改成extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/" #查找;include_path = ".:/php/includes",刪除前面的分號,並修改成include_path = ".:/usr/lib/php:/usr/local/php/lib/php" #跳到最後一行,而後添加如下內容: extension = "memcache.so" ;extension = "pdo.so" ;extension = "pdo_mysql.so" extension = "pdo_sqlite.so" extension = "sqlite.so" extension = "eaccelerator.so" extension = "suhosin.so" eaccelerator.shm_size = 32 eaccelerator.cache_dir = "/tmp/eaccelerator" eaccelerator.enable = 1 eaccelerator.optimizer = 0 eaccelerator.debug = 0 eaccelerator.name_space = "" eaccelerator.check_mtime = 1 eaccelerator.filter = "" eaccelerator.shm_max = 0 eaccelerator.shm_ttl = 7200 eaccelerator.shm_prune_period = 7200 eaccelerator.shm_only = 1 eaccelerator.compress = 0 eaccelerator.compress_level = 9 eaccelerator.keys = shm eaccelerator.sessions = shm eaccelerator.content = shm zend_extension = "/usr/local/ioncube/ioncube_loader_lin_5.2.so" zend_extension = "/usr/local/Zend/data/5_2_x_comp/ZendOptimizer.so" |
編輯suPHP配置文件
# cd /usr/local/apache/conf/ # vim suphp.conf #寫入以下內容 [global] ;Path to logfile logfile=/usr/local/apache/logs/suphp.log ;Loglevel loglevel=info ;User Apache is running as webserver_user=nobody ;Path all scripts have to be in docroot=/ ;Path to chroot() to before executing script ;chroot=/mychroot ; Security options ;allow_file_group_writeable=false allow_file_group_writeable=true allow_file_others_writeable=false ;allow_directory_group_writeable=false allow_directory_group_writeable=true allow_directory_others_writeable=false ;Check wheter script is within DOCUMENT_ROOT check_vhost_docroot=true ;Send minor error messages to browser errors_to_browser=false ;PATH environment variable env_path="/bin:/usr/bin" ;Umask to set, specify in octal notation umask=0022 ; Minimum UID min_uid=100 ; Minimum GID min_gid=100 [handlers] ;Handler for php-scripts x-httpd-php="php:/usr/local/php/bin/php-cgi" ;Handler for CGI-scripts x-suphp-cgi="execute:!self" |
編輯Nginx主配置文件
# cd /usr/local/nginx/conf/ # mv nginx.conf nginx.conf.bak # vim nginx.conf #寫入以下內容根據實際IP地址進行修改便可。 worker_processes 1; worker_rlimit_nofile 65535; events { worker_connections 65535; use epoll; } error_log /usr/local/nginx/logs/error.log info; http { include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 10; gzip on; gzip_http_version 1.0; gzip_min_length 1100; gzip_comp_level 3; gzip_buffers 4 32k; gzip_types text/plain text/xml text/css application/x-javascript application/xml application/xml+rss text/javascript application/atom+xml; ignore_invalid_headers on; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; connection_pool_size 256; server_names_hash_max_size 2048; server_names_hash_bucket_size 256; client_header_buffer_size 256k; large_client_header_buffers 4 256k; request_pool_size 32k; output_buffers 4 64k; postpone_output 1460; open_file_cache max=1000 inactive=300s; open_file_cache_valid 600s; open_file_cache_min_uses 2; open_file_cache_errors off; include "/usr/local/nginx/conf/vhosts/*.conf"; server { listen 80; server_name _; access_log off; location ~* \.(ftpquota|htaccess|asp|aspx|jsp|asa|mdb)$ { deny all; } location / { client_max_body_size 100m; client_body_buffer_size 128k; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffer_size 4k; proxy_buffers 16 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_connect_timeout 30s; proxy_pass http://204.74.291.132:81/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } } |
編輯Pure-FTP配置文件
#配置pure-ftpd,這裏採用PureDB的驗證方式. vim /usr/local/pureftpd/etc/pure-ftpd.conf #查找 PureDB /etc/pureftpd.pdb 取消前面的#號並設置成 PureDB /usr/local/pureftpd/etc/pureftpd.pdb #查找 PassivePortRange 取消前面的#號 |
3、設置各服務開機自運行並啓動服務
# chkconfig --level 35 mysql on |
4、如何使用和建立虛擬主機 更改用戶模板文件
# mkdir /etc/skel/public_html |
添加FTP賬戶用於維護Web服務器
# useradd -s /sbin/nologin whypc_info #啓動Pure-FTP由於剛纔尚未產生用戶數據庫,因此在這裏啓動。 |
更改Apache配置文件增長虛擬主機
# cd /usr/local/apache/conf/vhosts # vim whypc.info.conf #添加以下內容,IP地址和域名根據實際狀況。 <VirtualHost 204.74.291.132:81> ServerName whypc.info ServerAlias www.whypc.info DocumentRoot /home/whypc_info/public_html UseCanonicalName Off CustomLog /usr/local/apache/domlogs/whypc.info combined Options -ExecCGI -Includes RemoveHandler cgi-script .cgi .pl .plx .ppl .perl suPHP_Engine on suPHP_UserGroup whypc_info whypc_info AddHandler x-httpd-php .php .php3 .php4 .php5 suPHP_AddHandler x-httpd-php <IfModule !mod_disable_suexec.c> SuexecUserGroup whypc_info whypc_info </IfModule> ScriptAlias /cgi-bin/ /home/whypc_info/public_html/cgi-bin/ </VirtualHost> |
更改Nginx配置文件增長虛擬主機
# cd /usr/local/nginx/conf/vhosts/ # vim whypc.info.conf #添加以下內容,IP地址和域名根據實際狀況。 server { access_log off; error_log /usr/local/nginx/logs/whypc.info-error_log warn; listen 80; server_name whypc.info www.whypc.info; access_log off; location ~* ^.+.(gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg\ |mp4|pls|mp3|mid|wav|swf|flv|html|htm|txt|js|css|exe|zip|rar\ |gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso)$ { access_log /usr/local/apache/domlogs/whypc.info combined; root /home/whypc_info/public_html/; expires 24h; try_files $uri @backend; } error_page 400 401 402 403 404 405 406 407 408 409 500 501 502 503 504 @backend; location @backend { internal; client_max_body_size 100m; client_body_buffer_size 128k; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffer_size 4k; proxy_buffers 16 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_connect_timeout 30s; proxy_redirect http://whypc.info:81 http://whypc.info; proxy_redirect http://www.whypc.info:81 http://www.whypc.info; proxy_pass http://204.74.291.132:81; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~* \.(ftpquota|htaccess|asp|aspx|jsp|asa|mdb)$ { deny all; } location / { client_max_body_size 100m; client_body_buffer_size 128k; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffer_size 4k; proxy_buffers 16 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_connect_timeout 30s; proxy_redirect http://whypc.info:81 http://whypc.info; proxy_redirect http://www.whypc.info:81 http://www.whypc.info; proxy_pass http://204.74.291.132:81/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } |
5、建立測試文件
# vim ~whypc_info/public_html/test.php #寫入以下內容 <?php system("id"); ?> # chown whypc_info:whypc_info ~whypc_info/public_html/test.php 經過瀏覽器查看是否爲目錄全部者權限(非nobody)。 http://www.whypc.info/test.php |