try:
    with transcation.atomic():
        # 抛出异常,触发事务回滚
        if x != '':
            raise IntegrityError
except IntegrityError:
    handle_exception()

异常必须是DatabaseError或者DatabaseError的子类(比如:IntegrityError)才能够触发回滚。

Django后端支持CORS

django-cors-headers

  • 安装
pip install django-cors-headers

添加django-cors-headersinstalled_apps

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

添加到Django配置文件中的MIDDLEWARE_CLASS元组中


MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
)
  • 配置

添加允许跨域请求的地址,例如

Example:
    CORS_ORIGIN_WHITELIST = (
        'example.com'
    )

Default:
    CORS_ORIGIN_WHITELIST = ()

参考资料

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
http://www.ruanyifeng.com/blog/2016/04/cors.html
https://github.com/ottoyiu/django-cors-headers

Install Nginx


添加ppa

sudo -s
nginx=stable # use nginx=development for latest development version
add-apt-repository ppa:nginx/$nginx
apt-get update
apt-get install nginx

运行add-apt-repository ppa:nginx/$nginx时,如果提示:

The program 'add-apt-repository' is currently not installed. You can install it by typing:
apt-get install software-properties-common

根据提示,安装software-properties-common

apt-get install software-properties-common

为Ubuntu和Debian安装最新版本的nodejs


运行Ghost必须安装Node.js。但是Ubuntu或Debian的软件仓库中的Node.js版本更新比较慢,这里我们选择安装最新版的Node.js。

支持Ubuntu版本

  • Ubuntu 12.04 LTS(Precise Pangolin)
  • Ubuntu 14.04 LTS (Trusty Tahr)
  • Ubuntu 15.04 (Vivid Vervet)

支持的Debian版本

  • Debian 7 (wheezy)
  • Debian 8 / stable (jessie)
  • Debian testing (stretch, aliased to jessie)
  • Debian unstable (sid)

安装步骤

Ghost目前支持0.10.*0.12.*>=4.2 <=5.* (LTS)版本的Node.js,推荐使用>0.10.40(latest),详细说明参考:http://support.ghost.org/supported-node-versions
我们选择安装Node.js v4.x,执行下面的命令:

curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
sudo apt-get install -y nodejs

注意:Ghost不支持Node.js v5.x

在Ubuntu上安装并运行Ghost


ssh登陆到远程服务器

  • 运行一下命令下载最新版本的Ghost
curl -L https://ghost.org/zip/ghost-latest.zip -o ghost.zip
  • 使用以下命令解压
unzip -uo ghost.zip -d ghost
  • 切换到解压的ghost目录下
cd /你的ghost解压目录
  • 输入以下命令安装Ghost
cp config.example.js config.js
npm install --production
  • 在npm安装结束后,输入以下命令让Ghost以开发模式启动
npm start
  • Ghost将会运行在127.0.0.1:2368

可以在config.js中修改IP地址和端口

  • 在浏览器中,访问127.0.0.1:2368即可查看最新搭建的Ghost博客
  • 访问127.0.0.1:2368/ghost并设置管理员账号并登录Ghost

部署Ghost


前面提到的启动 Ghost 使用npm start 命令。这是一个在开发模式下启动和测试的不错的选择,但是通过这种命令行启动的方式有个缺点,即当你关闭终端窗口或者从 SSH 断开连接时,Ghost 就停止了。为了防止 Ghost 停止工作,选择supervisor保持Ghost运行。

Supervisor

流行的 Linux 发行版——例如 Fedora, Debian 和 Ubuntu,都包含一个 Supervisor 包:一个进程控制系统,允许在启动的时候无需初始化脚本就能运行 Ghost。不像初始化脚本一样,Supervisor 可以移植到不同的发行版和版本。

  • 安装supervisor
sudo apt-get install supervisor
  • 启动supervisor服务
service supervisor start
  • Ghost创建启动脚本,通常为/etc/supervisor/conf.d/ghost.conf,例如:
[program:ghost]
command = node /path/to/ghost/index.js
directory: /path/to/ghost
user = user
autostart = true
autorestart = true
stdout_logfile = /var/log/supervisor/ghost.log
stderr_logfile = /var/log/supervisor/ghost_err.log
environment = NODE_ENV="production"
  • 使用Supervisor启动Ghost
sudo supervisorctl start ghost
  • 停止Ghost
sudo supervisorctl stop ghost

配置域名


配置站点

  • /etc/nginx/site-available/目录下创建ghost文件
  • 编辑ghost文件(例如:sudo vim /etc/nginx/site-available/ghost),内容如下:
server {
    listen 80;
    server_name example.com;
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass         http://127.0.0.1:2368;
    }
}
  • ghost文件软连接到/etc/nginx/site-enabled/目录下
sudo ln -s /etc/nginx/site-avaliable/ghost /etc/nginx/site-enabled/ghost
  • 重启nginx
sudo service nginx restart

参考资料

https://www.nginx.com/resources/wiki/start/topics/tutorials/install
https://nodejs.org/en/download/package-manager
http://www.ghostchina.com/install-nodejs-of-latest-version-in-ubuntu-and-debian

Nginx的负载均衡模块目前支持如下调度算法:

  • round-robin

Nginx默认的轮询算法,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,故障系统将被自动剔除,使用户访问不受影响。可以通过weight指定轮询权值,weight值越大,该服务器被访问的概率越高,这主要用户后端每个服务器性能不均的情况。

  • least_connected

请求会被发送到活跃连接数最少的服务器上。配置例子如下:

upstream backend {
    least_conn; # 默认的轮询算法不需要指定,如果选择其他算法需要指定算法类型
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
}
  • ip_hash

按访问IP的哈希结果分配请求。也就是说,来自同一个IP的用户会固定访问一个后端服务器。

upstream backend {
    ip_hash;
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
}