楼赛是实验楼新上线的项目挑战。不同于侧重算法的 OJ、ACM一类的,楼赛考验的是动手能力,分析和解决问题的能力。这些正是实验楼的动手实践学IT理念所推崇的。
作为实验楼第一次常规周赛,本次三道题目有很多同学询问标准答案,因此制作了题目解析文档,希望对大家有所帮助。答案并不一定是最优的方案,欢迎大家贴出。
比赛结束后,仍然可以挑战,但成绩不再计入排行榜,如果你还没试过,先去挑战下再来看解析会更有收获!
正在进行的比赛:
第1期 楼赛的主题是 Linux,涉及 Linux 用户管理、sudo 权限设置、MySQL 及 nginx 排错等知识点。题目难度不大,有过 Linux 运维经验的都可以快速完成。
题目1:为新同事创建系统账户
本题目中需要在桌面环境中创建用户,并满足一系列条件:用户名:lousai
Home 目录:/home/lousai
允许 lousai 使用 SSH 登陆系统
lousai 用户默认使用 zsh
lousai 用户需要 sudo 权限
其中1,2,4 三个要求只需要一个 adduser 命令就可以完成:
sudo adduser --home /home/lousai --shell /usr/bin/zsh lousai
由于实验楼环境的配置,新创建的用户只要有密码,默认是允许通过 SSH 登录的,所以需求 3 不需要做任何事情。
最后需求 5 需要 sudo 权限,可以直接将新用户加入到 sudo 组:
sudo usermod -aG sudo lousai
至此,五个需求都已经完成,提交结果让实验楼的系统帮你测试下吧。
题目2:数据库无法启动
在这道题目中有三个坑:MySQL 服务无法启动 - bind address 配置错误
MySQL 服务无法启动 - /var/run/mysqld 权限配置错误
MySQL root 密码忘记
前两个坑都可以在尝试 sudo service mysql start 命令后查看 /var/log/mysql/error.log 报错日志发现。
坑1相关的报错日志:
修复的方法是把 /etc/mysql/my.cnf 配置文件中的 bind-address 改为 127.0.0.1 监听到本地就可以了。
坑2相关的报错日志:
Permission denied 的错误显示出来我们就需要去看下是哪个目录是没有权限,第二句日志中表示无法创建 /var/run/mysqld/mysqld.sock,去查看 /var/run/msyqld 发现默认的所有者是 shiyanlou 用户,这就是问题所在了。修复方法:
sudo chown mysql:msyql /var/run/mysqld
最后坑3则是很常规的重制 MySQL 密码了:
# 停止 mysql 服务
sudo service mysql stop
# 使用 mysql_safe 方式启动 mysql 服务
sudo mysqld_safe --skip-grant-tables&
然后使用 mysql 命令直接登录无需密码验证:
mysql -uroot mysql
登陆 mysql 后可以重新设置 root 的密码:
> UPDATE user SET password=PASSWORD("shiyanlou") WHERE user='root';
> FLUSH PRIVILEGES;
退出后使用 sudo service mysql restart 重新启动 mysql 服务,遍可以提交结果获得美丽的 PASS 标志了。
题目3:让实验楼网站恢复访问
这道题目中也包含三个坑:nginx 的配置文件格式错误
nginx 默认端口号被占用
nginx 配置中的站点目录错误
首先尝试启动 nginx 会发现报错,查看日志:
日志里就一句话,告诉了我们真相,在 /etc/nginx/sites-enabled/default 第36 行中有语法错误。修改这个文件在下面这行后面加上缺失的分号:
try_files $uri $uri/ =404;
坑1可以通过 nginx -t 检查配置文件语法的方式发现。
坑2可以在日志中发现原因:
当前 80 端口通过访问发现是 apache,把 apache 停止就可以了:
sudo service apache2 stop
最后一个坑题目中已经给出提示:实验楼网站页面目录为 /home/shiyanlou/page。
而配置文件中写的是 /home/shiyanlou/,更新文件中的这一行:
完成后重启 nginx:
sudo service nginx restart
再次打开浏览器访问 http://localhost 就能够看到我们实验楼熟悉的主页了。
如果你对以上解析有疑问,欢迎到楼赛第1期讨论贴参与讨论!
后记
实验楼的比赛模块还在试运营中,我们期待能创建一个真实体现参与者水平的竞赛模式。楼赛我们会尽可能保持每周1期,并且会为前10名颁发徽章及奖品。
楼赛第2期传送门:数据库项目挑战