盒子
导航
文章目录
  1. 一、安装配置 Nginx
    1. 1、下载
    2. 2、附加模块
    3. 3、编译安装Nginx
    4. 4、测试Nginx服务器
    5. 5、配置Nginx
    6. 6、生成证书
  2. 二、安装uWSGI服务器
  3. 三、使用Django创建项目
    1. 1、对 APP 进行配置
    2. 2、使用内置服务器测试
    3. 3、部署 Django 项目:

使用Nginx/uWSGI部署Django项目

在做一个OvpnSpider的iOS客户端程序,该程序依托于日本筑波大学的VPN中继服务项目提供的API。VPNGate是一个分布式的VPN服务器实验项目,它本身并不提供VPN服务器,而是由全球各地自愿者将自己的电脑自愿提供出来充当VPN服务器,它的官方网站为 www.vpngate.net,不过很不幸,已经被墙了。我所要做的OvpnSpider就是依托VPNGate提供的API获取一个连接这些分布式VPN服务器的OpenVPN配置文件列表,将这些列表经过测试筛选排序然后供OvpnSpider的iOS客户端使用。

为了快速开发,服务器端采用 Nginx + uWSGI + Python(Django)来搭建,因为期间遇到了些问题,这里记录下环境搭建的过程,以备日后可以参考。开发环境:Mac Pro。

一、安装配置 Nginx

1、下载

官方 Nginx-1.9.5 版本。安装文档:Installation Doc

2、附加模块

因为iOS现在全部要求与服务器端的链接采用https,所以在搭建Nginx的时候要开启对SSL的支持。根据上面安装文档的提示,下载Pcre-8.37Zlib-1.2.8以及OpenSSL-1.0.2d。对于Pcre和Zlib采用三步曲安装即可,我采用默认安装路径(/usr/local):

./configure
make
sudo make install

对于OpenSSL需要指定64位编译:

./config darwin64-x86_64-cc
make
sudo make install

然后就可以进行下一步,即编译安装Nginx。

3、编译安装Nginx

将nginx-1.9.5.tar.gz、openssl-1.0.2d.tar.gz、pcre-8.37.tar.gz和zlib-1.2.8.tar.gz放入同一个目录下,然后全部在当前目录解压。进入nginx-1.9.5目录,使用命令来配置:

./configure –sbin-path=/usr/local/nginx/nginx –conf-path=/usr/local/nginx/nginx.conf –pid-path=/usr/local/nginx/nginx.pid –with-http_ssl_module –with-pcre=../pcre-8.37 –with-zlib=../zlib-1.2.8

在这里遇到不少问题,首先是开启SSL需要编译时指定--with-http_ssl_module,但是即便前面已经编译安装了OpenSSL,它也依旧提示找不到OpenSSL:

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using –with-openssl= option.

没办法,只能像zlib一样指定OpenSSL,使用命令:

./configure –sbin-path=/usr/local/nginx/nginx –conf-path=/usr/local/nginx/nginx.conf –pid-path=/usr/local/nginx/nginx.pid –with-http_ssl_module –with-openssl=../openssl-1.0.2d –with-pcre=../pcre-8.37 –with-zlib=../zlib-1.2.8

好了,./configure没有出现警告,继续make,然后中途出现一个警告,是在configure OpenSSL的时候出现的:

WARNING! If you wish to build 64-bit library, then you have to
invoke ‘./Configure darwin64-x86_64-cc’ manually.
You have about 5 seconds to press Ctrl-C to abort.

这是由于我的系统是64位的。如果忽略警告继续,最后将出现错误:

ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: [objs/nginx] Error 1
make:
[build] Error 2

没办法,只能想办法让它以darwin64-x86_64-cc替代darwin-i386-cc来编译OpenSSL,怎么办?到openssl-1.0.2d下修改config文件,打开该文件,通过查找发现上面的警告消息出现在557行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//这一行是554行
ISA64=`(sysctl -n hw.optional.x86_64) 2>/dev/null`
if [ "$ISA64" = "1" -a -z "$KERNEL_BITS" ]; then
echo "WARNING! If you wish to build 64-bit library, then you have to"
echo " invoke './Configure darwin64-x86_64-cc' *manually*."
if [ "$TEST" = "false" -a -t 1 ]; then
echo " You have about 5 seconds to press Ctrl-C to abort."
(trap "stty `stty -g`" 2 0; stty -icanon min 0 time 50; read waste) <&1
fi
fi
if [ "$ISA64" = "1" -a "$KERNEL_BITS" = "64" ]; then
OUT="darwin64-x86_64-cc"
else
OUT="darwin-i386-cc"
fi ;;

继续往下10行就能发现我们可以将OUT="darwin-i386-cc"换为OUT="darwin64-x86_64-cc",这样就可以忽略警告,又能默认以darwin64-x86_64-cc进行编译了。好,就这么干,改完之后再次运行:

./configure –sbin-path=/usr/local/nginx/nginx –conf-path=/usr/local/nginx/nginx.conf –pid-path=/usr/local/nginx/nginx.pid –with-http_ssl_module –with-openssl=../openssl-1.0.2d –with-pcre=../pcre-8.37 –with-zlib=../zlib-1.2.8

没问题,继续make,忽略警告让它继续,然后发现出现了错误:

cd ../openssl-1.0.2d \
&& if [ -f Makefile ]; then /Applications/Xcode.app/Contents/Developer/usr/bin/make clean; fi \
&& ./config –prefix=/Users/Fury/Downloads/nginx-1.9.5/../openssl-1.0.2d/.openssl no-shared \
&& /Applications/Xcode.app/Contents/Developer/usr/bin/make \
&& /Applications/Xcode.app/Contents/Developer/usr/bin/make install LIBDIR=lib
Makefile is older than Makefile.org, Configure or config.
Reconfigure the source tree (via ‘./config’ or ‘perl Configure’), please.
make[2]: [Makefile] Error 1
make[1]:
[../openssl-1.0.2d/.openssl/include/openssl/ssl.h] Error 2
make: *** [build] Error 2

很明显是因为我改动了config文件,导致Makefile与它原有的不一致了,怎么办呢?嗯,进入openssl-1.0.2d目录来手动执行一下./config来生成Makefile:

cd ../openssl-1.0.2d
./config

好了,回到nginx-1.9.5目录继续执行make:

cd ../nginx-1.9.5
make

这次正确无误,执行install来安装即可:

sudo make install

4、测试Nginx服务器

启动Nginx,下面列出的是几个常用操作:

sudo nginx //启动
sudo nginx -s reload //重新加载配置文件
//关闭的话直接 ps aux|grep nginx 来 kill 掉进程即可

然后打开localhost能看到页面内容如下则说明安装成功:

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

5、配置Nginx

此处和第6节已搬到文章生成自签名的SSL证书用于https链接中。

6、生成证书

这一节参考了文档Nginx配置SSL证书部署HTTPS网站

二、安装uWSGI服务器

uWSGI的官方文档地址在这里,在Nginx下配置uWSGI来部署Django的文档在这里,我没有从源码编译安装,而是使用pip安装的:

sudo -H pip install uwsgi

在Django项目的根路径下新建一个web.ini配置文件,用它来支持uWSGI的启动:

1
2
3
4
5
6
7
8
[uwsgi]
chdir=/Users/Fury/sharework/MyGitRepos/AutoVPN/Server/fvpnd
module=fvpnd.wsgi:application
master=True
vacuum=True
socket=127.0.0.1:53020
pidfile=/tmp/fvpnd-master.pid
daemonize=/tmp/fvpnd-uwsgi.log

然后可以通过下面的命令来使用uWSGI运行这个Django项目:

$ pwd
$ /Users/Fury/sharework/MyGitRepos/AutoVPN/Server/fvpnd
$ uwsgi –ini web.ini
[uWSGI] getting INI configuration from web.ini

三、使用Django创建项目

Django是一个Python框架,简单强大易使用。可到 Django 官网下载安装稳定版。我这里使用了 pip 进行安装:

sudo -H pip install django

使用 Django 创建项目:

django-admin startproject fvpnd

使用 Django 创建APP:

python manage.py startapp api

1、对 APP 进行配置

修改 fvpnd/settings.py,加入新建的APP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
INSTALLED_APPS = (
# 'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'api',
)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'fvpndb',
#'USER': 'fvpnapp',
#'PASSWORD': '123456',
'USER': 'fvpndba',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}

修改 fvpnd/urls.py:将原内容替换(删除了admin,加入APP)

1
2
3
4
5
6
from api import urls as api_urls
from django.conf.urls import include, url

urlpatterns = [
url(r'^api/', include(api_urls)),
]

在 api/ 下新建urls.py:

1
2
3
4
5
6
from api import views
from django.conf.urls import include, url

urlpatterns = [
url(r'^$', views.api),
]

修改 api/views.py的内容为:

1
2
3
4
5
6
#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse

def api(request):
return HttpResponse(u"Just a test!")

这样通过访问https://localhost/api/就可以定位到这个api函数,将其作为入口。

2、使用内置服务器测试

Django 内置了一个轻量级的http服务器,通过命令来运行(migrate是与数据库相关的,第一次时运行即可):

$ python manage.py migrate
$ python manage.py runserver

默认将启动在 http://127.0.0.1:8000 。由于修改了默认的数据库,使用了MySQL,可能会报错提示找不到 MySQLdb,需要先安装两个组件:

$ brew install mysql-connector-c
$ sudo -H pip install mysql-pyth

Django会对数据库进行测试(通过创建表的方式),所以数据库用户需要有创建权限(后面再改回去就好)。

3、部署 Django 项目:

关闭项目的settings.py下的debug选项,在项目目录下(与manage.py同一个目录,fvpnd/)创建web.ini配置文件(与上面uWSGI部分的是一样的),内容为:

1
2
3
4
5
6
7
8
[uwsgi]
chdir=/Users/Fury/sharework/MyGitRepos/AutoVPN/Server/fvpnd
module=fvpnd.wsgi:application
master=True
vacuum=True
socket=127.0.0.1:53020
pidfile=/tmp/fvpnd-master.pid
daemonize=/tmp/fvpnd-uwsgi.log

使用命令启动项目:

$ uwsgi –ini web.ini

具体配置可有官方文档参考。