您的位置:首页 > 理论基础 > 计算机网络

搭建基于https和Parse的后端服务

2017-11-05 00:53 281 查看

搭建基于https和Parse的后端服务

1. 概述

本例搭建基于https和Parse的后端服务,可以提供给客户端APP,微信小程序等使用。

Parse是一个开源的BaaS(Backend as a Service)组件,它提供了包括存储在内的各种后端能力,可以快速的搭建一个比较通用的后端服务,使单纯的前端开发者也能独立的完成一个应用的开发。

本例所使用的软硬件包含如下:

1. 阿里云ECS云服务器

2. 域名(需备案)

3. SSL证书

4. nginx

5. Parse

下面,我就详细的介绍一下完整的搭建过程。

2. 阿里云ECS和域名

本例搭建的服务构建在阿里云的ECS服务器之上,所以需要首先购买一台ECS云服务器,同时会得到一个公网的IP。

由于微信小程序的后端必须是一个基于https的已备案的域名,所以还需要申请一个域名,域名备案的流程也可以在阿里云上完成,备案需要省通信管理局审核,一般的周期是10-20天。

假设申请的域名是:example.com

本例使用二级域名 api.example.com,同时将该域名解析到ECS的公网IP上:



3. 申请SSL证书

SSL证书是用来提供https服务的,阿里云提供免费的证书申请服务:



申请证书只需要验证域名的所有权即可,每个二级域名都需要单独申请证书,域名验证通过以后系统会自动颁发证书,顺利的话全程在10分钟左右即可完成,申请到的证书如下:



下载证书文件,解压以后,会得到2个文件:



其中.key格式的文件就是私钥文件,而.pem格式的文件就是证书文件。这2个文件在后面的过程中会使用到。

4. 安装nginx和配置https服务

在CentOS 7上安装nginx的教程可以参考我的另一篇博文CentOS 7 安装nginx,这里不再详述。

进入nginx的安装目录 /etc/nginx 看一下:

[root@VM_56_156_centos nginx]# pwd
/etc/nginx
[root@VM_56_156_centos nginx]# ls -l
total 40
drwxr-xr-x   2 root root 4096 Nov  5 00:02 conf.d
-rw-r--r--   1 root root 1007 Oct 17 21:25 fastcgi_params
-rw-r--r--   1 root root 2837 Oct 17 21:25 koi-utf
-rw-r--r--   1 root root 2223 Oct 17 21:25 koi-win
-rw-r--r--   1 root root 3957 Oct 17 21:25 mime.types
lrwxrwxrwx   1 root root   29 Nov  4 22:45 modules -> ../../usr/lib64/nginx/modules
-rw-r--r--   1 root root  643 Oct 17 21:21 nginx.conf
-rw-r--r--   1 root root  636 Oct 17 21:25 scgi_params
-rw-r--r--   1 root root  664 Oct 17 21:25 uwsgi_params
-rw-r--r--   1 root root 3610 Oct 17 21:25 win-utf


我们在该目录下创建一个文件夹,取名叫cert,然后把前面下载的2个文件上传至该目录下:

[root@VM_56_156_centos cert]# pwd
/etc/nginx/cert
[root@VM_56_156_centos cert]# ls -l
total 8
-rw-r--r-- 1 root root 1675 Nov  4 23:12 312431314412324.key
-rw-r--r-- 1 root root 3888 Nov  4 23:12 312431314412324.pem


nginx.conf 就是nginx总的配置文件,内容如下:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
worker_connections  1024;
}

http {
include       /etc/nginx/mime.types;
default_type  application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

sendfile        on;
#tcp_nopush     on;

keepalive_timeout  65;

#gzip  on;

include /etc/nginx/conf.d/*.conf;
}


从最后一行可以看出,该配置文件又包含了conf.d目录下的所有配置文件,所以我们的配置主要在该目录下。

在conf.d目录下创建一个https.conf的文件,写入以下内容:

server {
listen 443;
server_name api.example.com;
ssl on;
ssl_certificate  cert/312431314412324.pem;
ssl_certificate_key cert/312431314412324.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root   /usr/share/nginx/html;
index  index.html index.htm;
}
}


这个配置文件使得nginx监听所有443端口的请求,即配置了https的服务,通过如下命令启动nginx服务器:

[root@VM_56_156_centos nginx]# service nginx start
Starting nginx:                                            [  OK  ]


通过浏览器访问 https://api.example.com (需替换成您自己的域名)就已经可以访问到nginx的默认首页了:



可以看到地址栏中已经是https的协议。

为了保证用户在没有输入https的情况下也能正确访问,还需要配置nginx对http协议80端口的请求转发到https协议443端口上,在conf.d目录下再创建一个 http.conf的配置文件,写入以下内容:

server {
listen       80;
server_name  api.example.com;
return       301 https://$server_name$request_uri; }


这个配置文件使得nginx监听所有80端口的请求,同时将请求通过301的方式转发到https的443端口之上,通过这种方式,使得直接输入域名的方式,也可以正确访问服务,通过如下命令重新启动nginx服务器:

[root@VM_56_156_centos nginx]# service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]


再次通过浏览器访问 http://api.example.com (需替换成您自己的域名)



通过控制台可以看见,有一个301的跳转,最终浏览器中访问的还是https的服务。

至此,https的服务已经搭建完成了,后面将搭建Parse的服务,并通过nginx转发至该服务上。

5. 搭建Parse服务

5.1 安装MongoDB

Parse的后端存储服务依赖于MongoDB,所以需要先安装MongDB。

创建文件 /etc/yum.repos.d/mongodb.repo,加入以下内容:

[mongodb-org]
name=MongoDB Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mongodb/yum/el$releasever/
gpgcheck=0
enabled=1


刷新缓存并安装 mongodb-org 即可:

[root@VM_56_156_centos mongodb]# yum makecache
[root@VM_56_156_centos mongodb]# yum install mongodb-org


创建配置文件 /opt/mongodb/mongod.conf配置文件,加入以下内容:

processManagement:
fork: true
net:
bindIp: 127.0.0.1
port: 27017
storage:
dbPath: /opt/mongodb/data
systemLog:
destination: file
path: "/opt/mongodb/logs/mongod.log"
logAppend: true
storage:
journal:
enabled: true


启动mongodb:

[root@VM_56_156_centos mongodb]# /opt/mongodb/bin/mongod -f /opt/mongodb/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 15329
child process started successfully, parent exiting


5.2 安装Parse Server和Parse Dashboard

Parse Server的官方Github仓库中有一个parse-server-example,是一个基于Express的工程,通过启动该工程即可创建一个Parse Server。同时,Parse 官方还提供了一个parse-dashboard工程,也可以依赖到同一个工程中去。

经整合的index.js的文件内容如下:

// Example express application adding the parse-server module to expose Parse
// compatible API routes.

var express = require('express');
var ParseServer = require('parse-server').ParseServer;
var ParseDashboard = require('parse-dashboard');
var path = require('path');

var databaseUri = process.env.DATABASE_URI || process.env.MONGODB_URI;

//Parse服务的域名
var parseDomain = process.env.PARSE_DOMAIN;

if (!databaseUri) {
console.log('DATABASE_URI not specified, falling back to localhost.');
}

var api = new ParseServer({
databaseURI: databaseUri || 'mongodb://localhost:27017/meetwish',
cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
appId: process.env.APP_ID || 'myAppId',
masterKey: process.env.MASTER_KEY || '', //Add your master key here. Keep it secret!
serverURL: `http://localhost:1337/parse`,  // Don't forget to change to https if needed
liveQuery: {
classNames: ['Posts', 'Comments'] // List of classes to support for query subscriptions
}
});

var dashboard = new ParseDashboard({
'apps': [
{
'serverURL': `https://${parseDomain}/parse`,
'appId': process.env.APP_ID || 'myAppId',
'masterKey': process.env.MASTER_KEY || '',
'appName': 'meetwish'
}
],
'users': [
{
'user': process.env.USER_NAME || 'username',
'pass': process.env.PASSWORD || 'password'
}
]
}, false);

// Client-keys like the javascript key or the .NET key are not necessary with parse-server
// If you wish you require them, you can set them as options in the initialization above:
// javascriptKey, restAPIKey, dotNetKey, clientKey

var app = express();

// Serve static assets from the /public folder
app.use('/public', express.static(path.join(__dirname, '/public')));

// make the Parse Dashboard available at /dashboard
app.use('/dashboard', dashboard);

// Serve the Parse API on the /parse URL prefix
var mountPath = process.env.PARSE_MOUNT || '/parse';
app.use(mountPath, api);

// Parse Server plays nicely with the rest of your web routes
app.get('/', function(req, res) {
res.status(200).send('I dream of being a website.  Please star the parse-server repo on GitHub!');
});

// There will be a test page available on the /test path of your server url
// Remove this before launching your app
app.get('/test', function(req, res) {
res.sendFile(path.join(__dirname, '/public/test.html'));
});

var port = process.env.PORT || 1337;
var httpServer = require('http').createServer(app);
httpServer.listen(port, function() {
console.log('parse-server running on port ' + port + '.');
});

// This will enable the Live Query real-time server
ParseServer.createLiveQueryServer(httpServer);


启动时需指定
APP_ID
,
MASTER_KEY
,
USER_NAME
,
PASSWORD
,
PARSE_DOMAIN
等环境变量。

APP_ID:应用的ID,所有的接口中都会用到该参数

MASTER_KEY:应用的密钥,需妥善保管,避免泄露,通过该key可以忽略所有的访问权限控制。

USER_NAME:访问Dashboard的用户名

PASSWORD:访问Dashboard的密码

PARSE_DOMAIN:部署Parse Server的域名或公网IP

假设Parse Server服务器的域名是:api.example.com

启动命令如下:

APP_ID=xxx MASTER_KEY=xxx USER_NAME=xxx PASSWORD=xxx PARSE_DOMAIN=api.example.com node index.js


为了能后台启动,也可通过pm2对node程序进行管理。

5.3 配置nginx反向代理Parse Server及Parse Dashboard

编辑
/etc/nginx/conf.d/https.conf
文件,完整内容如下:

server {
listen 443;
server_name api.example.com;
ssl on;
ssl_certificate  cert/312431314412324.pem;
ssl_certificate_key cert/312431314412324.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:1337; proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}


相比原来的配置,仅仅是location区块内的内容发生了变化,更多nginx配置的内容,请参考官网文档

修改完配置以后,重启nginx:

[root@VM_56_156_centos ~]# service nginx restart


大功告成,此时访问https://api.example.com (需替换成您自己的域名),即可查看到服务啦!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: