Sep 11

在Hostmonster上部署django的常见方法,可以参考文章http://www.frankdu.com/blog/archives/334

但是在实际部署中,发现很难按照那样的步骤成功部署。经过摸索,我的部署方法如下:

1. 安装Python 2.5
虽然django可以在python 2.3及以上版本运行,但是最推荐版本是2.5,在hostmonster的主机上提供的是2.3,所以你可以想安装python 2.5到个人目录中。基本安装步骤是,到www.python.org下载合适的安装版本。如果想从源代码安装,需要登陆SSH然后执行以下步骤:
a. 使用wget下载源代码
b. tar zxvf python-VERSION.tar.gz
c. cd python-VERSION
d. ./configure –prefix=$HOME
e. make
f. make install
如果安装缺乏软件,请按照提示安装。

2. 安装Django
最新的正式版本是django 1.0,以此为例安装步骤如下:
a. wget http://www.djangoproject.com/download/1.0/tarball/
b. tar zxvf Django-1.0.tar.gz
c. cd Django-1.0
d. export PATH=$HOME/bin:$PATH
e. python setup.py install

3. 设置路径
编辑“.bash_profile”文件,设置PATH和PYTHONPATH,以便程序能正确运行:
export PATH=$HOME/bin:$HOME/lib/python2.5/site-packages/django/bin:$PATH
export PYTHONPATH=$PYTHONPATH:$HOME/django/django_projects

然后重新加载.bash_profile,使新配置生效:
source ~/.bash_profile

4. 创建mysql数据库和账户等信息
在cPanel中创建用于django项目的mysql数据、数据库用户,并记录下来用于项目设置。

5. 创建项目目录
cd ~
mkdir django_projects
mkdir django_templates
cd django_projects
django-admin.py startproject mysite
chmod 600 mysite/settings.py
最后一句用于设置settings.py的文件权限,阻止其他用户看到我们的数据库、用户、密码等重要信息。修改settings.py的内容,设置数据库、时区、模板目录等信息。

6. 配置FastCGI
这一步非常重要!首先在cPanel的“Apache Handlers”中添加以下信息:
处理器名称:fcgid-script
文件扩展名:.fcgi

然后,在你想添加django支持的网站目录中,安装fcgi.py、django.cfgi,并加入URL改写规则。

wget http://svn.saddi.com/py-lib/trunk/fcgi.py
chmod 755 fcgi.py
下载文件并设置权限,如果文件无法下载,也可以使用链接http://www.frankdu.com/download/fcgi.py

在同一个目录,创建文件django.fcgi,文件内容如下:

#!~/bin/python
import sys, os
sys.path.insert(0,”/home/your-user-name/django/django_projects”)
from fcgi import WSGIServer
os.environ['DJANGO_SETTINGS_MODULE'] = ‘mysite.settings’
from django.core.handlers.wsgi import WSGIHandler
WSGIServer(WSGIHandler()).run()

要注意, 上面的”your-user-name”需要改为你在hostmonster的用户名。“django_projects”是咱们建立的放项目的目录. 第5行的”mysite”是Django生成的项目的名字. 这几个一定要对应!

同样要修改执行权限 :
chmod 755 django.fcgi

7. 配置Rewrite Rule
这个就简单了, 照葫芦画瓢! 和上面的django.fcgi文件在同一个目录下, 建立.htaccess文件(别把点忘了), 内容如下RewriteEngine On
RewriteBase /
RewriteRule ^(media/.*)$ - [L]
RewriteCond %{REQUEST_URI} !(django.fcgi)
RewriteRule ^(.*)$ django.fcgi/$1 [L]

8. 搞定

好了,到这里就搞定了!可以写一些测试脚本,放上来运行一下。我安装的域名是http://www.visafly.com,测试工作情况可以访问http://www.visafly.com/time/

Sep 11

我个人的部署方案请访问http://www.frankdu.com/blog/archives/333

1. 事前准备
安装SVN(Hostmonster默认是不支持SVN的, 需要自己安装) ,开通SSH(Hostmonster里要想启用SSH, 竟然还需要身份证, 我ft…) , 并SSH上你的主机

因为之前已经在Hostmonster的主机上装好了SVN, 并且开通了SSH, 所以省了很多事情:)

2. 获取Django代码
在”~/”下建立”django_src”目录

mkdir django_src
进入目录

cd django_src
使用SVN获取代码

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

3. 设置路径
编辑”.bash_profile”文件, 设置PYTHONPATH 和 PATH路径, 方便使用Django

export PATH=$PATH:$HOME/django_src/django/bin
export PYTHONPATH=$PYTHONPATH:$HOME/django_src:$HOME/django_projects
重新加载”.bash_profile”文件, 来启用配置的路径

source ~/.bash_profile

4. 建立项目目录
在”~/”下建立”django_projects”目录

mkdir django_projects
进入目录

cd django_projects
建立Django项目”myproject”

django-admin.py startproject myproject
修改”myproject.settings”文件的权限, 限制只有你的用户可以读取, 这样可以避免同一个服务器上其他用户访问你的DB

chmod 600 myproject/settings.py

5. 配置FastCGI
这一步我花的时间最长! 关键是原文中的fcgi.py不能下载了, 我找了其他的fcgi.py又不对. 郁闷之下翻看了官方的文档, 官方文档说要用flup, 我又折腾了半天flup, 未果… 最后又Google了一堆fcgi.py, 终于被我找到一个对头的:)
现在BlueHost的控制面板里建立一个子域名(SubDomain), 建立成功后他会在你的”~/public_html”目录下建立对应的子域名的目录. 我建立了一个叫”lab”的子域名. 然后进入到这个目录中, 下载fcgi.py

wget http://svn.saddi.com/py-lib/trunk/fcgi.py
下载完毕后, 修改执行权限

chmod 755 fcgi.py
继续在这个目录下建立Django.fcgi, 文件内容如下

#!/usr/bin/env python
import sys, os
sys.path.insert(0,”/home/username/django_src”)
sys.path.insert(0,”/home/username/django_projects”)
from fcgi import WSGIServer
os.environ[’DJANGO_SETTINGS_MODULE’] = ‘myproject.settings’
from django.core.handlers.wsgi import WSGIHandler
WSGIServer(WSGIHandler()).run()

要注意, 上面的”username”需要改为你在BlueHost的用户名. “django_src”是最开始建立的放Django源代码的目录, “django_projects”是咱们建立的放项目的目录. 第6行的”myproject”是Django生成的项目的名字. 这几个一定要对应!

同样要修改执行权限, 这里再提醒一下大小写!

chmod 755 Django.fcgi
6. 配置Rewrite Rule
这个就简单了, 照葫芦画瓢! 和上面的Django.fcgi文件在同一个目录下, 建立.htaccess文件(别把点忘了), 内容如下

RewriteEngine On
RewriteBase /
RewriteRule ^(media/.*)$ - [L]
RewriteCond %{REQUEST_URI} !(django.fcgi)
RewriteRule ^(.*)$ django.fcgi/$1 [L]

7. 搞定
好了, 就酱紫了! 现在可以访问一下你新建的子域名了! 我建立的子域名是”lab”, 所以访问的就是 http://lab.v2nb.com . 看到django的字样了吧?
这里只是配置完了Web服务的部分, Django部分还需要自己再配置一下, 或者直接放上你自己的Django网站:)
如果有需要, 可以再修改.htaccess, 或者参考我参考的帖子:)

8. 参考
http://www.bluehostforum.com/showthread.php?t=715

http://wiki.dreamhost.com/index.php/Django#Setup

http://www.djangoproject.com/documentation/fastcgi/

http://blog.donews.com/limodou/archive/2006/03/29/799059.aspx

http://svn.saddi.com/py-lib/trunk/fcgi.py

来源:http://www.nickcheng.com/2007/01/23/build-django-site-on-bluehost/?pageid=1

Jan 06

GNU make 有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。下表给出了一些主要的
预定义变量,除这些变量外,GNU make 还将所有的环境变量作为自己的预定义变量。

预定义变量????????????????????? 含义
$*????????????? 不包含扩展名的目标文件名称。
$+????????????? 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$<????????????? 第一个依赖文件的名称。
$?????????????? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
$@????????????? 目标的完整名称。
$^????????????? 所有的依赖文件,以空格分开,不包含重复的依赖文件。
$%????????????? 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称
??????????????? 为 mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。
AR????????????? 归档维护程序的名称,默认值为 ar。
ARFLAGS???????? 归档维护程序的选项。
AS????????????? 汇编程序的名称,默认值为 as。
ASFLAGS???????? 汇编程序的选项。
CC????????????? C 编译器的名称,默认值为 cc。
CCFLAGS???????? C 编译器的选项。
CPP???????????? C 预编译器的名称,默认值为 $(CC) -E。
CPPFLAGS??????? C 预编译的选项。
CXX???????????? C++ 编译器的名称,默认值为 g++。
CXXFLAGS??????? C++ 编译器的选项。
FC????????????? FORTRAN 编译器的名称,默认值为 f77。
FFLAGS????????? FORTRAN 编译器的选项。

出处:http://www.aka.org.cn/Lectures/001/Lecture-1/make.html

Jan 06

遍历并打印linux的环境变量的代码片段:

#include <stdlib.h>

//The ENVIRON variable contains the environment
extern char** environ;

int main(){
        char** var;
        for(var = environ; *var != NULL; ++var){
                printf("%s\n", *var);
        }
        return 0;
}
 

如果需要读取、设置或清楚环境变量,请分别man这几个:getenv、setenv、unsetenv。

Jan 06

1. 包含getopt.h
2. 定义短选项,比如,ho:v
3. 定义长选项结构,注意最后一项全部设为0
4. 未定义的选项,解析时会返回’?’
5. 含有参数的选项,参数存于全局变量optarg中
6. 非参数选项的起始索引,存于全局变量optind中

示例程序如下:

#include <stdlib.h></stdlib.h>
#include <stdio.h></stdio.h>
#include <getopt.h></getopt.h>

const char* program_name;

void print_usage(FILE* stream, int exit_code){
        fprintf(stream, "Usage: %s options [ inputfile ...]n", program_name);
        fprintf(stream, "    -h   –help        Display this uage information.n"
                        "    -v   –verbose     Print verbose message.n"
                        "    -o   –output filename    Write output to file.n");
        exit(exit_code);
}

int main(int argc, char* argv[]){
        int next_option;
        const char* short_options = "ho:v";
        const struct option long_options[] = {
                {"help", 0, NULL, ‘h’},
                {"output", 1, NULL, ‘o’},
                {"verbose", 0, NULL, ‘v’},
                {NULL, 0, NULL, 0}
                };
        const char* output_filename = NULL;
        int verbose = 0;
        program_name = argv[0];
        do{
                next_option = getopt_long(argc, argv, short_options, long_options, NULL);
                switch(next_option){
                        case ‘h’:
                                print_usage(stdout, 0);
                        case ‘o’:
                                //the global var optarg contains the specified argument
                                output_filename = optarg;
                                break;
                        case ‘v’:
                                verbose = 1;
                                break;
                        case ‘?’: //if the arg list contains invalid options
                                print_usage(stderr, 1);
                        case -1:
                                break;
                        default:
                                abort();
                }
        }while(next_option != -1);
        printf("[option] verbose: %dn", verbose);
        printf("[option] output: %sn", output_filename);
        if(verbose){
                int i;
                //the global var optind contains the index of the first nonoption argument
                for(i = optind; i<argc;></argc;>                        printf("Argument: %sn", argv[i]);
                }
        }
        return 0;
}

相应的Makefile:

CC=g++
CFLAGS=-Wall -g

all: getopt

getopt: getopt.o
        $(CC) $(CFLAGS) -o $@ $@.o

%.o: %.c
        $(CC) $(CFLAGS) -c $+

clean:
        rm -f *.o
        rm -f getopt

Nov 29

在虚拟机上安装了一个linux使用,缺省安装,启动起来就进入x-window。很多情况下,只是通过SSH连过去操作,并不需要图形界面。记一下,修改方法:

使用vi修改文件/etc/inittab

将里面默认runlevel从5修改到3即可。

不要设置为0或6。每个runlevel,在/etc/inittab都有详细注释。

Nov 10

虚拟机上装了一个Linux,很久不用,又忘记密码了,记一下恢复步骤吧:

我们可以使用单用户Linux 模式来登录,然后设置一个新的root口令。要进入单用户模式,重新引导计算机。如果我们使用的是默认的引导装载程序GRUB ,可以执行下列步骤来进入单用户模式:

1. 在引导装载程序菜单上,键入 e 来进入编辑模式。

2. 我们会面对一个引导项目列表。查找其中类似以下输出的那一行:

?kernel /vmlinuz-2.4.18-0.4 ro root=/dev/hda2

3. 按箭头键直到这一行被突出显示,然后按 e

4. 按一下空格键来添加一个空格,然后添加 single 来通知GRUB 引导单用户Linux 模式。按 Enter ?键来使编辑结果生效。

5. 我们会被带回编辑模式屏幕,从这里,按? b ,GRUB 就会引导单用户 Linux 模式。载入结束后,会看到一个类似以下的 shell 提示:

?sh-3.0#

现在,可以设置root密码了,键入:

?sh-2.05# passwd root

屏幕会提示重新键入口令来校验。结束后,口令就会被改变,我们就可以在提示下键入 reboot 来重新引导;然后,象平常一样登录为根用户。Voila! Done!

Aug 26

换了新的虚拟主机,有很多文件需要迁移,其中一个问题是通过FTP把原服务器的文件夹拷贝过去。由于速度的原因,最好直接服务器对服务器拷贝。用FlashFXP的服务器对传发现不行,只好到处找批量下载的shell脚本或者程序。

无果之下,准备动手写一个,用Python中的ftplib模块。这时忽然发现Python安装目录的子目录[Tools/Scripts]里面,有一个ftpmirror.py!Hallelujah!正是我要找的!

它的使用文档是:

Mirror a remote ftp subtree into a local directory tree.

usage: ftpmirror [-v] [-q] [-i] [-m] [-n] [-r] [-s pat]
[-l username [-p passwd [-a account]]]
hostname[:port] [remotedir [localdir]]
-v: verbose
-q: quiet
-i: interactive mode
-m: macintosh server (NCSA telnet 2.4) (implies -n -s ‘*.o’)
-n: don’t log in
-r: remove local files/directories no longer pertinent
-l username [-p passwd [-a account]]: login info (default .netrc or anonymous)
-s pat: skip files matching pattern
hostname: remote host w/ optional port separated by ‘:’
remotedir: remote directory (default initial)
localdir: local directory (default current)

比如,复制远程服务器ftp.somewhere.com上/huashi文件夹及所有内容,保存到本地的/home/frank/huashi下,命令是:

python ftpmirror.py -v -l ftp_login_name -p ftp_password ftp.somewhere.com /huashi /home/frank/huashi

剩下的就是等待了,:D

Aug 26

在使用ls列出文件的时候,我比较习惯于那种有文件的显示。今天把主机空间迁移到了dreamhost,发现有SSH可以使用,但是习惯在redhat上敲的ll命令却不能使用,这下得自己动手,解决一下了。

这个简单,执行命令:

alias ll=’ls -l –color=auto’

然后就可以了。但是问题是,下次SSH登录上去,发现这个alias就没有了。怎么办呢?修改了文件.alias,无效;修改了文件.bashrc,无效;最后在zhenyang的帮助下,把那面那行命令加入到了文件.bash_profile中,bingo!终于成功了!