Chinaunix首页 | 论坛 | 博客
  • 博客访问: 297950
  • 博文数量: 34
  • 博客积分: 2375
  • 博客等级: 大尉
  • 技术积分: 354
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-09 05:49
文章存档

2013年(1)

2012年(3)

2011年(10)

2010年(20)

我的朋友

分类: BSD

2011-12-01 13:26:44

初学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开发,希望会很快有新的值得记录的东西:)
阅读(2850) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~