Debian 8安装Node.js及Express Web框架

0x00 前言

最近突然想尝试下Node.js,于是今天上午的时候就在Windows下使用msi安装包尝了尝鲜。下午时尝试在VPS(debian系统)上进行配置,踩了一些小坑。

0x01 使用apt-get方式安装

按照以前的习惯(主要是懒),使用$ sudo apt-get install nodejs npm进行安装,一切顺利。安装结束后,nodejs -v命令显示版本号为0.10.*,想到早上在windows下安装的版本已7.1.0,瞬间懵逼。遂卸载 $ sudo apt-get remove nodejs npm.

0x02 中途放弃的源码安装

尝试从https://github.com/nodejs/node上clone时发现仓库远比我想象的要大,出于能简单绝不麻烦的考虑,放弃该方案。

0x03 使用二进制包

从官方https://nodejs.org/en/download/下载Linux下的二进制安装包。此处我下载的是Current版,版本号v7.1.0,下载并解压:

$ wget https://nodejs.org/dist/v7.1.0/node-v7.1.0-linux-x64.tar.xz
$ xz -d node-v7.1.0-linux-x64.tar.xz
$ tar xvf node-v7.1.0-linux-x64.tar

进入解压后的目录,查看结构:
node0
将对应目录拷贝至根目录下:
$ sudo cp -r ./bin/* /bin/
$ sudo cp -r ./include/* /include/
$ sudo cp -r ./lib/* /lib/
$ sudo mkdir /share
$ sudo cp -r ./share/* /share/

执行node -v,可以正常显示版本号,安装基本完成。

0x04 npm问题

若安装输入npm命令报错:
node3
可能是由于复制bin目录时未使用-r参数,导致npm的符号链接丢失:
node4
解决方案:使用cp -r命令重新复制或手动建立符号链接
$ sudo rm /bin/npm
$ sudo ln -s /lib/node_modules/npm/bin/npm-cli.js /bin/npm
node5

0x05 安装Express生成器并生成应用程序

$ sudo npm install express-generator -g
$ express myapp
$ cd myapp && npm install
$ DEBUG=myapp:* npm start

浏览器访问http://ip:3000,出现欢迎页面即安装成功;
若未出现请检查防火墙

0x06 持续运行

使用$ DEBUG=myapp:* npm start 命令是在终端中持续运行,若终端关闭则服务器同时也被关闭,有三种解决方案:

(1) nohup
$ nohup npm start > log.log &
优点:简单快捷
缺点:关闭时需要使用ps查看进程号后使用kill命令;崩溃后无法重启

(2) screen
在screen中执行$ DEBUG=myapp:* npm start
优点:可以ctrl -c终止,同时也可以关闭终端后持续运行,适用于开发阶段随时开启关闭服务器
缺点:崩溃后无法重启

(3)forever
安装$ sudo npm install forever -g
运行$ forever start app.js
关闭$ forever stop app.js

0x07 配置nginx反向代理

略~~

Apache虚拟主机设置域名泛解析

1、泛解析支持
<VirtualHost *:80> 
ServerName      blog.flagplus.net
ServerAlias     *.blog.flagplus.net

#其余配置略
</VirtualHost>

2、同一虚拟主机多域名支持:
<VirtualHost *:80>
ServerName      blog.flagplus.net
ServerAlias     www2.flagplus.net

#其余配置略
</VirtualHost>

Laravel 5 默认使用类/方法路由

在使用绝大部分框架时,路由默认行为为访问http://xxx.com/controller_name/function_name时自动路由至Controller_nameController.php控制器下的function_name方法(Yii2 中为actionFunction_name方法),在laravel中默认并不支持这么做并认为这是一个不好的习惯。
如果执意需要此功能,可通过修改路由实现。

修改路由文件rootpath/routers/web.php,在文件最后增加以下内容:

Route::get('{model}/{func}', function ($model,$func) {
$className = 'App\Http\Controllers\\'.ucfirst($model).'Controller';
$obj = new $className;
return $obj->$func();
});
Route::get('{model}', function ($model) {
$className = 'App\Http\Controllers\\'.ucfirst($model).'Controller';
$obj = new $className;
return $obj->index();
});

参考:
https://doc.laravel-china.org/docs/5.1/routing

Debian 8 testing 安装 WPS

虽然说在Windows下的时候几乎没用过WPS,但在近期将工作平台转移到Debian后,还是觉得应该把WPS装上比较放心。在使用Debian 7的时候可以开混合架构,开启后装一大堆32位依赖就可以直接解压运行了,比较简单;这次看到新版的竟然原生有64位版本,甚是激动,赶紧下载安装!

继续阅读

使用对象存储加速网站访问

起因:国内主机的带宽实在是太贵了,买不起。。。被迫在项目上线之前就启用图片cdn。走了大概一周的弯路,发现其实用起来远比想象中来的简单。

程序端的思路:

考虑到以最小的代价改动原有程序,并能够提供一个开关来方便切换cdn服务商或者关闭cdn服务,故不考虑修改数据库中现有数据。
原有的图片以相对路径存储在数据库中(形如”images/1.jpg” “upload/20160815/100000.jpg”),输出时只要在记录前拼接cdn地址即可;
项目中使用了ueditor富文本编辑器(稍作修改使上传目录为/upload文件夹下),观察发现其图片url均为”./upload“开头,故替换”./“为cdn地址;
当不再使用cdn服务时,将cdn地址写成服务器主域名即可完成禁用。

由于这类对象存储服务都提供了无缝迁移功能(腾讯云中称之为”回源设置“,七牛中称为”镜像源“),即对象存储服务器中若不存在当前文件,则自动从用户设定的源地址获取,使得无需手动处理上传逻辑。

参考代码:(原始代码在公司,以下代码为在家写博客时凭回忆手写,并未调试,可能存在某些小错误;以说明思路为主)

class Zcdn
{
$cdn_host = '';
public function __construct()
{
//可以从配置文件中读取或手动修改此处配置;将此处修改为主域名以达到不使用cdn服务的目的
$this->cdn_host = 'http://your.cdn.host'; 
}
public static function auto($url, $type='normal')
{
if($type == 'normal'){
return (new Zcdn())->cdn_host.$url;
}elseif($type == 'ue'){
return str_replace("./", (new Zcdn())->cdn_host, $url);
}
}
}

调用:

//图片或者其他静态资源
Zcdn::auto($item['url_from_db']);
//使用ueditor富文本编辑器时保存在数据库中的记录
Zcdn::auto($item['ue_text_from_db'],'ue');