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

来源:互联网 发布:网络电玩城捕鱼游戏 编辑:程序博客网 时间:2024/05/20 17:40

搭建基于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 -ltotal 40drwxr-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.typeslrwxrwxrwx   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 -ltotal 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 startStarting 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 restartStopping 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 Repositorybaseurl=https://mirrors.tuna.tsinghua.edu.cn/mongodb/yum/el$releasever/gpgcheck=0enabled=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: truenet:   bindIp: 127.0.0.1   port: 27017storage:   dbPath: /opt/mongodb/datasystemLog:   destination: file   path: "/opt/mongodb/logs/mongod.log"   logAppend: truestorage:   journal:      enabled: true

启动mongodb:

[root@VM_56_156_centos mongodb]# /opt/mongodb/bin/mongod -f /opt/mongodb/mongod.confabout to fork child process, waiting until server is ready for connections.forked process: 15329child 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, clientKeyvar app = express();// Serve static assets from the /public folderapp.use('/public', express.static(path.join(__dirname, '/public')));// make the Parse Dashboard available at /dashboardapp.use('/dashboard', dashboard);// Serve the Parse API on the /parse URL prefixvar mountPath = process.env.PARSE_MOUNT || '/parse';app.use(mountPath, api);// Parse Server plays nicely with the rest of your web routesapp.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 appapp.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 serverParseServer.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 (需替换成您自己的域名),即可查看到服务啦!

这里写图片描述

原创粉丝点击