搭建基于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 (需替换成您自己的域名),即可查看到服务啦!
相关文章推荐
- 基于openssl搭建https服务
- 基于CentOS搭建FTP文件服务
- 为苹果ATS和微信小程序搭建 Nginx + HTTPS 服务
- 【PHP】基于ThinkPHP框架搭建OAuth2.0服务
- 基于CentOS 6.5操作系统搭建MongoDB服务
- Android移动后端服务(BAAS)快速搭建后台服务器之Bmob-android学习之旅(75)
- 基于curl的linux与windows通信服务搭建
- 如何搭建基于Jesery框架的Restful服务
- HTTPS静态服务搭建过程详解
- 基于tomcat的https搭建
- 基于lnmp的电商服务平台的搭建
- HTTPS静态服务搭建过程详解
- 快速搭建基于beanstalk的php消息队列服务
- Android移动后端服务(BAAS)快速搭建后台服务器之Bmob-android学习之旅(75)
- [置顶] 基于docker-swarm搭建持续集成集群服务
- 【原】用PHP搭建基于swoole扩展的socket服务(附PHP扩展的安装步骤及Linux/shell在线手册)
- 基于openssl的https服务配置
- HTTPS 服务搭建相关概念
- 用FreeBSD10搭建基于ZFS的iSCSI服务