Debian編譯安裝Nginx+MySQL+PHP-FPM環境詳解

來源:互聯網
上載者:User


Linux環境:Debian 6 Stable

程式版本選擇:

Nginx:Tengine 1.2.4
淘寶出品,基於Nginx並引進了一些新特性

MySQL:5.1.66
5.1系列最新版。不用5.5的原因是5.5開始編譯使用CMake,而資料比較少。(事實上wangyan的指令碼使用的是5.5,但是當時我還沒看到……)

PHP:5.4.9
前幾天剛出的Current Stable,內建FPM,與Nginx配合良好。

參考資料:

主要參考軍哥的lnmp指令碼和wangyan的lanmp指令碼。軍哥的指令碼用的非常廣而且口碑很好,但是軟體版本都較舊。wangyan的lanmp指令碼堅持使用各軟體的最新版本(PHP直接是從網頁上抓current stable版本號碼然後下載),而且代碼結構非常贊,閱讀起來很清晰。

Nginx(Tengine)

1.安裝前準備

首先是安裝需要的包:

apt-get install build-essential openssl libssl0.9 libssl-dev

其實因為是回顧所以具體有哪些需要的包我也記不清了……基本上就是這些。其實不用擔心少了會怎樣,做configure的時候會有提示的,缺什麼裝什麼就可以了。

然後準備使用者和目錄:


groupadd www
useradd -M -s /usr/sbin/nologin -g www www

mkdir -p /home/wwwroot
chmod +w /home/wwwroot
mkdir -p /home/wwwlogs
chmod 777 /home/wwwlogs

2.編譯安裝pcre


wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz
tar zxf pcre-8.21.tar.gz
cd pcre-8.21
./configure
make && make install

3.編譯安裝Tengine


wget http://tengine.taobao.org/download/tengine-1.4.2.tar.gz
tar zxf tengine-1.4.2.tar.gz
cd tengine-1.4.2
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
make && make install

編譯參數是照抄的軍哥的指令碼的。wangyan的指令碼裡使用的參數要多得多。只是目前我覺得這樣就夠用了

4.配置Tengine

設定檔主要參考軍哥的nginx.conf寫的,用於fastcgi配置的fcgi.conf則是完全照抄。具體的參數我還沒研究作用,等有空的時候再看看。

我的nginx.conf(主設定檔)內容如下,裡面有部分參數是Tengine特有,部分配置是我根據我的環境添加修改的,都有注釋註明。


user www www;
worker_processes auto; #auto這個值是tengine添加的,原版nginx不存在。可以自動按照CPU核心數確定worker數量
error_log  /home/wwwlogs/nginx_error.log  crit;
pid /usr/local/nginx/logs/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;

events
 {
  use epoll;
  worker_connections 51200;
 }

http
 {
  include       mime.types;
  default_type  application/octet-stream;

  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 50m;

  sendfile on;
  tcp_nopush on;
  keepalive_timeout 60;
  tcp_nodelay on;

  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 256k;

  gzip on;
  gzip_min_length  1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types text/plain application/x-javascript text/css application/xml;
  gzip_vary on;

  #limit_zone  crawler  $binary_remote_addr  10m;

  #log format
  log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
             '$status $body_bytes_sent "$http_referer" '
             '"$http_user_agent" $http_x_forwarded_for';

server #此段server是禁止通過ip/未配置的網域名稱訪問,相當有用
 {
  server_name _;
  return 403;
 }
server #預設段
 {
  listen 80;
  server_name 網站網域名稱;
  index index.html index.htm index.php;
  root  /home/wwwroot;

  location ~ .*\.(php|php5)?$
   {
    try_files $uri =404;
    fastcgi_pass  unix:/tmp/php-fpm.sock; #我的php-fpm配置為unix socket工作方式,如果是監聽連接埠的記得修改配置
    fastcgi_index index.php;
    include fcgi.conf; #此處fcgi.conf配置FastCGI相關的參數,我使用的軍哥的版本,nginx預設的是fastcgi.conf
   }

  location /status {
   stub_status on;
   access_log off;
  }

  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
   {
    expires      30d;
   }

  location ~ .*\.(js|css)?$
   {
    expires      12h;
   }

  access_log  /home/wwwlogs/access.log  access;
 }
include vhost/*.conf; #將其它虛擬機器主機的設定檔置於vhost子檔案夾下即可通過此語句自動生效
}

5.配置啟動指令碼

nginx啟動指令碼通用性很強,我直接借用軍哥提供的指令碼:


wget -c http://soft.vpser.net/lnmp/ext/init.d.nginx
cp init.d.nginx /etc/init.d/nginx
chmod +x /etc/init.d/nginx
update-rc.d -f nginx defaults
配置完成。此時隨便往wwwroot下cat >> index.html點內容就可以訪問測試了。直接存取http://網域名稱/status也可以,能夠看到tengine的狀態模組。

MySQL

1.安裝前配置

同樣是先安裝使用的包,再配置使用者……然後同樣我也把具體依賴哪些包忘掉了=。=還是缺啥補啥就可以了。


apt-get install libncurses5 libncurses5-dev
groupadd mysql
useradd -M -s /usr/sbin/nologin -g mysql mysql

2.編譯安裝MySQL

先吐個槽……MySQL的源碼包下載地址還真是難找,我最後是從5.1.66發布的新聞上找到的,官網我翻了半天愣是沒翻到直接的地址。


wget ftp://mirror.switch.ch/mirror/mysql/Downloads/MySQL-5.1/mysql-5.1.66.tar.gz
tar zxf mysql-5.1.66.tar.gz
cd mysql-5.1.66
./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-assembler --with-mysqld-ldflags=-all-static --with-charset=utf8 --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile
make && make install
MySQL編譯的時間較長,建議開screen編譯然後去喝杯咖啡之類的……配置參數上可以看出來我沒有安裝innodb。要裝的話需要加上—with-plugins=innobase。早期MySQL預設是編譯有debug資訊的版本,自5.1.16後預設編譯無debug資訊的版本了(需要的話要加—with-debug)。兩者之間的效能差距據說有5%-10%。另外—with-mysqld-ldflags=-all-static也是一個對效能提升比較重要的參數。

3.配置MySQL


cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
sed -i 's/skip-locking/skip-external-locking/g' /etc/my.cnf

主設定檔。第二句的作用是把skip-locking改為skip-external-locking。MySQL5.5將廢棄skip-locking選項,使用的話會出錯。而現在5.1系列會提示建議用skip-external-locking來替換。

接下來安裝MySQL資料庫:

/usr/local/mysql/bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var

配置啟動指令碼:

cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysql
chmod 755 /etc/init.d/mysql

執行安全安裝清理:

/usr/local/mysql/bin/mysql_secure_installation

剛安裝完MySQL,root是沒有密碼的。執行這個指令碼會協助你為root設定密碼,並刪除資料庫中的匿名賬戶和測試資料庫。
 
然後清理許可權和符號連結,此部分來源于軍哥的lnmp指令碼,具體作用我還不是很清楚:


chown -R mysql /usr/local/mysql/var
chgrp -R mysql /usr/local/mysql/.

cat > /etc/ld.so.conf.d/mysql.conf<<EOF
/usr/local/mysql/lib/mysql
/usr/local/lib
EOF
ldconfig

ln -s /usr/local/mysql/share/mysql /usr/share/
ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
ln -s /usr/local/mysql/include/mysql /usr/include/mysql

ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
ln -s /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump
ln -s /usr/local/mysql/bin/myisamchk /usr/bin/myisamchk
MySQL安裝完成,可以用/etc/init.d/mysql start來測試一下了。

PHP-FPM

好了重頭戲來了……這部分我基本上是一行一行照著wangyan的指令碼執行的,沒有多少自己嘗試的成分。而且同之前一樣,具體需要安裝哪些包我也忘了……

1.安裝準備


apt-get -y install zlibc zlib1g zlib1g-dev
apt-get -y install libfreetype6 libfreetype6-dev
apt-get -y install libxml2 libxml2-dev
apt-get -y install libmhash2 libmhash-dev
apt-get -y install curl libcurl3 libcurl4-openssl-dev
apt-get -y install libxmlrpc-core-c3 libxmlrpc-core-c3-dev

2.編譯依賴

需要編譯的依賴主要包括libpng、libjpeg、libiconv(這三者gd要用)、libmcrypt、mhash、mcrypt。編譯的過程強式一致性:


wget 源碼包地址
tar zxf 源碼包
cd 源碼目錄
./configure --prefix=/usr/local
make && make install
其中地址為:
http://src-mirror.googlecode.com/files/libpng-1.5.13.tar.gz http://src-mirror.googlecode.com/files/jpegsrc.v8d.tar.gz http://src-mirror.googlecode.com/files/libiconv-1.14.tar.gz http://src-mirror.googlecode.com/files/libmcrypt-2.5.8.tar.gz http://src-mirror.googlecode.com/files/mhash-0.9.9.9.tar.gz http://src-mirror.googlecode.com/files/mcrypt-2.6.8.tar.gz

mhash編譯完成後需要執行一次ldconfig。

3.編譯PHP

因為選用的版本是5.4.9,所以PHP-FPM的支援是內建的,不需要像5.3之前的版本那樣下載php-fpm-diff來手動patch源碼。

安裝過程如下:


wget http://www.php.net/distributions/php-5.4.9.tar.gz
tar zxf php-5.4.9
cd php-5.4.9
./configure --prefix=/usr/local/php --with-curl --with-curlwrappers --with-freetype-dir --with-gettext --with-gd --with-iconv-dir --with-jpeg-dir --with-libxml-dir --with-mcrypt --with-mhash --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-openssl --with-pear --with-png-dir --with-xmlrpc --with-zlib --enable-bcmath --enable-calendar --enable-exif --enable-fpm --enable-ftp --enable-gd-native-ttf --enable-inline-optimization --enable-mbregex --enable-mbstring --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-sysvshm --enable-xml --enable-zip
make ZEND_EXTRA_LIBS='-liconv'
make install

超長的configure命令有木有。wangyan原版指令碼裡面參數是用\續行符分成一個參數一行的,一個螢幕只顯示了這一個命令……
具體的參數意義我就不講了,基本上都能從名字上看出來。比較關鍵的—enable-fpm別漏了。

4.安裝部分PHP擴充

包括PDO MySQL和memcache擴充。

PHP擴充的安裝方式非常統一,都是到指定目錄下執行phpize,然後再進行常規編譯安裝即可。
下面的命令開始前工作目錄在PHP的源碼目錄下。


cd ext/pdo_mysql/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql
make && make install

cd ../../..
wget http://src-mirror.googlecode.com/files/memcache-2.2.6.tgz
tar zxf memcache-2.2.6.tgz
cd memcache*
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir --enable-memcache
make && make install

5.PHP配置

繼續照抄wangyan的指令碼。配置主要包括兩個方面,一個是php.ini的配置,一個是php-fpm的配置


for i in `ls /usr/local/php/bin`; do ln -s /usr/local/php/bin/$i /usr/bin/$i; done #為php的執行檔案做軟串連

cp php-*/php.ini-production /usr/local/php/lib/php.ini #此處的php-*指php源碼目錄,根據情況進行調整
sed -i 's#; extension_dir = "./"#extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/"\nextension = "memcache.so"\nextension = "pdo_mysql.so"\n#g' /usr/local/php/lib/php.ini #修改擴充的目錄,啟用memcache和pdo_mysql

sed -i 's/short_open_tag = Off/short_open_tag = On/g' /usr/local/php/lib/php.ini
sed -i 's/disable_functions =/disable_functions = system,passthru,exec,shell_exec,popen,symlink,dl/g' /usr/local/php/lib/php.ini
sed -i 's/max_execution_time = 30/max_execution_time = 300/g' /usr/local/php/lib/php.ini
sed -i 's/post_max_size = 8M/post_max_size = 80M/g' /usr/local/php/lib/php.ini
sed -i 's/magic_quotes_gpc = Off/magic_quotes_gpc = On/g' /usr/local/php/lib/php.ini
sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /usr/local/php/lib/php.ini
sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 20M/g' /usr/local/php/lib/php.ini
#sed -i 's#;date.timezone =#date.timezone = Asia/Shanghai#g' /usr/local/php/lib/php.ini #這句被我去掉是因為我並不想使用上海時區
sed -i 's#;sendmail_path =#sendmail_path = /usr/sbin/sendmail -t -i#g' /usr/local/php/lib/php.ini
接下來要進行php-fpm的配置。php-fpm的設定檔我使用的是wangyan的版本,他的php-fpm.conf的內容在此處,拷貝到/usr/local/php/etc/目錄下。其中對listen參數的配置,他使用的是在9000連接埠監聽的形式來提供fastcgi服務,我把它修改成了/tmp/php-fpm.sock的unix socket形式以與我的nginx配置保持統一。另外他預設的運行使用者和組也是www和www,如果有不同需要根據環境進行修改。
然後配置php-fpm的啟動指令碼(源碼內建)

cp php-5.4.*/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm #此處的php-*指php源碼目錄,需要根據情況進行調整
chmod 755 /etc/init.d/php-fpm
update-rc.d -f php-fpm defaults
/etc/init.d/php-fpm start
此時安裝基本完成,可以在wwwroot下寫一個php檔案填入phpinfo()來測試工作是否正常。

6.安裝Zend Guard Loader

雖然我這麼寫了,但是實際上PHP5.4是沒有Zend Guard Loader(之前的Zend Optimizer)的,官方提供的只到5.3為止。wangyan的指令碼裡雖然將它拷貝並配置好了,但是實際上並不能被載入。查閱一些資料後發現等Zend出新版本的ZGL還要等很久。

因為本身對PHP依賴就不大,所以其它的Xcache、APC之類的加速器我也沒裝,就此收工了

到此為止,一個完整的Nginx+MySQL+PHP-FPM的環境就編譯安裝完成了。我掛了了一些監控指令碼做測試,各項功能都很正常。

wangyan的lanmp指令碼寫的非常非常漂亮,比軍哥的lnmp指令碼可讀性強很多。建議有興趣的童鞋都去看一看。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.