ReadEasy

29 8月, 2011

ubuntu nginx with PHP5 + Python + Django建置筆記

最近在科科的勸裝下試跑nginx

幾天後越用越上手(!)

發現apache真的太嫩了....

所以不小心給nginx弄出了django+python+php的環境

在這邊筆記一下從ngnix到fastcgi step by step的配置





sudo apt-get install nginx
安裝完畢後 , 檢查 http://localhost 應該是會噴出welcome nginx的頁面

如果沒有,先start service
sudo /etc/init.d/nginx start

目前nginx只有解析靜態htm的能力

所以要設定fastcgi並且讓nginx可以丟給他處理


上php5 以及fastcgi
sudo apt-get install php5 php5-cgi

安裝完後新增一個script進/etc/init.d啟動fastcgi

sudo gedit /etc/init.d/php-fastcgi
(可能有的人比較喜歡vim , 隨意啦...)

BIND = 127.0.0.1:9000的部份是綁的port

如果跟你目前的程序有衝突到的話

請改其他的port

#!/bin/bash

BIND=127.0.0.1:9000

USER=www-data

PHP_FCGI_CHILDREN=15

PHP_FCGI_MAX_REQUESTS=1000



PHP_CGI=/usr/bin/php-cgi

PHP_CGI_NAME=`basename $PHP_CGI`

PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"

RETVAL=0



start() {

      echo -n "Starting PHP FastCGI: "

      start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS

      RETVAL=$?

      echo "$PHP_CGI_NAME."

}

stop() {

      echo -n "Stopping PHP FastCGI: "

      killall -q -w -u $USER $PHP_CGI

      RETVAL=$?

      echo "$PHP_CGI_NAME."

}

case "$1" in

    start)

      start

  ;;

    stop)

      stop

  ;;

    restart)

      stop

      start

  ;;

    *)

      echo "Usage: php-fastcgi {start|stop|restart}"

      exit 1

  ;;

esac

exit $RETVAL
啟動fastcgi
sudo /etc/init.d/php-fastcgi start

要設定開機啟動的話
update-rc.d php-fastcgi default


接下來設定nginx

nginx的設定檔案跟apache2的httpd.conf很像

都是放在sites-available , 底下可以放很多個別的設定檔案

檔名隨意

在做virtual host的時候比較建議個別設定 , 日後比較好維護


新增後的檔案 , 必需連結到sites-enabled

ln -s /etc/nginx/sites-available/xxx /etc/nginx/sites-enabled/xxx

在restart nginx才會套用


預設有一個default檔案
sudo gedit /etc/nginx/sites-available/default
(可能有的人比較喜歡vim , 隨意啦...)

設定檔內server{}所包起來的就是個別的主機設定

所以要作virtual host的時候就是要分開

{照前面所說的,可以寫一起....也可以分開設定 \

只要都是被server{}包起來的 , 在nginx眼裡都一樣...}


listen   80 default;

server_name  localhost;

如果有放多個設定檔案或者同port的請把listen的default拿掉,

server_name就是處理virtual host的關鍵了

e.g.
server{

server_name aaa.com;

}
這樣這個server部份就是處理aaa.com的部份 ,

要丟到哪個folder啦等等一堆其奇怪怪得個別設定

access_log  /var/log/nginx/localhost.access.log;

這是指定http的所有請求要丟到哪個log


location / {

  root   /var/www/nginx-default;

  index  index.php index.html index.htm;

}

root這部份就是設定網址要處理哪裡 ,

也就是作URI routing

我這邊nginx裝好後預設在/var/www/nginx-default

可以分開不同的root


location /home {

  root   /home;

}
只要存在這都是被允許的

index  index.php index.html index.htm;

這是設定index的名稱 , 同時也是排先後順序

從index.php>index.html>index.htm找下來

都沒有就噴404   Orz




這是指定錯誤要噴哪些頁面

#error_page  404  /404.html;

 # redirect server error pages to the static page /50x.html

 #

 #error_page   500 502 503 504  /50x.html;

 #location = /50x.html {

 # root   /var/www/nginx-default;

 #}

比較需要注意的部份

# proxy the PHP scripts to Apache listening on 127.0.0.1:80

 #

 #location ~ \.php$ {

  #proxy_pass   http://127.0.0.1;

 #}

 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

 #

 location ~ \.php$ {

  fastcgi_pass   127.0.0.1:9000;

  fastcgi_index  index.php;

  fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;

  include fastcgi_params;

 }




#location ~ \.php$ {

  #proxy_pass   http://127.0.0.1;

 #}
這邊是要丟給apache處理所有php的部份

不要使用80 port跟nginx衝到的話要設定一下apache 的port

相關設定不再這次的筆記範圍 , 有需要的煩請自行google


location ~ \.php$ {

  fastcgi_pass   127.0.0.1:9000;

  fastcgi_index  index.php;

  fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;

  include fastcgi_params;

 }

location ~ \.php$即是有php副檔名都丟給以下fastcgi處理 (超不負責任XD)

這部份fastcgi_pass   127.0.0.1:9000;

就是先前設定script所綁的port , 如果有更動 , 請修改他



fastcgi_param  SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;

這邊即是指定要處理的目錄包含其底下的根目錄及檔案


設定完畢後 ,
sudo /etc/init.d/nginx restart

successful後就在設定的目錄底下

丟一個php檔案 , 內容是phpinfo()或簡單的echo都好Orz

正確的話就會噴該噴的頁面了哦~~~~

如果failed可能就要檢查一下是不是設定檔沒寫好

或者是 Google 一下錯誤訊息 , 一切都是這麼美好~~~


以下是python+django部份

Django , (我使用的svn直接checkout django project下來)

svn co http://code.djangoproject.com/svn/django/trunk

python setup.py install

或者是
sudo apt-get install python-django

裝完後django應該會把自己寫進$PATH

/usr/local/bin底下應該會有django-admin.py

在我安裝至少是這樣@ @ ,  如果不是的話可能就是find一下看藏在哪裡

要確認django有沒有成功安裝

在翻對岸文章的時候看到一個很簡單卻很猛的方法


len@len:~$ python

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)

[GCC 4.4.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import django

import django本身

沒有error就是安裝ok啦~~~

如果有錯誤 , 可能要先把django挖出來

很多相關資源都寫在/usr/lib/pythonx.x/site-packages

不過我就是找不到啊啊啊啊啊啊啊!!!!

囧 , 我翻了一下django的official document....


Where are my site-packages stored?
The location of the site-packages directory depends on the operating system, and the location in which Python was installed. To find out your system’s site-packageslocation, execute the following:
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
(Note that this should be run from a shell prompt, not a Python interactive prompt.)
Some Debian-based Linux distributions have separate site-packages directories for user-installed packages, such as when installing Django from a downloaded tarball. The command listed above will give you the system's site-packages, the user's directory can be found in /usr/local/lib/ instead of /usr/lib/.


超關鍵的/usr/local/lib...

挖了很久竟然是在/usr/local/lib/python2.6/dist-packages   Orz了一下




Start project

django-admin.py startproject Project

Project目錄底下應該會有
manage.py

__init__.py

settings.py

urls.py

切換到Project  ,
manage.py runserver 7777

正確的話127.0.0.1:7777 , 正確的話會噴It work頁面@ @

不過這樣的話就是獨立一個server @ @

要丟給nginx就要改變django使用cgi

安裝flup , django才能使用cgi大法

sudo apt-get install python-flup

新增一個檔案, 設定給nginx include , 放哪裡隨意

我是放/var/django.conf


fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

dastcgi_param  PATH_INFO          $fastcgi_script_name;


接下來設定nginx , 一樣是sites-available

server {

    location /py {

        fastcgi_pass 127.0.0.1:7777; #django runserver的port

        root /var/django/project;    #project位置

        include /var/django;         #設定檔案位置

    }

}

存檔後
sudo /etc/init.d/nginx restart

並且讓django以cgi方式bind 7777 port啟動

切換到porject目錄

manage.py runfcgi method=threaded host=127.0.0.1 port=7777

建議method以threaded啟動 , 比一般使用進程啟動來的強大(?)


打完收工 ~~~~~~~(gym)

沒有留言:

張貼留言