分类目录归档:LAMP/LNMP

为yum安装的Nginx添加模块

Nginx一般都是编译安装,不过它本身也提供了通过yum安装的方式,比如在CentOS 6.5中需要添加的/etc/yum.repos.d/nginx.repo文件内容为:

之后就是常规的yum -y install nginx

通过这一方式安装的Nginx已经可以通过系统服务的方式进行启动,相当便捷,但是很多有趣的第三方插件并没有能够加入,比如header-more-nginx-module,Nginx目前看来不像Tengine是可以后期动态添加模块的,所以解决的方案出了编译安装似乎没有其他的方式了。

不过Nginx编译只生成一个二进制文件,那么,如果获取yum安装的Nginx编译参数,之后使用同一版本的源代码进行编译,之后替换生成文件就可以了。

通过nginx -V就可以看到编译参数(1.6.2):

在获取同版本的nginx源码,同时也获得所需模块的源码后,在获得编译参数中加入--add-module=/path/to/module/source

之后进行make即可。

编译完成之后先备份位于/usr/sbin/中的nginx文件,之后关闭nginx服务,替换文件,重启服务,一个添加了所需模块的nginx应该就能正常工作了。

MySQL Errno 28解决方案

昨天下午组里的同学跟我说数据库不能更改字段了,原本这台CentOS的机器工作很久都还还算正常,于是过去看了一下,发现MySQL在执行SQL之后报错,类似:

即提示错误码为28,告知用户无法创建表格。

错误码28第一反应就是磁盘空间不足,之后查看了df -hl查看了磁盘空间,发现MySQL所在的分区挂载的磁盘空间余量还有70%之多,之后查看是否是因为/tmp目录已满(即my.cnf中配置的tempdir)导致的,结果发现/tmp挂载的分区也有不少剩余空间,最后一想是不是有可能是inode已满导致的无法创建新文件的问题,使用df -i查看inode使用情况,发现inode使用已经达到了100%。

既然如此,那么整个事情也就明了了,磁盘空间已满不仅仅是物理空间上的已经使用完毕,也包括inode的使用情况,inode个数使用完毕之后,就不会有空间留给新文件用于记录文件信息了,自然也就不能创建文件了。关于inode,可以阅读阮一峰老师的《理解inode》这篇博文,清晰易懂。

解决问题的话,自然是要找到用尽inode的元凶,一般来说,小文件过多都是引起这个问题的主要原因。检查了这台数据库机器的进程,发现居然有有一套PHP在运行,查看了下php.ini之后,发现session的配置上,目录层级很深,运行了这么长的时间,session文件已经多到让人无语的程度,那么剩下的事情就好解决了,因为这台机器当前的服务不需要session的支持,直接干掉全部session文件即可。

小结一下,当MySQL出现28的错误码的时候,可以考虑:

  1. 检查磁盘空间
  2. 磁盘空间足够,检查临时目录空间大小
  3. 检查inode是否还有剩余

不得不说,这个事情并不是第一次看到,那么下次再出现磁盘无剩余空间,可以再看看是不是inode已满。

CentOS装机

最近想要做一些实验,无奈自己手头上没有富余的机器,看到好几个同事都自带电脑,没有用公司发的台式机,于是打算用这些台式机来做做实验。

公司本身是有完整的LAMP/LNMP环境安装包的,但是基于一些原因是不能使用的,整套环境只能自行安装,综合了一下决定安装如下软件:

  • CentOS 6.5 64位(可以考虑使用 北理工 的源,速度很快)
  • Nginx 1.2.7
  • PHP 5.4

装机其实是一个很无聊的过程,然而每次都能出现新的状况,真是让人抓狂,写过好几次这样的笔记,但是这次却又遇到了各种情况。

CentOS

启动项问题

安装CentOS已经变得极为简便,由于安装的是公司的台式机,直接用UltraISO或者直接用dd将镜像写入U盘,再通过GUI完成安装即可(参考此处),不过这次用U盘安装倒是出了个不大不小的问题,即安装之后只要拔掉U盘就无法启动。

这个问题首先感觉应该是引导项写入的问题,前期安装的时候一阵无脑的下一步点选,没有注意到写入的设备居然是U盘,而且这台机器U盘被识别成了/dev/sda,并不是意想中的/dev/sdb,那么单纯把启动项写入/dev/sdb,也就是实际的机器磁盘之后仍然是不能启动的,因为启动之后机器硬盘就被识别为/dev/sda了……

关键地方在于设定写入的磁盘的时候,点击更改设备按钮(如果你用的是中文安装环境的话),同时还要设定BIOS驱动器顺序这一项目(这里是一个折叠的选项),将驱动器设定为机器磁盘,比如安装的时候U盘是/dev/sda,那么这个项目就要设定为/dev/sdb,这样之后的安装才能正确的完成,机器才会能够启动。

远程桌面

作为Server来说是不需要GUI界面的,但是首先来说,为了方便实验,同时后期可能会安装Oracle数据库,那么一个图形界面还是很需要的,安装的时候可以选择Basic Server,同时自行设定软件界面,在桌面选项卡中选择上需要的桌面软件,我自己是勾选了KDE以外的所有项目。

GUI界面虽好,但是好几台机器放在脚下,每台机器再接一个显示器,还得有键鼠等设备,我的桌面肯定是放不下了。这时候就需要用上远程桌面了。

因为是做实验,选择了一个自己觉得简单易用的远程桌面软件TigerVNC

安装上来说非常容易,使用yum就可以:

这个软件的配置文件也是很简单,编辑/etc/sysconfig/vncservers,设定一下即可

简单来说就是设定第1个可登陆用户为root,同时设定分辨率为1024X768。

之后su到root下,通过vncpasswd设定登录所需的密码,之后通过客户端连接的时候需要通过这个密码登录,之后通过vncserver启动服务,这个软件也把自己注册成了服务,可以考虑使用service启动。

连接的时候需要使用端口,这里比较有意思的是这个软件监听的端口与你设定的用户编号有关,也就是用户1是5901,用户2是5902.

连接的客户端可以考虑直接使用Chrome的VNC Viewer扩展

VNC Viewer

再也不用在桌面上摆上一堆显示器键鼠什么的了。

VNC Viewer connected

PHP

PHP真是没太多麻烦的地方,然后在装libmemcached的时候发现1.0.18版本的libmemcached依然没法在我的CentOS 6.5的机器上成功的安装,没想到上次在Ubuntu上配环境遇到的问题在又遇到了一次,老办法,换1.0.16版本解决问题。

其他

测试的机器使用路由器串联起来的,只需要在路由器上使用一个简单的端口转发配置(家用路由器应该都有),将制定的端口请求绑定到各台路由器已连接的机器上即可。

端口转发

SSH的话需要多监听一个端口,CentOS的话修改/etc/ssh/sshd_config,解除对Port 22这一行的注释,同时加上想要监听的端口即可,即增加一行Port your-port,之后重启sshd服务。

同时配置上一条端口转发规则即可,之后用

即可。即所有的请求都发向路由器IP就好。

MySQL的简单使用笔记:增加实例以及启动

MySQL的简单使用笔记:增加实例以及启动

增加实例

增加实例这里指的的在源码编译安装完MySQL之后建立一个初始的数据库实例,占用某一端口,或者是使用新端口启动新的mysqld进程。

MySQL需要一些基础的数据库以及表来完成基本的设定,比如控制连接的mysql.user表:

在编译完成MySQL之后这些表是不存在的,需要通过安装目录下的script/mysql_install_db完成基础表的安装工作。

在这个脚本中完成安装工作所需要的参数至少需要如下几个:

  • basedir MySQL的安装目录
  • datadir MySQL实例的数据文件目录,比如数据库文件、socket文件等
  • user 安装MySQL时的设定的用户名

通过执行这一脚本,例如:

即完成了对MySQL的初始化操作,即完成了一个数据文件位于/usr/local/mysql/mysql_data/ 的数据库实例,通过使用不同的端口和目录,完成新增一个数据实例的工作。

启动

启动MySQL可以通过MySQL安装完成的mysqld_safe工具完成。

mysqld_safe脚本是推荐的启动MySQL的方式,其中特点是增加了一些安全保证的机制比如遇到错误重启并且写入日志(参数中的log-error指定位置)。

比较重要的个人认为是:

  • default-file 默认配置文件位置,如果使用这个参数,会通过默认文件获取配置,需要注意的是,如果需要使用,这个参数必须要放在第一个参数才能生效
  • basedir MySQL安装目录
  • datadir MySQL数据库的数据目录
  • user MySQL安装时配置的用户
  • pid-file pid文件位置
  • port 监听端口
  • socket 响应本地MySQL连接请求的socket文件位置

所有的参数事实上都会传送给mysqld,如果在配置文件(假设是/usr/local/mysql/my.cnf)中指明了MySQL的一切,则只需要使用简单的一句:

即可启动,同时也可以在参数中补齐缺失的项目。

后期计划整出一份MySQL启动所需最小配置参数列表。

其他

新增的数据库实例以及忘记密码的情况下需要通过mysqladmin工具完成密码的设定,需要指定数据库的数据socket连接文件位置以及用户名以及新的密码,例如:

还可以带上主机名:

以上。

Vhost中目录不存在引起Apache不能启动

Vhost中目录不存在引起Apache不能启动

环境配置始终是工作过程中一个最为折腾人的环节,为了解决这个问题,最后写了个简单地装机脚本给大家使用。

环境配置包括软件的安装和设置的更改,一套LAMP每个组成部分设置都以百计,功能的强大的同时如果对每个部分的了解程度不足尤其容易出现一些看似很难以解决的问题,往往这些问题解决之后都会让人觉得沮丧不已。

今天配置环境出现了一个问题,就是只要在httpd.conf中添加了包含vhost设置的语句之后,Apache使用

apachectl -k gracecful

等方式启动时总会提示

httpd not running, trying to start

让人沮丧的是这种错误并没有打印error_log,同时使用语法检查也不能发现有任何错误,在逐句注释掉vhost中的设置语句之后,发现当注释掉所有提及的主机路径之后,居然可以重新启动了,于是检查发现这些目录都在主机上不存在,添加目录之后Apache能正常启动了。

尝试出来的结果,后面打算去找找更为具体的原因。