在做一个OvpnSpider的iOS客户端程序,该程序依托于日本筑波大学的VPN中继服务项目提供的API。VPNGate是一个分布式的VPN服务器实验项目,它本身并不提供VPN服务器,而是由全球各地自愿者将自己的电脑自愿提供出来充当VPN服务器。我要做的OvpnSpider就是依托VPNGate提供的API获取一个连接这些分布式VPN服务器的OpenVPN配置文件列表,将这些列表经过测试筛选排序然后供OvpnSpider的iOS客户端使用。
为了快速开发,服务器端采用 Nginx + uWSGI + Python(Django)来搭建,这里记录下环境搭建的过程。开发环境:Mac Pro。
安装配置 Nginx
下载
官方 Nginx-1.9.5 版本。安装文档:Installation Doc
附加模块
因为iOS现在全部要求与服务器端的链接采用https,所以在搭建Nginx的时候要开启对SSL的支持。根据上面安装文档的提示,下载Pcre-8.37、Zlib-1.2.8以及OpenSSL-1.0.2d。对于Pcre和Zlib采用三步曲安装即可,我采用默认安装路径(/usr/local):
1 | $ ./configure |
对于OpenSSL需要指定64位编译:
1 | $ ./config darwin64-x86_64-cc |
然后就可以进行下一步,即编译安装Nginx。
编译安装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目录,使用命令来配置:
1 | $ ./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:
1 | $ ./configure: error: SSL modules require the OpenSSL library. |
没办法,只能像zlib一样指定OpenSSL,使用命令:
1 | $ ./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的时候出现的:
1 | 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位的。如果忽略警告继续,最后将出现错误:
1 | ld: symbol(s) not found for architecture x86_64 |
没办法,只能想办法让它以darwin64-x86_64-cc
替代darwin-i386-cc
来编译OpenSSL,怎么办?到openssl-1.0.2d下修改config
文件,打开该文件,通过查找发现上面的警告消息出现在557行:
1 | //这一行是554行 |
继续往下10行就能发现我们可以将OUT="darwin-i386-cc"
换为OUT="darwin64-x86_64-cc"
,这样就可以忽略警告,又能默认以darwin64-x86_64-cc
进行编译了。好,就这么干,改完之后再次运行:
1 | $ ./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
,忽略警告让它继续,然后发现出现了错误:
1 | $ cd ../openssl-1.0.2d \ |
很明显是因为我改动了config文件,导致Makefile与它原有的不一致了,怎么办呢?嗯,进入openssl-1.0.2d目录来手动执行一下./config
来生成Makefile:
1 | $ cd ../openssl-1.0.2d |
好了,回到nginx-1.9.5目录继续执行make:
1 | $ cd ../nginx-1.9.5 |
这次正确无误,执行install来安装即可:
1 | $ sudo make install |
测试Nginx服务器
启动Nginx,下面列出的是几个常用操作:
1 | $ sudo nginx # 启动 |
然后打开localhost能看到页面内容如下则说明安装成功:
1 | Welcome to nginx! |
配置Nginx
此处和第6节已搬到文章基于openssl颁发自签名SSL证书中。
生成证书
这一节参考了文档Nginx配置SSL证书部署HTTPS网站
安装uWSGI服务器
uWSGI的官方文档地址在这里,在Nginx下配置uWSGI来部署Django的文档在这里,我没有从源码编译安装,而是使用pip安装的:
1 | $ sudo -H pip install uwsgi |
在Django项目的根路径下新建一个web.ini配置文件,用它来支持uWSGI的启动:
1 | [uwsgi] |
然后可以通过下面的命令来使用uWSGI运行这个Django项目:
1 | $ pwd |
使用Django创建项目
Django是一个Python框架,简单强大易使用。可到 Django 官网下载安装稳定版。我这里使用了 pip 进行安装:
1 | $ sudo -H pip install django |
使用 Django 创建项目:
1 | $ django-admin startproject fvpnd |
使用 Django 创建APP:
1 | $ python manage.py startapp api |
对 APP 进行配置
修改 fvpnd/settings.py,加入新建的APP:
1 | INSTALLED_APPS = ( |
修改 fvpnd/urls.py:将原内容替换(删除了admin,加入APP)
1 | from api import urls as api_urls |
在 api/ 下新建urls.py:
1 | from api import views |
修改 api/views.py的内容为:
1 | #coding:utf-8 |
这样通过访问https://localhost/api/就可以定位到这个api函数,将其作为入口。
使用内置服务器测试
Django 内置了一个轻量级的http服务器,通过命令来运行(migrate是与数据库相关的,第一次时运行即可):
1 | $ python manage.py migrate |
默认将启动在 http://127.0.0.1:8000 。由于修改了默认的数据库,使用了MySQL,可能会报错提示找不到 MySQLdb,需要先安装两个组件:
1 | $ brew install mysql-connector-c |
Django会对数据库进行测试(通过创建表的方式),所以数据库用户需要有创建权限(后面再改回去就好)。
部署 Django 项目:
关闭项目的settings.py下的debug选项,在项目目录下(与manage.py同一个目录,fvpnd/)创建web.ini配置文件(与上面uWSGI部分的是一样的),内容为:
1 | [uwsgi] |
使用命令启动项目:
1 | $ uwsgi --ini web.ini |
具体配置可有官方文档参考。