本文来自作者
郭方超
在
GitChat
上分享 「前端如何拥有自己的服务器」,
「
阅读原文
」
查看交流实录。
「
文末高能
」
编辑 | 哈比
前言
前端开发者需要一直关注浏览器的行为和表现。时间长了免不了要接触到后端的知识、服务器的知识。
尤其是在前端技术爆发式发展的当下,前端慢慢的渗透到了更多的领域。比如,使用 express/koa 创建 http 服务,使用 React-Native 开发 Android 和 IOS 通用的 APP,甚至使用 node 开发系统、嵌入式程序等。
这个时候,我的内心开始蠢蠢欲动,我能做的不仅仅是网页。
首先,我需要一台服务器。上面有我需要的各种有用的库,每当我有新的想法需要实践的时候我就拿出来搞一波,简单快速成型。
我不必依赖后端同事,我也不想占用公司的资源,哪怕是创业或者我想开发自己的软件或库,我也不会有任何的问题。
来看这篇文章的同学想必都是需要这么一个服务器的,刚开始学习的时候,我不建
议大家使用复杂的环境,这个会带来大量的调试成本,同时页会遇到很多不可预知的错误。
我推荐使用云服务器
(其他同学可以使用虚拟机,效果也可以)
,大家根据我的教程就可以轻松愉快的创建一个完整的服务器。
准备
我需要以下这些来完成后面的工作。
-
一个域名:下面将讲解使用 Nginx 管理自己的各个服务,一个域名是必不可少的,如果你经常使用域名那就更好了。
-
一台 Linux 服务器:这篇文章主要在 Linux 上做各种开发,Window 的没有什么难度,网上也有很多教程,这里就不介绍了。作为一个服务器怎么能用 Windows 呢 ?
-
如果使用 Windows 电脑做个人电脑,我这里推荐大家安装一个 xshell 做为连接服务器的工具,这个软件非常好用,其他诸如 Mac/Ubuntu 的请使用电脑自带的终端。
创建自己的服务器
使用云服务器
我这里推荐使用云服务器,相比使用自己的服务器,云服务器有很多方便的地方,而且云服务器提供一个一周的试用版,用起来非常的方便。
创建一个轻量级的服务器
阿里云可以购买一台可使用一周的服务器,这个服务器正好用来做这次开发(已有的请跳过)。
-
登录阿里云,进入购买 CES 的地方,链接:
https://ecs-buy-cn-huhehaote.aliyun.com/#/prepay。
-
依次选择:
- 计费方式:包年包月。
- 地域:华北 5(当前华北 5 有优惠)。
- 实例:请寻找 1vCPU、1G 内存的实例(我最终选择了突发性能实例 t5)。
- 镜像:选择 CentOS 7.4 (现在后端普遍使用 6+ 的版本,7 相比 6 有了很大改进,前端选择 7 可以减少很多麻烦),勾选安全加固。
- 云盘:40G 高效云盘。
- 公网带宽:勾选自动分配公网 IP,选择 1M 带宽。
- 安全组:选择默认安全组,并勾选 http80 端口和 http443 端口。
- 购买周期:选择 1 周。
最终结果:
我们的服务器主要做网站类的开发,所以有针对性需求的用户可以考虑将内存增大,其他在需要的时候采取考虑。
使用虚拟机
如果你打算使用虚拟机,这可能会增加你的开发难度,而且效果可能和在自己的电脑上直接开发没有太大区别。
下面演示一下使用 VM12 虚拟机以及 Ubuntu 系统来安装一个虚拟机,安装是在 windows 系统下进行,这也是大多数安装虚拟机的场景了。
以上基本就可以安装好一台虚拟机了,实际的使用上和一台真实的机器并没有太大的区别,剩下的请各位自行探索。
本文主要介绍的还是在云服务器上的开发。
安装自己的开发环境
到这里就可以开始第一次在 Linux 上开发了,是不是很兴奋 ?
连接到服务器
Linux 服务器不像 window 那样有一个可视化的界面,window/mac 连接的时候也不像远程桌面那样方便。这里连接服务器需要使用命令才行。
window 连接服务器
好消息是 window 下有一款神器:xshell,命令可以很方便的输入到一台服务器或者多台服务器上,用户密码也可以很方便的保存在本地,多个服务器还可以分组,你要做的就是专注于眼前的服务器开发。
这个软件多用于常年跟服务器打交道的同学那里。如果你没有,可以找他们要一个。
Mac 连接服务器
Mac 连接服务器可以使用自带的
终端
应用,也可以自己下载一个
iTerm2
,这里我推荐使用 iTerm2,可以方便的使用不同的主题,添加各种有用的插件。
几个常用的命令
要想使用 Linux 系统服务器做开发,不懂几个常用命令怎么行?
-
ssh 用户名 @ip
,连接服务器的命令。
-
cd 绝对路径 / 相对路径
,跳转到路径对应的目录下。
-
rm 文件名
,删除文件。
-
rm -rf 目录路径
,删除目录以及目录下的所有文件,谨慎操作 !
-
ls [-a]
,查看当前目录下的文件和目录,加-a 参数可以查看所有文件,包括隐藏文件(
.
开头的文件是隐藏文件,默认是看不见的)。
-
ll
,查看当前目录下的文件详情,可以文件的权限,遇到没有权限执行的情况下可以使用这个命令查看。
-
pwd
,查看当前路径的完整路径,不知道自己在哪儿的时候可以使用这个命令查看。
-
which 名字
,在几个默认位置查找改名字,比如查找
pm2
安装在哪个地方了。
-
mkdir 目录名
,创建一个空目录。
-
cat 相对 / 绝对文件路径
,查看文件的内容,多为查看日志或者其他文本文件。
-
cp 文件路径 目标路径
,复制一个文件到另外一个地方。
-
mv 文件路径 目标路径
,移动一个文件到另外一个地方,也可以重命名。
-
ps -aux
,显示当前进程,有时候需要用这个查看进程是否存活。
-
kill -9 进程 id
,结束进程,进程 id 就是上一条命令查到的 pid。
-
tar -zxvf 文件
,解压缩文件。
-
tar -zcvf 压缩后的文件 要压缩的文件 / 目录
,压缩文件。
-
vi 文件路径
,使用 vim 进入文件的编辑模式。
-
vi 退出文件,按下 esc 键保证退出编辑模式,输入
:q
或者
:q!
强制退出。
-
vi 编辑,按下
i
左下角会提示进入编辑模式,然后就是正常的输入文字,再按
esc
键退出编辑模式。
-
vi 保存编辑结果,按下 esc 键保证退出编辑模式,输入
:x
保存并退出。
安装 Node
下面就进入到激动人心的时刻了,前端一切的起源,起飞的翅膀,就是 nodejs。
(1)推荐安装最新的稳定版。我这里是 8.9.4,下载地址:https://nodejs.org/en/download/。
(2)选择
Source Code
后面的那一行,右键复制链接地址
https://nodejs.org/dist/v8.9.4/node-v8.9.4.tar.gz
。我们使用源代码的方式安装,第一次安装的时候使用这种方式好处多多。
(3)回到服务器,首先跳转到根目录下
cd /
。创建一个空目录,用来放所有的安装包
mkdir soft
。
(4)使用命令把刚才的文件下载下来
wget https://nodejs.org/dist/v8.9.4/node-v8.9.4.tar.gz
。提示:地址是国外地址,下载会很慢。
(5)将下载好的压缩包解压
tar -zxvf node-v8.9.4.tar.gz
:
(6)进入解压好的目录并执行 config 配置命令
cd node-v8.9.4.tar && ./configure
:
(7)执行编译以及安装命令
make && make install
:
(8)漫长的等待之后,一个可以使用的 node 环境就安装好了,可以通过执行
node -v
或者
npm -v
来检测当前的 node/npm 安装是否成功。
(9)如果编译过程中出现
g++: Command not found
可以升级来解决(centos 版本是 7 以下的会出现)
yum install gcc gcc-c++
:
安装 nrm 和 pm2
nrm 是一个管理 npm 源的插件,方便切换国内国外以及私人 npm 库。
pm2 是 node 服务器的守护进程,可以安转 cpm 数量创建多个服务,可以方便的管理当前服务器上的所有服务。
如果安装比较慢或者根本没进度,请直接使用 cnpm,输入命令
npm install -g cnpm --registry=https://registry.npm.taobao.org
,然后使用 cnpm 代替 npm 安装下面的 2 个插件。
nrm
pm2
有兴趣的可以看看 pm2.5,基本上和 pm2 一样。但是它自己有一些改进,增强了某些方面的性能。
-
启动一个 pm2 的守护进程使用命令:
pm2 start index.js
。
-
重启一个 pm2 的进程使用命令:
pm2 restart id/name
。
-
删除一个正在使用的进程使用命令:
pm2 delete id/name
。
-
查看 pm2 的消耗使用命令:
pm2 monit
。
安装其他软件
node 只是基础,其他的软件也是必不可少的。
安装 MySQL
mysql 是一个方便使用的开源数据库。因为使用简单,安装方便,功能强大,受到很多开发者的喜爱,给自己安装一个 MySQL 数据库真的是非常有必要的,利用它可以存储不少东西。
(1)下载安装需要用到的源:
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
。
(2)安装下载的源
rpm -ivh mysql-community-release-el7-5.noarch.rpm
。
(3)下载安装 MySQL:
yum install mysql-server
。
(4)使用
service mysqld start
。
(5)如果遇到错误
ERROR 2002 (HY000): Can't connect to local MySQL server through socket /var/lib/mysql/mysql.sock'
。
(6)请在 tmp 下创建一个软连接
ln -s /tmp/mysql.sock /var/lib/mysql
。
(7)打开 my.cnf 并修改
vi /etc/my.cnf
。
(8)重启数据库
restart mysqld.service
。
(9)使用命令修改当前用户的密码(默认 root 是没有密码的):
mysqladmin -u root password ' 密码 '
。
(10)使用命令进入数据库:
mysql -u root -p
。
(11)这个时候数据库已经安装好了,但是只能在服务器上看。我们需要让 MySQL 运行远程连接,这样方便我们调试,不用每次都要使用命令行。
(12)进入服务器的 mysql 命令行模式下,输入
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
其中 root 代表的是这次要修改的用户名,password 代表这个用户使用的密码,然后再输入
flush privileges;
让命令生效。需要注意的是每行命令的最后要加
;
,不然是不会执行的。
(13)如果顺利,这个时候已经是修改完了,你可以输入查询命令来看看最终的结果。
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
。也可以通过软件直接登录数据库看看。
(14)到此 MySQL 数据库就完成安装了,这个时候可以使用某个客户端连接上数据库看了(推荐 navicat for mysql),也可以直接进入服务器的命令行模式查看数据库。
安装 Redis
Redis 是一个非常好用的数据仓库,即可以当一个 nosql 数据库,同时也可以当一个缓存数据库。使用起来也非常的简单,安装方式也是使用源代码的方式安装,同 node 的安装很相似。
(1)从官网复制新安装包的地址。
(2)回到熟悉的 soft 目录,下载最新的源文件,
wget http://download.redis.io/releases/redis-4.0.6.tar.gz
。
(3)解压并进入解压之后的文件夹:
tar -zxvf redis-4.0.6.tar.gz &&cd redis-4.0.6
,文件名称根据下载的压缩包来变化。
(4)编译并安装:
make && make install
。
(5)安装完成之后,文件夹里的 4 个文件是以后会常用的:
redis-server
、
redis-benchmark
、’redis-cli’、
redis.conf
。您可以把这 4 个文件单独放到一个合适的位置,方便以后使用。
(6)启动 redis 服务:
redis-server redis.conf
。
(7)这个时候是不能再输入任何命令,因为 redis-server 已经占用了这个命令行客户端,我们需要再打开一个命令行工具并连接服务器(右键 iTerm2 选择 “New Tab” 或者 “Split Pane ”)。
(8)使用 redis 客户端连接 Redis 服务,执行 Redis 文件夹下的 redis-cli 文件
redis-cli
,输入几个命令测试一下简单的 set/get:
(9)让 Redis 运行在后台,占用 iTerm2 肯定是不行的,而且关掉客户端之后 Redis 服务也会停止。
修改 redis.conf 文件,将 daemonize 的值改为 yes;修改配置使用 vim 命令,有问题的可以看上面的常用命令,也可以自行搜索。
(10)再次运行 Redis 的启动命令
redis-server redis.conf
,这次就不会占用命令行了,可以继续操作其他的,Redis 服务也不会停止。
redis.conf 的几个重要配置说明:
-
daemonize:如需要在后台运行,把该项的值改为 yes。
-
pdifile:把 pid 文件放在 /var/run/redis.pid,可以配置到其他地址。
-
bind:指定 redis 只接收来自该 IP 的请求,如果不设置,那么将处理所有请求,在生产环节中最好设置该项。
-
port:监听端口,默认为 6379。
-
timeout:设置客户端连接时的超时时间,单位为秒。
-
loglevel:等级分为 4 级,debug、revbose、notice 和 warning,生产环境下一般开启 notice。
-
logfile:配置 log 文件地址,默认使用标准输出,即打印在命令行终端的端口上。
-
database:设置数据库的个数,默认使用的数据库是 0。
-
save:设置 Redis 进行数据库镜像的频率。
-
rdbcompression:在进行镜像备份时,是否进行压缩。
-
dbfilename:镜像备份文件的文件名。
-
dir:数据库镜像备份的文件放置的路径。
-
slaveof:设置该数据库为其他数据库的从数据库。
-
masterauth:当主数据库连接需要密码验证时,在这里设定。
-
requirepass:设置客户端连接后进行任何其他指定前需要使用的密码。
-
maxclients:限制同时连接的客户端数量。
-
maxmemory:设置 Redis 能够使用的最大内存。
-
appendonly:开启 appendonly 模式后,Redis 会把每一次所接收到的写操作都追加到 appendonly.aof 文件中,当 Redis 重新启动时,会从该文件恢复出之前的状态。
-
appendfsync:设置 appendonly.aof 文件进行同步的频率。
-
vm_enabled:是否开启虚拟内存支持。
-
vm_swap_file
:设置虚拟内存的交换文件的路径。
-
vm_max_momery
:设置开启虚拟内存后,Redis 将使用的最大物理内存的大小,默认为 0。
-
vm_page_size
:设置虚拟内存页的大小。
-
vm_pages:设置交换文件的总的 page 数量。
-
vm_max_thrrads
:设置 vm IO 同时使用的线程数量。
安装 Nginx
Nginx 真的是现在必不可少的一个软件。在转发请求、负载均衡等方面非常非常的有用。这里我们先简单的使用 nginx 的端口转发代理等几个功能。
它可以将几个不同的服务集中在一个 80 端口下,根据域名或者请求路径来区分。
不同的服务。
(1)注意,在安装 nginx 之前还需要安装几个 nginx 的依赖插件。
(2)安装 pcre
yum install -y pcre pcre-devel
:
(3)安装 zlib
yum install -y zlib zlib-devel
:
(4)安装 openssl,这个推荐安装,毕竟大家都在使用 https 证书了,
yum install -y openssl openssl-devel
:
(5)下载源代码,复制下载地址,并使用 wget 命令下载到服务器上,下载地址:https://nginx.org/en/download.html。
(6)解压下载的文件并进入解压好的目录
tar -zxvf nginx-1.13.8.tar.gz && cd nginx-1.13.8
。
(7)执行配置命令
./configure
:
(8)继续编译安装 nginx
make && make install
:
(9)查看安装结果
whereis nginx
:
(10)跳转到安装好的 nginx 目录下,进入 sbin 目录
cd /usr/local/nginx/sbin
。
(11)启动 nginx
./nginx
。
-
./nginx
,启动 nginx;
-
./nginx -s stop
,停止 nginx;
-
./nginx -s quit
,退出 nginx;
-
./nginx -s reload
,重启 nginx。
安装 Git
centos 上是没有安装 git,而 git 是我们开发中经常要使用的工具,这里就讲一下怎么安装 git。
(1)在服务器上执行
yum install git
。如果上面的几个软件没有安装,您可能还需要安装几个依赖库,这个可以查看出现的错误来决定安装那些库。
(2)确定一下 git 是否安装完成
git --version
。
创建服务
现在,我们已经具备了基本的开发环境。下面我将带领大家创建一个简单的 http 服务。万丈高楼平地起,我们从基础着手。
使用 express
在本地创建一个 express 服务,使用默认的脚手架即可,已经掌握的同学可以跳过这块。
(1)在本地安装 express 脚手架,
npm install express-generator -g
:
(2)使用脚手架创建一个简单的 exprss 项目,
express
:
(3)到这一步简单的一个 http 项目就创建好了,有兴趣的可以使用
npm install
把依赖包安装好,然后使用
npm run start
启动项目看看效果。本地访问
http://127.0.0.1:3000/
就可以看到效果了:
(4)回到项目外面
cd ..
,使用 tar 命令打包刚才创建的项目
tar -zcvf myapp.tar.gz myapp/
:
上传 express
接下来就是最重要的一步了,上传压缩包到服务器,命令规则
scp 压缩包路径 服务器用户名 @ 服务器 ip 地址:服务器上的绝对地址
,比如
scp myapp
.tar.gz [email protected]:/soft
,之后输入登录密码就好了:
进入服务器的 soft 目录,我们已经把文件上传到这里了,现在解压它,
cd /soft && tar -zxvf myapp.tar.gz
:
启动 express
和在自己的电脑上做并没有什么区别,我们进入解压好的 myapp 目录并安装依赖:
启动 exprss:
npm run start
。
打开网站
服务器 ip:3000
,express 脚手架生成的项目默认使用 3000 端口。
我们再看 iTerm2,已经有一些日志输出了。
使用 Git 上传代码
每次都上传压缩文件其实是一个很蠢的操作,这里我们使用 Git,让 Git 来代替我们进行文件中转的过程,我们只需要上传和下载 2 个操作。
(1)在 gitee.com 上创建一个项目,简单创建一个就行:
(2)在本地克隆这个仓库,
git clone https://gitee.com/cuo9958/test-node-server.git
这个是我创建的一个示例。
(3)把刚才的项目文件复制到这个 git 项目里,然后使用 git 命令上传到服务器上。
(4)在服务器上使用 git 命令把刚才的项目克隆下来,这样就可以把项目非常快速的同步到服务器了,真实的开发过程中也是这样居多。
真正的 http 服务
前面我们也只是创建并测试了一个简单的 http 服务,使用的是 express 生成的项目,我们自己是没有在里面做一些开发的。
下面我们就真正的完成一个 http 服务,里面用到了数据库和 nginx 等。
连接数据库
在连接数据库之前最好先下载一个数据库的管理工具,我们最常用的有很多,比如 ‘Navicat’、’sequel’ 等,这些都是可以在网站上下载的,这里我给大家提供一个 mac 上使用的简单软件,工具不多,但是够用了,下载地址:https://pan.baidu.com/s/1nwHJUKp。
使用 mysql 连接
最简单的就是直接使用 mysql 的驱动连接数据库了。
(1)安装 MySQL 库,在项目根目录下执行安装命令
npm install mysql --save
。
(2)在项目根目录下创建 db 文件夹,所有的数据库操作文件都会放在里面,在 db 文件夹下创建我们的第一个数据库操作文件
base1.js
:
(3)我们开始执行数据库连接并且输出一个简单的查询结果,提示,如果执行
npm run start
的话,请在 app.js 中引用 base1.js:
连接数据库的参数说明:
host,主机地址 (默认 localhost)
user,用户名
password,密码
port,端口号(默认:3306)
database,数据库名
multipleStatements,是否许一个 query 中有多个 MySQL 语句 (默认:false)
使用 Sequelize 连接数据库
简单的情况下我们可以使用 mysql 直接操作数据库,但是当项目开始复杂起来之后,这么做就变得艰难起来,这个时候就需要使用 orm 框架了,比如我们这次使用的
Sequelize
。
在开始之前请使用客户端创建我们的测试数据库,千万不要在刚才填的
mysql
里做操作,容易发生不必要的错误。
(1)在客户端的左上角选择 add database,添加一个新的库,编码格式选择 utf8 即可。
(2)在创建的新库里面添加一个测试用的表。表里随便塞几个字段。
下面继续 js 部分的操作
(1)在项目根目录下安装
npm install mysql2 --save
和
npm i sequelize --save
,注意要使用小写。
(2)在 db 目录下新建我们的数据库操作基础文件
base.js
,使用 sequelize 连接数据库,这个地方用到了数据库的连接池的概念,这里我们连接刚才新建的 test 数据库。
(3)在 db 目录再创建我们的数据库单表操作 js 文件
t_page_data.js
,引用刚才创建的数据库连接文件
base.js
,然后新建一个变量,初始化我们创建的数据表
t_page_data
。