分类 技术学习 下的文章

Ubuntu 添加 swap 分区

前段时间上车了腾讯云 360 买三年多的学生机的活动,加上降配总共获得 6 年,然而内存降到 1G 后,跑个 mysql 时间长了内存都不够。而且腾讯云的 ubuntu 不知道什么原因 1G 内存实际只有 800+M,更加雪上加霜。

终于前两天服务器由于内存爆了而又没有开 swap 崩了,几乎死机状态,ssh 都连不上,控制台强制重启才恢复正常。为了防止再次出现这种情况,我就给服务器加了个 swap。

参考文档:https://askubuntu.com/questions/33697/how-do-i-add-a-swap-partition-after-system-installation/796997#796997

具体步骤和命令如下:

# 创建一个空文件,具体大小的话对于小内存机器建议为内存的两倍 (例子中 1K * 4M = 4 GiB).
sudo mkdir -v /var/cache/swap
cd /var/cache/swap
sudo dd if=/dev/zero of=swapfile bs=1K count=4M
sudo chmod 600 swapfile

# 将新建的文件转换为 swap 文件.
sudo mkswap swapfile

# 开启 swap.

sudo swapon swapfile

# 通过 swapon 或者 top 命令进行验证:
swapon -s
# 或者
top -bn1 | grep -i swap
# 会显示类似信息: KiB Swap:  4194300 total,  4194300 free

# 禁用 swap 时可以使用 sudo swapoff swapfile.

# 将该分区设置成开机加载.
echo "/var/cache/swap/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab

# 测试开机加载:
sudo swapoff swapfile
sudo swapon -va

利用 Docker 搭建 PHP 开发及生产环境

Docker 现在是越来越火了,它的出现让很多开发和运维的痛点得到了解决:

  • 大多数公司配备的开发机是 Windows,在 Windows 上配置开发和本地测试环境是非常无解的,常规虚拟机使用十分麻烦并且无法协作,Win10 的 WSL 目前看来只能当作玩具。
  • 多台开发机或者多人的开发团队的开发环境的同步问题,Vagrant 在一定程度上可以解决开发环境的问题,不过在团队协作方面还是 Docker 这种轻量级的方案更灵活快速,更重要的是 Vagrant 目前来看并不适合用于生产环境,而 Docker 则都能 hold 住,真的是一次配置,到处运行。
  • 开发完成项目进行上线后出现因环境不同而产生的问题,此时可能运维会背锅,不过其实在传统的模式下要想保障开发生产环境的一致需要开发和运维的密切配合,但由于处在两个体系下,往往难以避免地会出现问题,所以之前 DevOps 也很火。而有了 Docker 之后这个问题就很容易解决了,开发交付的时候给出的就是容器,运维只要负责把容器上线就行了,不用关心具体环境。
  • 安装各种应用时配置十分繁琐,编译安装时可能还需要解决依赖问题,第一次安装一个大型应用可能整个一套搞下来一天就过去了,甚至对主机造成一些不可逆的影响。现在大多数常见应用都提供官方 Docker 镜像了,只要 pull 下来改改环境变量,立马就能跑起来,节省了大量时间,也不用担心搞坏主机。

每个人对环境的需求可能都或多或少有些区别,如果简单使用的话推荐 laradock,可以说是 Docker 化的 homestead,对 Docker 有一定了解之后就可以根据自己的需求自己构建一套环境。

最后开源我自己常用的一套开发环境,后面准备把搭建博客的环境也改成用这套环境来搭建:https://github.com/takashiki/docker-env

参考文档:

徒手用 Docker 构建自己的 PHP 开发环境

Windows 10 开启 Bash On Ubuntu记录

2018.02.04 更新

这周折腾了半天准备用 WSL (Windows Subsystem for Linux) 搭个开发环境,结果发现这个玩意儿虽然出来一段时间了,但是坑还是真的多。

首先是没有支持 TCP_INFO socket option,参考 php-fpm启动提示Protocol not available (92)该怎么解决呢?,这导致了 php-fpm 监听端口时,日志里会一直打印错误,但是能用,很神奇,而如果 listen 的是 socket 的话,则功能不正常,一直超时。

我发现的还有,如果 mysql 的 data 目录不是放在 WSL 自身硬盘路径内,而是放到 D 盘或者其他外部目录的话,虽然能新建数据库,但是建表有问题。

其他比如不支持升级发行版之类的必然的问题就不多说了,还有就是新版的 Win10 WSL 的安装路径是 C:\Users\<username>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState

所以从亲身的惨痛经历来看,建议还是不要妄想在 Windows 上用虚拟化以外的方案搭建开发环境。

===

步骤记录如下:

1.设置 -> 更新和安全 -> 针对开发人员,选择开启开发人员模式,这一步可能需要重启。

2.控制面板 -> 程序 -> 启用或关闭windows功能,选中 “适用于 Linux 的 Windows 子系统(Beta)”,然后重启。

3.打开 cmd 或者 PowerShell,点击左上角进入设置,在 ‘选项’ 面板中将 “使用旧版控制台” 取消选中,然后重启命令行。

4.在命令行中键入 ‘bash’,然后系统就会让你下载系统文件,选择 ‘y’ 之后就等待下载安装完成吧。

几个注意点:

1.不翻墙的话下载速度很慢,反正电信不翻墙是几乎下载不了的。
2.这个子系统的根目录默认在 %userprofile%\AppData\Local\Lxss\rootfs,这个略坑。

使用xshellputty等ssh终端连接本地bash方式:

1.卸载并重新安装 openssh-server:

sudo apt-get remove --purge openssh-server
sudo apt-get install openssh-server

2.在/etc/ssh/sshd_config中添加或将原有的配置项的值修改为如下:

ListenAddress 0.0.0.0
UsePrivilegeSeparation no
PasswordAuthentication yes

3.运行service ssh --full-restart即可

使用 LaraDock 搭建 Laravel 的 Docker 开发环境

参考链接:基于 LaraDock 在 Docker 中快速构建 Laravel 应用系列教程 —— 搭建开发环境

基本参考上文的步骤即可,不过有如下注意点:

  • LaraDock 现在只支持原生 Docker, Docker Toolbox 这种基于虚拟机的方案需要使用比较老的版本
  • 如果是在 Windows 上使用的话,LaraDock 的 .env 文件 中需要配置 COMPOSE_PATH_SEPARATOR=;COMPOSE_FILE=docker-compose.yml;docker-compose.dev.yml,因为这个分隔符在 Windows 中不支持使用 :
  • 千万不要用 DaoCloud 的加速器,其他加速器貌似也不行,用了这个之后 docker pull laradock/workspace 一直失败,这个包会循环下载直到提示 no space left on device,一开始我以为是 Windows Docker 或者配置的问题,顺着这个方向去查解决方案,查了好久都没头绪,后来把加速器去掉果然好了
  • 设置 proxy 时,格式为 http://host:port,如果 host 是在本机上的的话,需要写成 DockerNAT 那个网卡的 IP 地址,比如 10.0.75.1,另外这个 proxy 的配置也会被 docker 写入到容器中,具体见官网文档

腾讯云 COS webpack 插件开源

今天想把一个老的 Yii2 项目改成比较时髦的前后端分离的开发模式,于是试用了 webpack,感觉还不错。

项目线上我是想直接把编译后的文件传到带 cdn 的对象存储上,因为服务器用的是腾讯云的 cvm,所以对象存储就顺便选择了 cos。

Github 上搜了下没有现成的 webpack 插件,不过有几个现成的七牛的,比较了一下发现 https://github.com/lyfeyaj/qn-webpack 这个项目的代码最简洁清晰,于是就在这个项目的基础上自己改出了一个 cos 的 webpack 插件并开源了出来:https://github.com/takashiki/cos-webpack

npm 发布包的步骤参考:手把手教你用npm发布一个包

下面是该插件的安装和使用方式:

前提

需要 Node 版本在 v4.0 以上,COS V4 以上(APPID 为 125 开头)

安装

npm i -D cos-webpack

使用方法

支持的配置项:

  • secretId COS SecretId
  • secretKey COS SecretKey
  • bucket COS 存储对象名称,格式为对象名称加应用 ID,如:bucket-1250000000
  • region COS 存储地域,参见官方文档
  • path 存储路径, 默认为 [hash],也可以指定 hash 长度,如: [hash:8]
  • exclude 可选,排除特定文件,正则表达式,如: /index\.html$/
  • include 可选,指定要上传的文件,正则表达式,如: /app\.js$/
  • batch 可选,批量上传文件并发数,默认 20

注: Webpack 的 output.publicPath 要指向 COS(或自定义的)域名地址

// 引入
const CosPlugin = require('cos-webpack');

// 配置 Plugin
const cosPlugin = new CosPlugin({
  secretId: 'my-secret-id',
  secretKey: 'my-secret-key',
  bucket: 'my-125000000',
  region: 'ap-chengdu',
  path: '[hash]/'
});

// Webpack 的配置
module.exports = {
 output: {
    // 此处为 COS 访问域名(bucket-1250000000.file.myqcloud.com) 加上 path([hash]/)
    publicPath: "http://bucket-1250000000.file.myqcloud.com/[hash]/"
    // ...
 },
 plugins: [
   cosPlugin
   // ...
 ]
 // ...
}