初学python和django, 为了在本地的FreeBSD上实现一个Python的Web调试环境,这两天多方查了资料和一些书籍,学习了下如何在Nginx当中通过FastCGI来配置一个最基础的Server,来提供对于Django框架应用的访问。途中遇到了些难以捉摸的问题,特别Mark下。
首先,Ports里已经提供了所有需要的软件,这里就通过ports来安装。
安装nginx:
# cd /usr/ports/www/nginx && make install clean
安装flup:
# cd /usr/ports/www/py-flup && make install clean
安装django:
# cd /usr/ports/www/py-django && make install clean
理论上这些就ok。而后为了测试我们的server是否工作,我们可以建立一个类似hello world的django项目,随便创建一个文件夹,在下面运行:
# django-admin.py startproject testsite
*这里的django-admin.py在FreeBSD当中的位置通常是/usr/local/bin/下
这时会出现一个testsite的目录,django自动在里面创建了几个基础的python源文件用来管理你的site。进入目录后,通过manage.py可以创建一个开发用server或者fastcgi的服务,这也是我目前所知的一些基本的方法:)
通过这个命令可以开动一个django的server:
# python manage.py runserver
这个命令只会(应该也只允许)通过127.0.0.1来开动一个简单的server,使得此django项目可以通过浏览器访问。在这个命令后可以输入一个可选的数字来指定端口号,如果不指定默认是8000。这种server仅可以通过127.0.0.1来访问,也就是说不可以通过别的计算机来访问。
言归正传,如果我们需要让它通过nginx来访问的话,必须通过fastcgi的形式来启动服务,同样运行manage.py :
# python manage.py runfcgi method=threaded host=127.0.0.1 port=8888
这里就在本地的8888端口开启了一个fastcgi服务。关于method还有比较常用的是prefork模式,它会指定一个socket和pid。在配置nginx时,两种方式对应的配置也将有所不同。作为初学者,这些模式的区别和原理我并没有搞的太明白,Mark下先。
正常的话,运行上面的命令成功将没有任何的返回和信息,我们可以通过lsof来查看这个fastcgi是否在运行:
# lsof -c python | grep LISTEN
一般可以看到有一些对应8888端口的监听正在运行,这就表示你的fastcgi已经成功运行了。现在开始配置nginx。
nginx的配置文件在FreeBSD通常位于/usr/local/etc/nginx/nginx.conf,我在这个文件的配置大概如下:
============================================
user www www;
worker_processes 5;
error_log /var/log/nginx/error.log warn;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 10240;
use kqueue;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 4 2k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
keepalive_timeout 75 20;
tcp_nodelay on;
client_max_body_size 10m;
client_body_buffer_size 256k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
client_body_temp_path /var/log/nginx/client_body_temp;
proxy_temp_path /var/log/nginx/proxy_temp;
fastcgi_temp_path /var/log/nginx/fastcgi_temp;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 32k;
gzip_types text/plain application/x-javascript text/xml text/css;
ignore_invalid_headers on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
location / {
# host and port to fastcgi server
fastcgi_pass 127.0.0.1:8888;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
============================================
上面的配置中,127.0.0.1:8888 就对应我运行的fastcgi,
如果是通过socket形式则需要指定对应socket的路径。
这里有个比较有意思的地方,nginx升级之后,gzip_types的配置不可以包含text/html,
查了下说法是默认已经包含了,不过在曾经的版本是不会报错的。
配置完成之后可以通过/usr/local/sbin/nginx -t 来测试下配置文件是否正确。
而后为了使nginx的新配置生效,我们必须运行下面的命令:
# /usr/local/sbin/nginx -s reload
这里比较有意思,因为运行service nginx restart是会失败的,同样配置也是不会生效的。
我们必须通过上面的命令来重启nginx使之应用新的配置(这个问题让我google了很久)。
到这里我们就可以测试下我们第一个django site了,可以直接在别的机器上输入这个BSD的IP,
如果出现类似下面的信息:
It worked!
Congratulations on your first Django-powered page.
Of course, you haven't actually done any work yet. Here's what to do next:
- If you plan to use a database, edit the DATABASES setting in firstsite/settings.py.
- Start your first app by running python firstsite/manage.py startapp [appname].
You're seeing this message because you have DEBUG = True in your
Django settings file and you haven't configured any URLs. Get to work!
就表示我们的Django网站已成功通过fastcgi和nginx运行在FreeBSD上了。
================================================
到这里的时候我想,反正django配成了,不如顺手也通过fastcgi把php也配置一下。
php通过nginx和fastcgi的话,需要php以及php-fpm。
对于php-fpm,据官方资料在php 5.3之后的版本已经包含在php当中,不需要另外下载安装。
当然如果更新了ports的话,现在可以直接安装php 5.3.6
# cd /usr/ports/lang/php5 && make install clean
正常的话php-fpm也会跟随php完成安装。当然要先配置一下php-fpm,
它的配置文件位于/usr/local/etc/php-fpm.conf
现在我仅仅简单的修改下它的host和端口绑定:listen=127.0.0.1:9001
完成后,我们可以运行php-fpm了:
# /usr/local/etc/rc.d/php-fpm start
ok,然后同样在nginx.conf添加server的配置:
server {
listen 8001;
server_name localhost;
root '/usr/sites/php/mysite';
index index.php;
location ~*\.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
这里我在/usr/sites/php/mysite下建立了个index.php,里面的内容是
完成后,同样通过nginx -s reload来应用配置文件。之后打开127.0.0.1:8001,
就可以看到经典的php测试页面了:)
接下来会继续学习Django和python的web开发,希望会很快有新的值得记录的东西:)