因为启动docker服务器需要root权限,所以连接到docker服务器需要输入sudo, 即便设置了sudo不需要输入密码, 还是需要输入sudo, 可以通过增加docker组的方式来避免输入sudo.

增加一个docker组

sudo groupadd docker

将用户test加入docker组,用户test需要重新登录才能生效

sudo gpasswd -a test docker

重启docker服务

sudo service docker restart

此后执行docker命令就不需要加上sudo

参考资料:

联系作者

准备慢慢的将香港VPS上的服务迁移到新的服务器,趁这个机会,学习使用Docker技术。首先安装MySQL

搜索MySQL镜像

使用docker search命令,docker search mysql

1
2
3
4
5
INDEX       NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io docker.io/mysql MySQL is a widely used, open-source relati... 3021 [OK]
docker.io docker.io/mysql/mysql-server Optimized MySQL Server Docker images. Crea... 194 [OK]
docker.io docker.io/centurylink/mysql Image containing mysql. Optimized to be li... 46 [OK]
docker.io docker.io/sameersbn/mysql 36 [OK]

下载MySQL镜像

使用docker pull命令,docker pull docker.io/mysql

启动MySQL镜像

使用docker run命令,执行docker run docker.io/mysql
提示

1
2
error: database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

参考How to connect to MySQL running on Docker from the host machine,执行docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d docker.io/mysql启动

访问MySQL容器

1
2
sudo docker exec -it mysql bash
mysql -uroot -ppassword

参考资料

联系作者

之前也设置过SSH登录,这次记下来吧。

生成公钥

使用ssh-keygen命令,例如执行ssh-keygen -t rsa即可

添加ssh key

在远程服务器的用户目录新建.ssh目录,新建authorized_keys文件,将本地上传的id_ras.pub里的内容添加到authorized_keys文件里。

这里需要注意.ssh和authorized_kesy权限,.ssh必须是700, 而authorized_keys文件只有文件拥有者有写权限。否则会提示Authentication refused: bad ownership or modes for file /home/dengsl/.ssh/authorized_keys错误。所以authorized_keys的权限设置必须为600, 640等等。

从阮一峰的博客里看到一条命令,但其实这条命令里存在错误,修改之后如下

1
ssh user@host 'mkdir -p .ssh && chmod 700 .ssh && touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

如果已经存在.ssh目录,可以执行

1
ssh user@host 'chmod 700 .ssh && touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

之后会提示输入密码,之后就可以不需要密码登录了。

禁止root用户登录

修改/etc/ssh/sshd_config文件,在#PermitRootLogin yes后面添加PermitRootLogin no即可。之后重启sshd服务service sshd restart使修改的配置生效

参考资料

联系作者

最近在DigitOcean买了VPS,又开始折腾主机。这次要记录下来。首先从新建用户开始。

新建用户

新增用户使用useradd命令,例如新增test用户,执行命令useradd test即可。新增用户后,要给用户设置密码,否则无法登录。

修改用户密码

设置密码使用passwd命令,例如给test用户设置密码,执行’passwd test’即可。

设置用户sudo不需要密码

每次安装软件都要切换到root用户比较麻烦,可以添加用户sudo时不需要密码。在/etc/sudoers文件里添加
test ALL=(ALL) NOPASSWD: ALL即可。

联系作者

最近服务时不时的会卡顿,不知道什么原因。下班之后突然想到速度慢,一般都出在数据库上。于是想到查看MySQL链接数,网上查到执行show processlist;即可。

在卡顿时,查询结果中发现以下可疑连接,如下

1
2
3
 Waiting for table level lock | UPDATE `sku` SET  `view_num` = `sku`.`view_num` + 1 WHER |         0 |             0 |         1 |

Waiting for table level lock | SELECT `sku`.`id`, `sku`.`name`, `sku`.`dosage_form`, `sku`.`specs`, `sku`.`factory`, `sku`.`categor | 0 | 0 | 1 |

在淘宝的MySQL资料MySQL 锁问题最佳实践里找到’table level lock’的原因,是因为MyISAM,引发table level lock wait。查看建表语句,果然是MyISAM引擎, 将它转成InnoDB即可解决问题。

上面使用show processlist命令显示不完全,可以加上full, 即执行show full processlist

参考Converting Tables from MyISAM to InnoDB, 执行ALTER TABLE table_name ENGINE=InnoDB;即可转换。

联系作者

在使用Supervisor监控Django项目时,在我的自己的站点设置里,没有加上stopasgroup=true选项,也就是关闭子进程,子进程也会退出。所以在公司的配置里,也没有加上这个选项。

后来发现,如果不加,在有请求时,gunicorn不会关闭子进程,此时子进程会变成孤儿进程,导致了资源占用率很高。在配置项里加上后,程序就正常了。所以建议都加上这个配置。

参考资料

联系作者

兼任运维后,爬虫这边的任务也要我处理了。发现之前的开发连日志都没有配置,纠错特别麻烦。查看Scrapy logging, 找到解决的办法,原来还是很简单的。

查看logging配置,发现只要配置LOG_FILE和LOG_FORMAT即可。

在settings中添加配置如下

1
2
LOG_FILE='logs/spider.log'
LOG_FORMAT= '%(levelname)s %(asctime)s [%(name)s:%(module)s:%(funcName)s:%(lineno)s] [%(exc_info)s] %(message)s'

其中LOG_FILE指定日志路径,而LOG_FORMAT指定日志格式。因为默认的LOG_FORMAT是没有输出日志的行数,所以这里增加了行数设置。

联系作者

某天,前端同事的Django项目无法启动,报you must set settings.allowed_hosts if debug is false错误,可是查看配置文件,明明设置debug=True, 不知为何。

找了好久,组长过来看了之后,发现是Cannot import name _uuid_generate_random错误,于是想到之前也遇到过这个问题,只是当时没有做笔记,所以印象不深。

按照cannot-import-name-uuid-generate-random-in-heroku-django, 升级Kombu到3.0.30,依然提示这个错误,
之后按照ImportError: cannot import name _uuid_generate_random的提示,升级celery, 执行pip install --upgrade celery,这次可以正常启动。

联系作者

最近测试服务器的数据库反复重启,产看日志, 提示

1
2
3
4
InnoDB: Log scan progressed past the checkpoint lsn 377750615222
InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
InnoDB: Database was not shut down normally!

之后无知的把ib_logfile1和ib_logfile2删掉,数据库依然反复重启。查看MySQL文件目录格式及存放位置才知道这两个文件还是有用的。

之后想到一个办法是重建数据库,也就是将SQL全部导出,之后再重新导入。在使用mysqldump导出数据时,老是提示mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table, 原因还是数据库重启了。

参考官网[forcing-innodb-recovery]
(https://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html), 在/etc/my.cnf里配置innodb_force_recovery=3, 将数据库的SQL成功导出。

修改/etc/my.cnf里的datadir,在新的目录里重启MySQL, 之后使用mysql导入数据,数据库终于正常。

使用mysqldump导出test这个数据库的命令

1
mysqldump -h 127.0.0.1 -u root -p123456 test > test.sql

而使用mysql命令行工具导入

1
mysql -h 127.0.0.1 -u root -p123456 test < test.sql

联系作者