Let’s Encrypt 根证书问题解决方案

今年9月30号开始,Let’s Encrypt 提供的交叉签名根证书可能会导致请求出现 certificate has expired 或证书过期的报错,QingStor 团队总结的挺好的,感谢并分享下解决方案,证书链一般会自动更新,新系统通常没这个问题,解决方案简单说也是更新客户端的系统或者软件。

一、升级系统

保持系统处于更新状态是解决此类问题的最佳方案,但如果不便进行完整的升级,请着重升级 openssl,gnutls 和 ca-certificates。

CentOS / RHEL
yum upgrade openssl gnutls ca-certificates

Ubuntu / Debian
apt upgrade openssl libgnutls30 ca-certificates

该解决方案适用于如下平台:
Windows >= XP SP3
macOS >= 10.12.1
iOS >= 10
Android >= 7.1.1
Mozilla Firefox >= 50.0
Ubuntu >= xenial / 16.04
Debian >= jessie / 8
Java 8 >= 8u141
Java 7 >= 7u151
NSS >= 3.26

二、手动禁用过期证书

如果系统已不再提供更新,或者不便进行系统更新,可以手动禁用过期证书,具体的操作方案如下:

Linux 平台

打开并编辑 /etc/ca-certificates.conf 文件,在 mozilla/DST_Root_CA_X3.crt 这一行前增加一个 ! (感叹号,英文,半角)以禁用该证书,使之变为 !mozilla/DST_Root_CA_X3.crt 编辑完成后,运行 update-ca-certificates 命令以更新系统的证书链。

在 CentOS 7 及其以后的版本

需要执行如下命令:cp /etc/pki/ca-trust/extracted/cadir/DST_Root_CA_X3.pem /etc/pki/ca-trust/source/blacklist update-ca-trust

Windows 平台

使用快捷键 Win + r 并输入 certmgr.msc 以打开系统的证书管理器,搜索 DST ROOT CA X3 并删除相关证书后重启即可。

Java 平台

执行如下命令:sudo keytool -delete -alias dstrootcax3 -cacerts -storepass 'changeit'

Django ORM 里面一个容易被忽略的幂等性

不考虑并发写的情况, Django ORM 的 save 方法也不是幂等的, 而且比较容易被忽略, 比如

def f1(a):
    a.balance = F('balance') + 1
    a.save()

def f2(a):
    a.status = 1
    a.save()

a = Account.objects.create(balance=0, status=0)
with transaction.atomic():
    f1(a)
    ...
    f2(a)

最终数据库里 balance 的值是 2

因为执行 f2 的时候, a.balance 不是一个数值, 依然是一个表达式, f2 中执行 save 会再次对 balance 加 1

避免此类隐藏 bug 的方案是
1). 使用 F 函数更新 Django Model 时, save 以后强制执行一次数据库读取, 即 a.refresh_from_db(), 让 a.balance 变成一个数值
2). save 方法永远都带上 update_fields, 避免更新当前上下文以外的字段, 让 f2 方法提交的 SQL 只更新 status 的值

方案 1 是最保险的, 但个人建议是在大多数情况下, 还是采用方案 2 的编码规范

通过眼前的浏览器,我们看到全世界 —— 谈谈网页开发

本文献给正在寻找工程师的伙伴们,和即将开始工程师生涯的少年们

好久没有在ukisama上面写自己擅长的内容了,截止到今天凌晨,互联网上已经有大概6亿8千万张网页,而且依然在迅速增加。今天就来严肃地展开一下网页工程师的话题吧,关于他们的工作,关于他们的职业;关于HTML,关于Python;关于浏览器,关于这个世界。

周围有一些朋友的孩子也快要诞生了,将来可以考虑做个网页工程师呢~

每天的我们,在(还算)安静的办公室里,面对着电脑屏幕,忍受着窗外的喧嚣,随手点开浏览器,输入一段URL,敲下回车键。有没有这样的体验,网站瞬间被打开了,高质量的内容,干净的布局和优秀的设计让你过目难忘。感到吃惊是吧?这一切都归功于一类人,网页工程师,所谓的 Web Developers 们,他们不仅负责网站的搭建和网页的编码,还负责各种测试分析,以及一切和网站相关的维护。

如今网页的重要性毋庸置疑,在商业上,好的网站已经是企业保持竞争力的重要环节。伴随着网页开发技术的日新月异,优秀的网站层出不穷,网页工程师对于自己的工作已经不能有半点马虎,成为一个好的网页工程师也没有任何的捷径。

但问题就来了,正在频繁迭代产品的苦逼创业者们,应该寻找怎样的网页工程师呢?想成为网页工程师却只是刚刚试水HTML和JavaScript或者刚刚开始了解Python和Ruby的童鞋,又应该如何规划自己的技术之路呢?

登录过智联前程大街猎聘周伯通拉勾等等网站,浏览过各类工程师在线课程,接触过网页工程师相关的招聘和应聘的,应该不难发现一个趋势,就是这群人被集中分成了三大类:

前端工程师,后端工程师,全栈工程师

一个一个来说吧

 

1. 前端工程师 Front-End Developer

 

和用户发生交互的那一部分叫做网页的前端,说白了它就是你在浏览网页时可以看到的所有东西,字体、颜色、导航栏、下拉菜单、滚动的图片,等等等等,这一切都是由 HTML + CSS + JavaScript 拼装而成,在浏览器的渲染下变得井井有条,很神奇的!

 

相关技能和工具

 

前端工程师主要负责网站面向用户部分的代码,以及用户体验相关的架构。一个前端工程师必须熟练地掌握三门基本的语言:HTML,CSS和JavaScript。除此之外,前端工程师还应该熟悉一些样式框架比如Bootstrap和Foundation,和逻辑框架比如Backbone,AngularJS和EmberJS,这些框架确保了网页在不同平台上的质量和稳定性。最后还应该能够熟练的使用一些基本的工具库比如jQuery和SASS/LESS,这些能让开发更加高效,代码更加优质。

另外,很多招聘文案中都会要求求职者有Ajax的开发经验。Ajax技术使用JavaScript默默地和服务器通信来动态加载网页内容,以实现无缝的浏览体验。虽然这不是所有网站都必须的,但这也可以算是前端工程师的基本功之一,毕竟Ajax技术如今也越来越多地被应用到了网页中。

有了前面说的这些技能,前端工程师就可以很好的和设计师合作,和用户体验分析师合作,把草图和原型开发成成品。牛逼的前端工程师还能精确的发现用户体验相关的问题,给出建议和解决方案,用代码来增强设计。一个好的前端工程师还应该能够和业务人员流利的沟通,明白他们的目的,理解他们的需求,了解市场上的机会,并且顺利地执行。

总之在后端工程师造好屋子以后,前端工程师主要负责房屋的内饰。至于房屋的类型和品位,这就取决于房屋的主人了。相比于后端,前端工程师一般来说更加满足于自己的成果,毕竟这是一份技术和创意相结合的工作。经验丰富的前端工程师不仅是一个技术人员,不仅是一个Geek,因为他不仅实现了用户可以看到一切和可以交互的一切,还致力于给用户留下过目不忘的印象,所以他也是一个视觉达人。

 

那我们看到的网页是怎么来的呢?

 

再补充一下这个很多人都关心的话题吧,在网页开发过程中,设计师绘制Logo和图像,摄影师拍摄照片,文案编写文字,最后由前端工程师把它们组装在一起,用网页向我们阐释所有内容,用网页向我们提供独一无二的体验,把我们在网站上看到的所有内容变成可能。

体验一下? 点击打开 http://wedfairy.com 向下滑动页面的过程中上面的 八音盒 导航栏慢慢出现,把鼠标移动到“八音盒故事”的某个案例上面或者用手指按住一个案例,标题就会出现,这些都是前端工程师的功劳。

 

2. 后端工程师 Back-End Developer

 

新的问题来了,网页上的数据存在哪里?API又是什么?

就像一间没有造好的屋子,光有室内装饰还是远远不够的。于是我们还需要后端工程师。网页的后端包括服务器,应用程序,以及数据库。这些组件相互作用,使用API和前端通信,确保了网页前端的存在。后端工程师的主要工作就是搭建和维护这些组件。

 

相关技能和工具

 

相比于前端开发,后端开发的技术和工具比较多元。为了实现服务器、应用程序和数据库三者之间的通信,后端工程师通常使用Python,Ruby,PHP,Java,.Net等语言来编写应用程序,用MySQL,Oracle,MongoDB来查找、存储和修改数据,然后把它们部署到服务器上来为前端代码提供支持。在实际工作中,后端工程师至少需要掌握一个开发框架,比如PHP的Zend和Symfony,或者Python的Django;还需要能够熟练使用版本控制工具,比如Git和SVN;以及了解Linux开发环境。这些看起来比前端开发枯燥多了!

后端工程师需要使用这些框架和工具来为网站编写优质的代码,有可读性,可移植性,有完备的文档。然而和前端工程师一样,在开始埋头编码以前,后端工程师需要和业务人员充分沟通来理解他们的感性目标,将其转换为技术需求,提出具有可行性的有效方案,来搭建技术架构。

优秀的后端工程师同样热爱自己的工作,沉浸在后端的他们从来不觉得无聊,反而乐在其中。他们喜欢玩弄数据,编写出有用的API,按照不同的权限分配给网页前端、移动应用和其他系统,让前端工程师可以安心的沉浸在交互和布局中。通俗易懂的高质量的API受人尊敬,这就是后端工程师的价值所在。

 

我们怎样才能感受到后台的存在?

 

点击 http://qidlove.com 打开婚礼邀请函。此时 八音盒 的服务器会把信息发送到你的手机或电脑中,然后变成你所看到的内容。这就是后台工程师所做的事情。如果你向下滚动屏幕到最后,留下自己的姓名和祝福,点击发送,别人就可以看到你的留言,下一次你再打开这个网页,留言也不会消失,这些都多亏了后端工程师啊!

 

3. 全栈工程师 Full-Stack Developer

 

说到这里,首先要明确一点,前端开发和后端开发并不是黑与白的区别,前端工程师和后端工程师之间也没有恐怖分子和反恐精英这样子的暧昧关系。在目前的经济形势下,在这个资源紧缺的市场环境中,前端工程师往往需要学习(至少了解)一些后端开发的技能,反之亦然。产品开发有很多通用的规则,跨越了前后端的界限,于是我们开始寻找一种通才。

它的由来?

全栈工程师自然很早就存在,但是“全栈工程师”的叫法诞生于Facebook的开发部门。四年前,有一类特别的人群被挖掘出来,他们的工作内容涉及到了技术架构(技术栈)中的每一个环节,包括前端和后端,他们可以和后端工程师一样在服务器端玩弄应用程序和数据,也可以使用前端语言控制页面内容和调节用户体验,他们能够提供一套完整的系统。

总之,全栈工程师是网页开发的全能战士。

感觉很酷是吧?成为一个全栈工程师,同时精通前端和后端开发,无形之中给自己的职业生涯创造了很多机会。不过也别高兴得太早,就和烹饪一样,有人更擅长热菜,有人更擅长甜点,精通两者需要时间和经验。妈妈的手艺可不是一日炼成的,更不是简简单单的按照食谱来做就行(事实上很多工程师依然在这样错误的做着)。一个好的全栈工程师和一个好的大厨一样,需要有自己的内涵,需要有所有的烹饪原料,需要掌握所有的方法,才能奉献上一顿完美的晚餐。

 

相关技能和工具

 

全栈工程师需要掌握的技能相对复杂,甚至有些主观,因为这不仅仅只是技能相关的需求,而且随着时间的推移,人们对于他们的要求也在一点点变化。除了要根据不同项目掌握前端和后端开发的相应技能外,全栈工程师还需要充分理解网页正常运行的每一个环节,不仅包括合理的服务器配置,规范的API结构,还要通晓JavaScript的哲学,以及CSS背后的设计情怀。

举个栗子,现阶段一个典型全栈工程师的装备,HTML5/CSS3 + Scala + MongoDB + 云服务 + JavaScript

有了知识和技术,就还差经验了,这也是最后一道门槛,全栈工程师尤其需要能够在一个项目面前,快速地定义前端开发和后端开发的职责,分析各种解决方案的优势和劣势,最终选择最合理的执行方式。

 

老问题,作为用户如何感知网站背后的全栈工程师?

 

这个我真的说不出来了,自己去感受吧,页面加载需要多久,内容布局是否专业,交互体验是否自然,等等等等。

最后说一句

不要迷恋全栈工程师,任何时间,任何场合,都有一个“大而全”和“小而精”的选择,好的网站从来都不是一个人的功劳,不要忽略了设计师、摄影师、文案、产品经理、客户经理、销售、客服、用户、以及其他所有直接参与和间接参与到网页制作中的人们。识别优秀的工程师也并不一定只是技术层面的事情,无论是前端、后端还是全栈,工程师的自我修养还需要包括对细节的关注,自主学习的速度,解决问题的效率以及良好的沟通能力。

 

又该说再见了

 

如果你是个网页工程师,那么恭喜你,你现在最不需要担心的就是找到一份称心的工作,因为至少你可以来我这里,把简历扔过来吧 jobs@wedfairy.com 哈哈。事实上接下来五到十年是网页工程师最好混的时期了,HTML5终于定稿,五花八门的屏幕的出现,跨平台应用的需求越来越高,微信至少还火热着,加油啊!!!

有事没事,请关注这里 @鬼骨孖 的博客 http://blog.ukisama.com

2014 IS GOING TO BE A TOUGH YEAR

去年5月30号,过完生日一周,我用一篇毫不负责的博客文章为自己过去的三年画上潦草的句号,对大家说,我要开始新的生活了。

七个月后浦东,从陆家嘴一路向南,我和小猴时隔多年再次站在一部公交车里。小猴说门飞是个坏(shǎ)蛋(bī),不但弄破了他的爱车,还在写程序的时候开着另一个屏幕看美剧,看完一集写五分钟继续看下一集。

回家以后我坐下来回忆离开陋(fù)室(dàn)后的四年,心想一直没有变的何止是我。

我们陋室出来的少(diǎo)年(sī)可能永远都不会变了。我们从不缺少创意,却没有脚踏实地的本领。我们又把创意看的一文不值,让矛盾的自己无法立足。我们喜欢和他人分享喜悦,到最后独自在墙(lóu)角(xià)啜(tī)泣(qiú)。

我无时无刻不想回到过去,只可惜大家都说物是人非。挂靴两年,头一次买了新足球,暂时就家里玩玩。FIFA从来舍不得给自己买正版,因为这实在是太与时俱进。曾经一天一次的事情到现在都是一年一次,曾经见了都心烦的人如今连张合照都需要合成。

勉强让人开心的是周末做的事情差不多,在复旦,本地的学生周末可以回家,他们就是传说中高贵的走读生,剩下楼里没几个人,于是大家双休日不是吃饭就是写程序。如今竟然也一样,还有那些罗宾李手下的高级程序语言们,端午节都要跑公司去敲打键盘。

我突然又明白了个事儿(北京腔),现在那些看着很有责任感不辱使命完成任务最爱强调自我价值多愁善感勇于直面惨淡人生的人们,怕是心里闷得慌。自欺欺人的事情太多了,创业者们口口声声说要创造美好的世界,电梯里倒经常一股烟味儿(再一次北京腔),这样的生活很COOL吗(好酷哦!)。我曾经在别人卧室里吸完一包也没有让眼前的代码更COOL(好酷哦!),一直以来我都瞧不起自己那段堕落的时光,可笑的是我那时候真的很开心。为什么?

有空去研究过去,不如快些从头再来。

去年的三个新年愿望实现了一个,今年希望有好运。今年的三个愿望更加温柔些,当一次导演,潜规则一个女主角,载着CEO去兜风。

2014 A TOUGH YEAR @鬼骨孖

从离开陋室到加入美位网的三年多时间里

先发个广告,我如果不在自己的blog里打广告,难道让别人来打么。

美位网是一个简单,全面,向任何人开放的高端服务平台。

这不是个非营利性组织,我很庸俗的靠它谋生,它没有打破常规,更没有标新立异,而且用户在美位网只能做一件事情,就是简简单单的享受服务。

从创造美位那一刻起我们就从未想过出售它,我们创造美位,就是为了让其永存。

希望在如今浮躁的社会中这个完整的平台能够早日问世,我需要你们的帮助。不论你是Geek还是文青,是公关还是销售,无论你喝酒用碗还是用盅,不如用实际行动来支持一下我。远在SF的阿杜现在心里估计还在唠叨着我XD最大的优点就是说实话;所以你们的支持当然不是不求回报的。我只想说美位每一个人呕心沥血到现在,并不只是为了便利人们的生活,也并不只是为了提供优质的服务或者华丽的产品,我们希望美位网能给予人们随时随地享受生活的权利。

回到正题。

来美位网大约三个月,自从完成陋室履历停笔到现在也有快600天,依然清楚的记得最后那一刻,大家围坐下时都觉得对方已不纯真,最后所有人都醉倒在地上。我觉得很对不起自己过去的三年,相比本科蜗居在陋室的百页流水账,这三年就用数千字草率了事,浓缩在最后200来天里了。。。

离开Amadeus一晃7个月,每当有人心急找不到工作的时候我都说,我一表人材,也有过4个月的游手好闲。

七月蔚蓝海岸,一个里约的少年,一个巴黎的姑娘,和一个公车上的迟到者。过去几周这三个实习生战功赫赫,出色的令老板忍无可忍,一怒之下拿公款拉我们去腐败,我很给面子才放了半小时的鸽子。他与我可不友好,南部的交通比考拉还懒,我时常是走回家的,他却总喜欢开着敞篷疾驰而过,还不忘打个招呼,看在蓝色阳光的面子上我竖个食指也罢寥。

围坐在摇晃的餐桌边,海水颜色越来越深,脚底已经能感觉到凉爽。背对着戛纳的海岸线,电影节过去一个月后依旧灯火,南部的盛夏似乎还要持续数月,而事实上半年以后初春的那次回访依然让我沐浴了一次美妙的夕阳,那应该是我至今最后一次呼吸夹杂着浓郁阳光的海水。透过晶莹的气泡望去就是安蒂贝斯嘈杂的傍晚,这个天使湾尽头的小镇我一点也不熟悉,只知道其中妓女的分布,Santé! 谈笑间无意说起两个月前海风拂面的科西嘉,心想南法夏天的生活再好不过了。难怪孤僻的巴黎人天天意淫,在山另一边,即便待在公司也是度假,一年一度的 Paris Plage 更是荒唐至极。我其实一度也有这么觉得。每每盛夏本地人都会拖家带小出远门把屋子留给臃肿的北方人,光是房租就可以让一家人过冬了。

安蒂贝斯一路向北就是索非亚山谷,全球最大分销系统Amadeus的大脑。大脑的皮层就是主楼食堂炊烟下的十余间办公室,那才是我南部真正的生活,大数据运筹和线路搜索。地铁,公交,航班,机场,酒店 …… 数不尽的国籍,辩不清的口音,共同的爱好:周四的Salsa,午后的阳光,掺水的咖啡,拿着钱不工作。很难想象外表如此庸懒的公司居然支撑着每秒数以万计的全球事务。却有多少人知道我们曾经在欧洲杯利比里亚德比之夜,人们捧着啤酒狂呼的时,依然在办公室讨论至出不了公司大门。我有时候居然怀疑是不是南法的白天是用来晒太阳晚上是用来工作的。然而连我自己都觉得接下来很长时间都会奉献给这个山谷的时候,居然回巴黎了。

至今都没有想明白为什么三个实习生都不想留下来。如果尼斯是蓝色,巴黎就是灰色的,充斥着颓废和挫败。然而这个毫无生气的城市却让我鼓起勇气去思考未来。时常有人问我如此毫无意义又不安定的工作到底为了什么,我想了想,回忆起日月光华流传了好久的那句自欺欺人的谎言,觉得自己在乎的不过就是一种虚无的自我救赎,因为过去愧对过的人生,一种对外人也许"毫无意义"的accomplishment。于是又想起牛老师的话,有些人是生来改变他人生活的。

正因如此,久而久之,听惯了各种批评,习惯了频繁的自嘲,却从来不容许别人指责自己的价值观。18个月前同又北和楠在巴黎北郊宿醉那晚一致认为大厨必须执着,甚至固执,最好是固执地有些自私。

恰恰这正是美位的核心价值。

细细想下,即使把美位网不断精简,直到干硬如缩水的海绵,她依然维持着自己的品质,最低的可行性同样可以带来收入。美位最本质的价值,就是“美位”两字本身。我没有参与公司的早期组建,却时常回溯曾经的想法。比如在体验美位订餐服务的时候,也许需要劳烦顾客做的唯一一件事就是坐下。似乎她就不打算去拿外界华丽的元素装点自己。从最本质的内在出发,来丰富自我让世人接受。

事实上我曾经也是个火星人,在复旦的四年里尤其是最后两年我的兴趣一直涉猎很广,毕业设计差点没跑到中文系去,但唯独我不喜欢统计,于是有关数据对与日常生活的巨大影响力我也是过去几百天里才真切意识到。虽然为时不晚,回想起来二十出头那时的我就像一个无头苍蝇在密室里乱撞毫无方向。在巴黎混迹一年后到驴牌的十个月更被我看来也许是一生中智商的谷底,但无论如何,除了认识又北和楠以外,这段经历让我在接下来的很长时间里逐渐认识到了自己的弱点,开始试着把自己改造成如问飞一样正直的人(他听了以后一定会很高兴然后继续堕落一年直到下一次嘲讽),不骄不躁,脚踏实地,对待一切事物都能保持不偏不倚的谦逊态度。

这恰恰又是我准备把美位打造成的最终样子。与其说美位是个私人管家,还不如应召女郎更贴切。她着实是个贪食的姑娘,但在过去半年的成长中,从不停息的努力给自己减肥。她不急于使自己臃肿,而是致力于将自身主张的最核心价值,做到完美无瑕。这是美位在如今新兴互联网创业大潮流中得以生存的根本。Try to be lean。我猜MM更喜欢这句话吧。

说到创始人Even,哥大出身蒋氏。很久很久以前,追溯到「肉们里」和我才刚刚认识的年代,我们在哥大最中意的姑娘也姓蒋,直发中分一脸笑容还被我喷过一脸酒。大概是因为姓蒋的人都有宽大的胸怀,容得下我踏足过的任一片绿茵场。其实美位亦如此,高贵却没有门槛,定位于高收入人群却从不拒绝提供服务,哪怕是工作从日落到日出,只是固执得为了遵守一开始定下的诺言。

关于我为什么来这里,Even曾经是个十足的科技黑,与我一样祖籍火星,在她脑中似乎整个世界还处在十六世纪初期,计算器都被当成巫术。直到突然某天,一起吃完饭,慢悠悠的走向熟悉的大红装甲车,还没靠近车门就开了,进去,坐下,突然胸口的灯都开始闪烁,随后眼前一黑。。。回到地球的路上,看到两行字:我希望科技能帮助解决繁琐之事,让我们更自如、更专注地从事自己喜欢之事。

接着我来到了美位。

一直以来我都在想,到底是科技改变了我们,还是我们在改变科技。正如古人云,不需要交互才是最好的交互,不久的将来行业里的技术产品只有两类,大众化的科技,和美位的服务。

在 GoDaddy Deluxe Linux 环境上部署 Django

GoDaddy的Linux环境是支持python的,但是默认版本是2.4.3

-bash-3.2$ python -V
-bash-3.2$ Python 2.4.3

不过,Deluxe版本的服务器是支持2.7的,GoDaddy给出了使用方法两个方案:
http://support.godaddy.com/help/article/7254/can-i-use-python-272-with-my-hosting-account
1). 直接引用python2.7的安装路径:#!/usr/local/bin/python2.7
2). 用virtualenv虚拟python2.7的环境
后者使用起来更加自如些。

所以就先介绍一下虚拟环境的安装。因为GoDaddy直接可以使用virtualenv,这方便了不少。只是不能调用编译器,比如gcc,所以如果安装MySQLdb这些需要编译C++源码的库,就要现在本地编译好,这里不扯开去了,感兴趣的可以搜索Google。

文中虚拟环境安装在 ~/py27venv/
Django 项目放在 ~/html/

1. 安装虚拟环境

创建虚拟环境

-bash-3.2$ cd ~
-bash-3.2$ virtualenv -p /usr/local/bin/python2.7 py27venv

激活后, -bash-3.2$前出现 (py27venv)

-bash-3.2$ source ~/py27venv/bin/activate
(py27venv)-bash-3.2$

这时检查python版本,变成了2.7.3

(py27venv)-bash-3.2$ python -V
python 2.7.3

2. 安装Django

通常 python package 的目录是 ~/py27venv/lib/python2.7/site-packages

(py27venv)-bash-3.2$ cd ~/py27venv/lib/python2.7/site-packages
(py27venv)-bash-3.2$ pip install Django

3. 配置 Django

Django 安装完以后要先在设置下本地化信息, 不然在 syncdb 的时候无法新建 superuser 会报错

最简单的做法就是把以下两行写入 ~/.bash_profile 需要的时候加载

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

然后关闭 python 虚拟环境,执行 syncdb (这个也可以不急着做,总之做之前一定要载入本地化信息)

(py27venv)-bash-3.2$ deactivate
-bash-3.2$ source ~/.bash_profile
-bash-3.2$ cd ~/html
-bash-3.2$ python2.7 manage.py syncdb

4. 使用 fastcgi 运行 Django

接下来使用 flup 来将 Django 部署在 fastcgi 上,这样就不需要通过 Django 来运行服务器了。
详细手册参阅 https://docs.djangoproject.com/en/1.4/howto/deployment/fastcgi

-bash-3.2$ source ~/py27venv/bin/activate
(py27venv)-bash-3.2$
(py27venv)-bash-3.2$ wget 'http://pypi.python.org/packages/source/f/flup/flup-1.0.2.tar.gz#md5=24dad7edc5ada31dddd49456ee8d5254'
(py27venv)-bash-3.2$ tar -xvzf flup-1.0.2.tar.gz
(py27venv)-bash-3.2$ mv flup-1.0.2/flup/ .
(py27venv)-bash-3.2$ rm flup-1.0.2.tar.gz
(py27venv)-bash-3.2$ rm flup-1.0.2/ -r
(py27venv)-bash-3.2$ deactivate

5. 配置 Django 运行环境

在 ~/html 目录下, 建立 fastcgi 运行脚本 dispatch.py 并写入如下代码:

#!/usr/local/bin/python2.7
''' This is a comment, If you see this, CGI is not working '''
import sys, os
sys.path += ['{absloute home path}/py27venv/lib/python2.7/site-packages']
sys.path += ['{absloute home path}/html/questhunter/']
os.environ['DJANGO_SETTINGS_MODULE'] = 'questhunter.settings'
from flup.server.fcgi import WSGIServer
from django.core.handlers.wsgi import WSGIHandler
WSGIServer(WSGIHandler()).run()

记住用unix模式存储,并且赋予执行权限,比如 755
{absloute home path} 是你用户根目录在服务器上的绝对路径,比如我的是 /home/content/98/10206198/
代码中都要使用绝对路径,因为 python 运行时环境和 bash 是不一样的

修改 Django 的 manage.py 文件,指定 Django 的位置

sys.path += ['{absloute home path}/py27venv/lib/python2.7/site-packages']

6. 最后,配置 Apache

新建 ~/html/.htaccess 并写入:

AddHandler fcgi-script .fcgi
AddHandler cgi-script cgi
Options ExecCGI
Options +FollowSymLinks
RewriteEngine On
RewriteBase /questhunter
# folders with php & static content
RewriteRule ^(stats/.*)$ - [L]
RewriteRule ^(blog/.*)$ - [L]
RewriteRule ^(favicon.ico)$ - [L]
RewriteRule ^(favicon.gif)$ - [L]
# everything else sent to django
RewriteRule ^(dispatch\.py/.*)$ - [L]
RewriteRule ^(.*)$ dispatch.py/$1 [L]

完毕。