从零开始部署小程序服务器(腾讯云)

话说目前云已经很便宜了,腾讯有一个月的试用期,不过阿里云也有,而且对于学生认证的用户 9.9元一个月的最低配置,这让 Lefe 才有可能尝试配置一个线上的服务器。从一个小白开始,感觉都是新的东西,有时候碰到问题,很难,无从下手,不过通过网上的各种资料最终都解决了,下面主要讲一讲过程,这些知识对于服务器端的同学来说,应该很简单,但我只想记录下这一路走来所经历的!

服务器是什么

服务器是什么?啥,你竟然不知道服务器是啥,你每天都和服务器打交道。以 lefe 自己的理解,服务器和本地一台笔记本差不多,所以配置服务器也就是和配置本地的环境差不多,唯一不同的是各种操作,都需要终端命令来替代我们的图形化界面,比如建立文件夹,下载,解压等等。

购买腾讯云

到腾讯云官网上购买【云服务器CVM】,购买后分派两个ip地址,公网和内网的。我们做一些配置基本都是基于外网ip。Lefe 购买的是 Ubuntu

外网IP,就是公网IP,可以给外面人用的,例如做网站,或给其它人下载等。
肉网IP,就是局网IP,如果你有几台以上的云主机,可以局网传输数据,局网传输数据不占用外部带宽限制,传输大文件速度会快很多很多。

配置服务器

一、如何登录到服务器:

我已经有ip地址了,可是我咋么才能登录到服务器上,来配置我们的环境呢?这里一般官方文档到会有写,不过一般写的比较粗略,对于我这个小白用户来说,看不太明白。这里主要介绍一种登录方式:
ssh的方式登录,这种方式相信很多同学都见过,比如 git。它需要把一台PC上生成的公钥传到服务器后台(腾讯云后台管理中心),这样服务器就可以信任当前的PC了。

  • PC端生成公钥:
    打开终端输入:ssh-keygen , 一路回车,这时会生成一个公钥和一个私钥;
  • 终端输入:cat .ssh/id_rsa.pub,复制公钥,上传到腾讯云后台管理中心;
  • 终端输入:ssh ubuntu@118.89.23.181,ubuntu 这个会管理员账号,不同系统可能会不同,比如有的是 root,阿里云好像都是 root,118.89.23.181 这个是公网的 ip 地址。

登录成功后,你就可以随心所欲了,不要怕搞坏哦,终端显示如下:

很简单吧,这样就可以登录到服务器上了。这里 lefe 推荐终端软件 iTerm

注意:下面所讲到的都是基于登录到服务器后的操作。

二、安装 Node.js

主人公该上场了,有个 Node 我们才能开启我们基本的 Http 服务。

终端输入:
curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install nodejs

报错:
The program 'node' is currently not installed. You can install it by typing:
sudo apt install nodejs-legacy

执行下面语句:
sudo apt install nodejs-legacy

终端输入:
node -v ,查看你所安装 Node的版本号;

嗯,这样 Node 就安装好了,还记得你第一安装 Node 吗?

三、开启 Node 服务

这时候需要把 Lefe 写好的 Node 服务克隆到服务器上,想想当你刚接触 git 的时候,你是如何把 github 上的代码克隆到自己电脑上的,如果是别人帮你弄的,lefe 建议读者自行实践一下。

  • 生成一个公钥,和登录时的生成方式一样,只不过这里是在服务器上生成的
  • 把生成好的公钥上传到 git 服务器上
  • 执行 git clone https://github.com/iMetalk/TCZNodeServer

当然 lefe 这时候克隆的是一个自己写好的 Node;

克隆后在服务器上的目录为:

/home/ubuntu/nodeserver/WJCar_node

  • 执行 node app.js,这样服务就起来了。

Lefe:哎,不对哦,我有数据库啊,好吧,还需要安装数据库,不然我的数据从哪来?搞个假数据,你这也能想的出来。

四、安装 mongodb

Lefe:咋么安装呢?呵呵,都是 linux 系统,记得本地以前配置过,哎对了,以前还写过一片博客,翻了翻以前的博客,哎真有啊,开心坏了。不一会就安装好了。可以参考这篇文章
Mongodb安装。

关了几次终端,出现了一个问题:

ubuntu@VM-68-186-ubuntu:/usr/local/mongodb/bin$ ./mongod --dbpath=/usr/local/mongodb/data/db/2017-05-14T11:09:50.823+0800 I CONTROL  [initandlisten] MongoDB starting : pid=21537 port=27017 dbpath=/usr/local/mongodb/data/db/ 64-bit host=VM-68-186-ubuntu2017-05-14T11:09:50.826+0800 I CONTROL  [initandlisten] db version v3.2.92017-05-14T11:09:50.826+0800 I CONTROL  [initandlisten] git version: 22ec9e93b40c85fc7cae7d56e7d6a02fd811088c2017-05-14T11:09:50.826+0800 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2g  1 Mar 20162017-05-14T11:09:50.826+0800 I CONTROL  [initandlisten] allocator: tcmalloc2017-05-14T11:09:50.826+0800 I CONTROL  [initandlisten] modules: none2017-05-14T11:09:50.826+0800 I CONTROL  [initandlisten] build environment:2017-05-14T11:09:50.826+0800 I CONTROL  [initandlisten]     distmod: ubuntu14042017-05-14T11:09:50.826+0800 I CONTROL  [initandlisten]     distarch: x86_642017-05-14T11:09:50.826+0800 I CONTROL  [initandlisten]     target_arch: x86_642017-05-14T11:09:50.826+0800 I CONTROL  [initandlisten] options: { storage: { dbPath: "/usr/local/mongodb/data/db/" } }2017-05-14T11:09:50.880+0800 E NETWORK  [initandlisten] listen(): bind() failed errno:98 Address already in use for socket: 0.0.0.0:270172017-05-14T11:09:50.882+0800 E NETWORK  [initandlisten]   addr already in use2017-05-14T11:09:50.882+0800 E STORAGE  [initandlisten] Failed to set up sockets during startup.2017-05-14T11:09:50.882+0800 I CONTROL  [initandlisten] dbexit:  rc: 48

这下坏了,纠结啊!!!看了看错误,好像是某个端口已经被占用了,98 Address already in use for socket: 0.0.0.0:27017,别怕 Google一下吧,果然很多人遇到了同样的问题,绕了一圈,最终得以解决。这种情况一般是不正常的退出 Mongodb 导致的。简单粗暴:sudo killall mongod,直接杀掉。

哈哈,大功告成了,正高兴这呢。哎不对呀,如果我把终端关闭了,那我 Node 服务就死了,那还要服务器干吗呢?突然脑海中浮现出一个 PM2(你咋这么聪明呢,我咋只知道 PM2.5),这个家伙经常听后台的同学说,我一开始还以为是 pm2.5呢?抱着试一试的心态,Google 了一下,太神奇了,原来 PM2 就是解决这个问题的。

五、PM2 安装

看了看 官方文档 很快就安装好了,原来它可以使用 NPM 安装。

试一试吧:就是把 node app.js 换成 pm2 start app.js

原来看到后端同学屏幕上显示的原来就是这个东西。呀!不对呀,那我 mongodb 数据库关闭终端后也就会被挂起了,是不也可以使用 PM2 呢?最终发现不可以,那咋么办呢?估计和这个原理差不多,也开启一个守护进程。果不其然,启动 mongodb 还有其他的一种方式:

sudo mongod --fork --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs/mongodb2.log --logappend

Lefe 开心的登录微信小程序后台,哎,不对,微信小程序必须使用域名而不是ip地址,好吧,只好妥协了,申请一个域名吧。

六、申请域名

都这么贵,.com, .cn,那就找一个最便宜的吧,哎有一个,lefe.wang,这个不错,天意呀,lefe 我的笔名,wang 我的姓,果断就选它了,登录腾讯云后台解析了下,很快的我的接口可以使用域名访问了。把域名配置到小程序后台,哎,不对呀,人家要求的是 https 的,这下悲剧了,好吧,我妥协。

七、HTTPS 配置

Lefe 记得自己的后台不支持 Https,赶快支持一下吧。且慢,我还没有 https 证书呢,咋么让我的 Node 服务支持 Https 呢,自签名的腾讯肯定不可以,果断放弃了这种自签名的方式。Google 了一下免费的 Https 证书,收费的真的太贵了。哎,不错,有免费的,最终选择了腾讯云免费的 https证书,这里有一个坑,使用域名申请证书的时候要用与 ip 地址绑定的那个子域名而不是根域名。比如 lefe 申请的根域名是 lefe.wang,与 ip 绑定的是 wqjp.lefe.wang,那么申请 Https 证书要用域名 wqjp.lefe.wang ,证书也有了,开始配置服务器了,代码如下:

var express = require('express');var bodyparser = require('body-parser');var router = require('./router.js');var mongodb = require('./db/mongodb.js');var fs = require('fs');var https = require('https');var http = require('http'); var app = express();app.use(bodyparser.json());app.use(bodyparser.urlencoded({    extended: true})); var privateKey  = fs.readFileSync('./res/2_wqjp.lefe.wang.key', 'utf8');var certificate = fs.readFileSync('./res/1_wqjp.lefe.wang_bundle.crt', 'utf8');var credentials = {key: privateKey, cert: certificate}; var httpsServer = https.createServer(credentials, app);var httpServer = http.createServer(app); var SSLPORT = 4000;var PORT = 4001; var routeCB = function routeCallBack(req, res, next){    if(req.url=="/favicon.ico"){        res.end();    }    else    {        next()    }} var dealCB = function  dealCallBack(req, res){    // 解析post参数    router.routed(req, res)} app.all('*', [routeCB, dealCB]); // app.listen(4000); httpsServer.listen(SSLPORT, function() {    console.log('HTTPS Server is running on: https://localhost:%s', SSLPORT);}); httpServer.listen(PORT, function() {    console.log('HTTP Server is running on: http://localhost:%s', PORT);});

Lefe 打开小程序编辑器,模拟器数据一切请求正确,没问题,用真机预览一下吧,啊,咋么没数据呢,后台也没报错啊!到小程序论坛上查了查,不能使用端口。我说呢,我的请求和服务端的同学不一样呢。我的请求是 https://wqjp.lefe.wang:400/api/store/get,请求本应该是 https://wqjp.lefe.wang/api/store/get 没端口,这可咋办呢?Google 了一下,可以使用 Nginx,啥 Nginx,一直听到后端的同学在说,没想到我也能用到,好吧,我妥协!

八、配置 Nginx

Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

好吧,一字一句看了,还是不懂。Lefe 的理解是,它可以把你的请求根据不同的需要请求到不同的服务器上。它的作用就是反向代理和负载均衡,不明白也没关系。继续往下看吧。

安装 Nginx:

  • gcc、g++依赖库
    apt-get install build-essential apt-get install libtool

  • 安装 pcre依赖库(http://www.pcre.org/)
    sudo apt-get install libpcre3 libpcre3-dev

  • 安装 zlib依赖库(http://www.zlib.net)
    apt-get install zlib1g-dev

  • 安装
    cd /usr/local/src wget http://nginx.org/download/nginx-1.4.2.tar.gz tar -zxvf nginx-1.4.2.tar.gz cd nginx-1.4.2

  • ./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=/opt/app/openet/oetal1/chenhe/pcre-8.37
    --with-zlib=/opt/app/openet/oetal1/chenhe/zlib-1.2.8
    --with-openssl=/opt/app/openet/oetal1/chenhe/openssl-1.0.1t

  • make

执行完一大堆后,就算安装完成了。那么如何才能 让https://wqjp.lefe.wang:400/api/store/get的请求指向https://wqjp.lefe.wang/api/store/get。只能修改配置文件了。Lefe 的配置文件如下,它同时支持 http 和 https。安装完后的 Nginx 在 /usr/local/ 目录下,找到配置文件 /usr/local/nginx/conf/nginx.conf,编辑这个配置文件,在编辑配置文件时,有几个坑需要注意一下:

  • # 是配置文件的注释,所以有些地方需要去掉

  • server_name 不需要加前缀,比如 httphttps

  • proxy_pass 需要是一个完整的地址,包含 httphttps

  • 修改完配置文件一定要重启,lefe 不知道从那个地方看到,说nginx -s reload这个可以重启,可把我害惨了,一直以为是配置文件的问题,原来是没有重启,重启用这个 sudo nginx -c /usr/local/nginx/conf/nginx.conf

  • 如果报pid错误,使用 Nginx killall -9 nginx 来解决

    user nobody;workerprocesses 1;#pid logs/nginx.pid;events { workerconnections 1024;} http { include mime.types; defaulttype application/octet-stream; sendfile on; keepalivetimeout 65; server { listen 80; # 这个是你所申请的域名 servername wqjp.lefe.wang; location / { root /home/ubuntu/nodeserver/WJCarnode/WJCar; index app.js; proxysetheader X-Real-IP $remoteaddr; proxysetheader X-Forwarded-For $proxyaddxforwardedfor; proxysetheader Host $httphost; proxysetheader X-NginX-Proxy true; proxypass http://127.0.0.1:4001; proxyredirect off; } } # HTTPS server server { listen 443; servername wqjp.lefe.wang; ssl on; # 申请https证书的位置 sslcertificate /home/ubuntu/nodeserver/WJCarnode/WJCar/res/1wqjp.lefe.wangbundle.crt; # 申请https公钥的位置 sslcertificatekey /home/ubuntu/nodeserver/WJCarnode/WJCar/res/2wqjp.lefe.wang.key; sslsessiontimeout 5m; sslprotocols TLSv1 TLSv1.1 TLSv1.2; sslciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; sslpreferserverciphers on; location / { root /home/ubuntu/nodeserver/WJCarnode/WJCar; index app.js; proxyredirect off; proxysetheader Host $host; proxysetheader X-Real-IP $remoteaddr; proxysetheader X-Forwarded-For $proxyaddxforwardedfor; proxypass https://118.89.23.181:4000; } }}

恭喜你完成了!呀,这就完成了,嗯,是的,这下用真机预览,就可以看到漂亮的界面了。想看吗?等等给你看!!!

结尾

写了这么多,也没看到小程序长上样,可以看看吗?好吧,满足你们,放几张漂亮的图,长的丑吗?还好吧,感觉没那么垃圾吧,虽然是小白设计,但是有 sketch 这款强大的设计软件,让 lefe 少走很多弯路。

IMG_0851.PNG

IMG_0852.PNG

IMG_0853.PNG

总结

第一次部署服务器,一步一步下来,花了不少时间,几乎用光了我所有的业余时间,从产品的需要,到设计,到切图,到服务器,到小程序。可以说是经历了一个软件开发的大部分过程。也体会到了工作中各个部门的难处,所以工作中我们需要体谅别人,不要只耕自己的一亩三分地,出现问题找各种理由。作为一个小白,难免会有不得当的地方,有什么问题欢迎反馈,谢谢。

参考

Node配置

===== 我是有底线的 ======
喜欢我的文章,欢迎关注我的新浪微博 Lefe_x,我会不定期的分享一些开发技巧

小礼物走一走,来简书关注我

赞赏支持

微信小程序

© 著作权归作者所有

举报文章

关注 Lefe

写了 62031 字,被 427 人关注,获得了 435 个喜欢

iOS开发,熟悉Node开发,正在修行,深爱React Native和微信小程序。正在踏入音视频这条不归路,希望在这方面有所成就。

喜欢

32

下载app生成长微博图片

更多分享

登录 后发表评论

5条评论 只看作者 关闭评论

按时间倒序按时间正序

zoukeqing

4楼 · 2017.09.26 23:23

哎呀,好复杂啊

作者:Lefe
链接:https://www.jianshu.com/p/b9f6c8801594
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

从零开始部署小程序服务器(腾讯云)相关推荐

  1. 微信小程序基于腾讯云对象存储的图片上传

    在使用腾讯云对象存储之前,公司一直使用的是传统的FTP的上传模式,而随着用户量的不断增加,FTP所暴露出来的问题也越来越多,1.传输效率低,上传速度慢.2.时常有上传其他文件来攻击服务器,安全上得不到 ...

  2. 【小程序】微信小程序使用腾讯云IM(一):登录

    微信小程序使用腾讯云IM 新项目已经写了很久啦 这个项目里主要的难点其实是1v1聊天.他们对比了好几家的即时通讯,最后选择了腾讯云通信.我猜,可能是因为腾讯云上说日活低于10w可以不付费吧.省钱嘛~踩 ...

  3. 微信小程序利用腾讯云IM发送语音 + 图片

    微信小程序利用腾讯云IM发送语音 + 图片 能做到这里 说明你已经可以发送普通文本了 如果没有的话可以看一下我的上一篇文章 有完整的讲解 效果图 语音聊天 发送图片 传送 → 发送图片 发送语音 ** ...

  4. 微信小程序接入腾讯云IM即时通讯(获取聊天历史记录开发步骤)

    微信小程序接入腾讯云IM即时通讯(获取聊天历史记录开发步骤) 1.先看文档: 获取 C2C 历史消息 :https://cloud.tencent.com/document/product/269/1 ...

  5. 微信小程序授权腾讯云

    前言: 如果之前没有授权过腾讯云,现在在开发者工具页面已经没有腾讯云选项,只有一个腾讯位置服务. 在开发者工具里面也没有腾讯云按钮(我这是己经授权才出现的,之前并没有) 但是目前的项目并不想使用云开发 ...

  6. 微信小程序实现腾讯云接口 图象识别

    微信小程序实现腾讯云接口 图象识别 注:操作环境:springboot+微信小程序 1.导入maven 腾讯云图象识别接口 jar包 <!-- 腾讯云文字识别接口--><depend ...

  7. 微信小程序开通腾讯云开发环境

    目录 微信小程序开通"腾讯云"开发环境 注册腾讯云账号 配置开发环境 微信小程序开通"腾讯云"开发环境 这里强调以下,标题是"腾讯云"开发环 ...

  8. 部署小程序服务器从零开始(腾讯云)

    话说目前云已经很便宜了,腾讯有一个月的试用期,不过阿里云也有,而且对于学生认证的用户 9.9元一个月的最低配置,这让 Lefe 才有可能尝试配置一个线上的服务器.从一个小白开始,感觉都是新的东西,有时 ...

  9. 新的开始部署小程序服务器(腾讯云)

    话说目前云已经很便宜了,腾讯有一个月的试用期,不过阿里云也有,而且对于学生认证的用户 9.9元一个月的最低配置,这让 Lefe 才有可能尝试配置一个线上的服务器.从一个小白开始,感觉都是新的东西,有时 ...

最新文章

  1. 数据库连接池,实现及分析
  2. 爱耳日腾讯天籁行动再升级 助力100位青年听障人才打破“屏障”
  3. python教学视频下载-董付国老师Python精品教学,视频教程下载
  4. 如何保持在QA这条路上, 而不会想转换到RD去呢?
  5. Learn Python the first day.
  6. 【数字图像处理】傅里叶变换在图像处理中的应用
  7. QT widget窗体设置主次
  8. 自动驾驶_感知_跟踪
  9. UG软件制图的几个重要技巧,你知道吗?
  10. 距离2022年研究生考试还有多少天?倒计时天数用便签设置
  11. JavaWeb - 国家语言代码表
  12. excel - 单元格的表示方式 (称为:单元格引用 )(类似:变量表示单元格)
  13. 论如何做好IE和Chrome互殴时的一条好池鱼之事件绑定篇
  14. 自学python 经验学习心得分享
  15. 7大不跳槽就会死的理由!
  16. html js css 简明教程,Web前端开发简明教程(HTML+CSS+JavaScript+jQuery)
  17. va_list 原理以及用法
  18. 到底什么是QPS、TPS、RT、PV、UV、IV、VV、IP、系统吞吐量?
  19. excel查找指定表计算机,两个excel表格找文本相同数据库-excel如何查找并自动填写对应数据...
  20. python word排版_python办公自动化:自动进行word文档处理和排版-docx文件

热门文章

  1. 探索科技手段下的食品安全,区块链冷链追溯平台建设解决方案
  2. 论文密级_毕业论文格式怎么调?模板在这里!(专业学位)
  3. [笔记].上拉电阻的作用之一 - 将 TTL电平提升至CMOS电平
  4. 干货!BMS电池管理系统均衡设计,有效延长电池使用寿命
  5. Flutter Weekly Issue 52
  6. 第四、第五套人民币“三字冠”的定名与组集
  7. git对指定commitid 打tag_Git 标签使用详解
  8. keycloak单点登录(浙政钉2.0扫码、手机号验证码登录)
  9. 区块链和智能投顾结合的思考
  10. python2.7 安装pypcap出错 pcap.h not found