Python Bottle+virtualenv+uWSGI+Nginx installation on Ubuntu 12.04.1 LTS

bottle+uwsgi+nginx

为了造福世界人民,我觉得还是用英语写吧 XD

Today I got a request to write a backend server to provide interface access from frontend. I determined to use Python and  RESTful api firstly . I hate writing Java code…

After some investigation, I picked up Bottle. It is very neat and small. And I also read that with nginx and uWSGI, the performance is good too.

My environment is Ubuntu 12.04.1 LTS; but after followed several posts, my environment still did not work. I want to share my findings to save others’ time:)

Let’s cut to the chase:

  • Note:

My application would be in below directory constructure, all following commands and configurations are based on below:
/var/www/myapp would be the root directory of my bottle app
/var/www/myapp/env would be the virtualenv for the app
/var/www/myapp/index.py would be main .py file of bottle

  • Install nginx and uwsgi:
sudo apt-get update
sudo apt-get install -y nginx uwsgi
sudo apt-get install uwsgi-plugin-python
  • Install pip to help install python modules
sudo apt-get install python-pip
  • Install virtualenv: virtualenv to seperate the Python environment for different deployments
sudo pip install virtualenv
  • Set up app virtualenv:
sudo mkdir -p /var/www/myapp
sudo virtualenv /var/www/myapp/env
source /var/www/myapp/env/bin/activate
pip install bottle
deactivate
  • Change the permission of the app directory so that uWSGI can read it and Python can write in it
sudo chown -R www-data:www-data /var/www/myapp
  • OK, the most important part: the configuration of nginx and uWSGI. These two recipes would worth some money XD

1. nginx config:

sudo gedit /etc/nginx/sites-enabled/default

copy below config in opend file:

server {

     listen   80;
     charset utf-8;
     root /var/www/myapp;
     server_name localhost;

location / {
     include uwsgi_params;
     uwsgi_pass unix:/tmp/uwsgi.myapp.socket;
     uwsgi_param UWSGI_PYHOME /var/www/myapp/env;
     uwsgi_param UWSGI_CHIDIR /var/www/myapp;
     uwsgi_param UWSGI_SCRIPT index; # this should be the .py file name without suffix that your bottle will use to launch
     }
}

2.uWSGI config:

sudo gedit /etc/uwsgi/apps-enabled/uwsgi.ini

copy below config in opend file:

[uwsgi]
plugins=python
socket=/tmp/uwsgi.myapp.socket
pythonpath=/var/www/myapp
  • Now we are one step to success. In order to verify the setup, we need a sample index.py file ( the file name must be consistent with the one in UWSGI_SCRIPT in nginx config).

Put index.py under /var/www/myapp

#!/usr/bin/env python
from bottle import route, run, default_app
@route('/')
def index():
    return "Aloha, world~"

if __name__ == "__main__":
    run(host="localhost", port=8081)
else:
    application = default_app()
  • Finally, Restart/start nginx and uWSGI services:
sudo service nginx restart
sudo service uwsgi restart

Now “it’s the moment to witness the miracle!” 😀  Access http://localhost/ in your browser, you should  see “Aloha, world~”.  If not, comment below:)

Advertisements

Grub2 与Ubuntu的那些事

Windows7与Ubuntu双启动的那些事 姊妹篇

之前那篇讲到我升级到Ubuntu 10.10,然后杯具的从Windows的启动菜单进不去了,出现grub rescue黑洞洞冷冰冰的界面:

error: the symbol ‘grub_xputs’ not found
grub rescue>

为了把Ubuntu救活,找了n多办法,还差点把Win7搞丢了。后来有些后怕就没动Ubuntu了,期间也尝试过几次,都未果。终于昨天心血来潮,好好研究了一番,终于在今天发现了问题的关键所在。而且最让人吐血的是最后找到的原因不是自己苦苦尝试的。。。好了,废话少说,听我慢慢道来。

先说下我的问题的根源,想看grub恢复方法的在后面有详细的介绍:

当我尝试过所有Ubuntu修复grub的方法后,还是提示grub_xputs。无奈在Ubuntu中文论坛发帖。然后继续找资料。刚好看到有人提到EasyBCD里面有个grub2模式。我记得我之前是的EasyBCD只有grub模式。然后发现EasyBCD确实多了个grub2选项,看来是2.0之后添加的。遂删除之前的条目,重新添加了grub2的条目,保存后重启,从启动项里面进入,grub列表终于出现了!这个跨年的问题终于解决,哈哈哈

Ubuntu出现grub rescue画面后最方便的解决方法就是使用对应的Live CD来处理。用U盘就能做 (省光盘就是低碳环保嘛),工具有好几个都不错:

  • Universal-USB-Installer:这个是官方推荐的工具:官方下载地址下面选USB,然后点右边的Show me how就可以看到下载了
  • unetbootin-windows:这个和上面那个差不多,不过会在启动后出现一个定制的菜单,更方便一些
  • LinuxLive USB Creator:图形化的工具,支持中文,可以安装作者定制的VirtualBox从Windows启动。适合新手。我用这个就10.04成功了,之后再没成功过。。而且那个VB虚拟机总出错。

从Live系统进入之后就可以对原有系统的grub重新安装了,Ubuntu forum里面有一篇非常棒的HOWTO介绍怎么操作的:HOWTO: Purge and Reinstall Grub 2 from the Live CD。还是啰嗦下:

我的ubuntu的 / 分区是sda7,/boot分区是 sda6,用livecd启动,在终端下(Application>Accessories>Terminal)输入

#切换到root权限
sudo –i
#挂载根目录 /
mount /dev/sda7 /mnt
#如果没 /boot 单独分区下面这步跳过
mount /dev/sda6 /mnt/boot
#从Live系统复制grub安装到被挂载的系统
grub-install --force --root-directory=/mnt /dev/sda6

注意:我因为要把grub安装到分区里面而不是MBR里面(就是grub-install那个命令的最后的参数是/dev/sda6,而不是/dev/sda或者/dev/sdb等),需使用了–force命令。不使用–force会提示如下信息

/usr/sbin/grub-setup: warn: Attempting to install GRUB to a partition instead of the MBR. This is a BAD idea..
/usr/sbin/grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and its use is discouraged..
/usr/sbin/grub-setup: error: if you really want blocklists, use –force.

使用–force之后也会出,但是会有

Installation finished. No error reported

表示安装成功了。

如果你系统的grub.cfg文件损坏了或者不见了,那么还需要从Live系统进入到你出问题的系统你们更新一下这个文件。这时候要用到chroot

#下面的for循环是挂载你目标系统的各种必备设备
for i in /dev /dev/pts /proc /sys; do sudo mount -B $i /mnt$i; done
#然后就是进入挂载后的系统里面,也就是你出问题那个系统里面
chroot /mnt
#执行grub更新命令
grub-update
#成功后卸载挂载过的设备,如果没有单独的/boot分区就删除下面的/boot
for i in /dev/pts /dev /proc /sys /boot /; do sudo umount /mnt$i ; done

到此你的Ubuntu的grub就修复好了。那些个用grub rescue的命令的纯粹是找难受,虽然这方法我也用过。。太容易晕,也容易敲错;错了有可能很崩溃。。。

所以碰到rescue问题最好还是Live系统解决。主要是你需要了解linux分区的规则:再奉上一片关于分区的讲解,非常棒:Partitioning basics

Windows7与Ubuntu双启动的那些事

在经历了2次Ubuntu安装(10.04安装以及10.10升级)时WIN7进不去的事情后,我终于可以很淡定的表示,我不怕这些个启动问题了!

建议大家不要用grub写人MBR,用WIN7启动然后再进Ubuntu最保险!

这就需要你在安装Ubuntu分完区之后,设置好账号,出现的“准备开始安装”界面,不要直接点安装! 点击“高级”,选择/目录写入,不要选默认第一个的那个整个硬盘的选项。这样你的WIN7引导就不会被损坏。

话说我这次10.10升级后Ubuntu进不去了,提示 grub_xputs标识未找到。然后在grub_rescure下尝试未果后,然后只好用LinuxLive USBCreator做了个Ubuntu的LiveUSB,参考Ubuntu中文论坛的方法

然后问题就来了,出在grub-install root-directory的地方,我也依葫芦画瓢写了/dev/sda,这样就是悲剧的根源!因为这个命令是直接写到了/dev/sda的MBR中。重启后电脑黑屏了,没找到能启动的系统,连windows都进不去了- –

解决WIN7启动的那些事:WIN7 MBR和BCD文件修复

1. 因为之前对WIN7启动不太了解,这次总算清楚了:电脑开机后会先检查MBR,MBR然后会找到WIN7的隐藏的那个100M分区中的bootmgr;bootmgr会找同分区中的BCD文件启动系统启动菜单引导启动WIN7安装目录里面的winload.exe

2. 因为我有3张安装盘,在那里面转晕了,各种不好使。用系统自带的修复启动都不行。期间还试过bcdsect /nt60 SYS,都不行。这么折腾后我的BCD文件也被修改过了,查看100M那个系统保留分区里面的BCD文件的时间就知道了。

还好我用EASYBCD备份过BCD文件,那个和系统的是一样的,直接改名BCD直接覆盖就行。进入隐藏分区方法很多,比如WIN7 PE或者Linux LiveUSB,找到那个100M的分区,里面有BOOT目录和bootmgr文件。BOOT文件夹里面就有BCD文件。

3.然后启动电脑,还是不能进入WIN7。看来得恢复MBR。但是WIN7自带修复提示“windows无法自动修复此计算机。如果您最近将一个设备,如照相机或便携式音乐播放机,插入计算机,请将其拔出,然后重启,可我并没设备在计算机里”

4. 终于找到如何修复WIN7 mbr的方式。 请必须使用与你对应的WIN7版本的原版安装盘(主要保证X64/X32系统用X64/X32盘修复)启动。选择左下角的“修复计算机”->“启动命令提示符”->输入bootrec /FixMbr 回车。没有错误提示现在就可以重启电脑进入WIN7了。bootrec的使用见官方知识库 FixMbr修复MBR,FixBoot是修复BCD文件以及bootmgr,最好是自己平时用EasyBCD备份好,自己恢复,不然会有其他副作用。

成功后实在太高兴了~~~~狂吼了好几声,哈哈!

Ubuntu的问题到时候再说了,不想折腾了。从昨天晚上折腾到今天,还搭上WIN7。。。累了。。。