我的博客目前迁移到reetsee.com了,目前在google、360、bing等搜索引擎直接搜索『吹水小镇』就可以了,以后文章优先更新到吹水小镇的博客部分。
注意:要获得更好的浏览效果包括代码、图片、字体,请查看原文:从零搭建LNMP环境。这个链接即便你用手机打开也是排版很漂亮的。
转载请注明: 吹水小镇 | reetsee.com
原文链接地址: 从零搭建LNMP环境
画外音——或许这篇文章叫「搭建LNMP教程」会更好?「LNMP」即Linux,Nginx,MySQL,PHP。我个人的理解是:
yum -y install gcc automake autoconf libtool make gcc-c++ glibc对于使用Ubuntu的用户, 如果没记错则是将「yum -y install」替换为「sudo apt-get install」就可以了,原则就是把上面列出来的「gcc automake autoconf libtool make gcc-c++ glibc」这几个东西安装一下。
yum -y install libmcrypt-devel mhash-devel libxslt-devel \ libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel \ zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel \ ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \ krb5 krb5-devel libidn libidn-devel openssl openssl-develUbuntu 12.04(其它版本我没有测试过)用户在这里可以先不行动,因为我试过即便在这里使用「sudo apt-get install ...」,后面在编译PHP的时候还是会提示找不到对应的库,原因可能是编译时的默认查找路径不正确。解决办法从理论上来说有2个:
wget http://cn2.php.net/get/php-5.4.29.tar.gz/from/this/mirror下载的场面大概是这样的: 下载后执行解压操作,并切换到PHP的代码目录:
tar zxvf php-5.4.29.tar.gz cd php-5.4.29执行以下命令对PHP的安装进行设置:
./configure --prefix=/home/reetsee/environment/php --enable-fpm --with-mcrypt \ --enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath \ --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets \ --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex \ --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli \ --with-gd --with-jpeg-dir --with-openssl对上面的命令作一下简单的说明:
从总体来看就是设置安装的PHP需要或不需要哪些功能,安装目录是什么, 需要哪些库--prefix=/home/reetsee/environment/php :把PHP安装在「/home/reetsee/environment/php」目录下--enable-fpm :为了让Nginx和PHP能够互相「交谈」,需要一个叫做 FastCGI的工具,因此PHP需要使用 PHP-FPM来管理FastCGI。--with-openssl :安装OpenSSL库其它的「--with-xxx」即需要xxx库,「--enable-yyy」即开启yyy的支持,「--disable-zzz」即禁用zzz。在这一步, Ubuntu或者CentOS的用户十有八九会出现类似 「configure: error: mcrypt.h not found. Please reinstall libmcrypt.」的问题,这是因为缺少了mcrypt这个库(对于Ubuntu用户缺少的可能是其它库),那么接下来就把它下载并安装。 下载并安装缺失的库——以mcrypt为例:在搜索引擎得知 mcrypt的官网,进入 源码下载的页面,复制「 libmcrypt-2.5.7.tar.gz」的 下载地址,切换到目录「/home/reetsee/download/」执行下载并安装的操作:
wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gz tar zxvf libmcrypt-2.5.7.tar.gz cd libmcrypt-2.5.7 ./configure --prefix=/home/reetsee/environment/lib/mcrypt make && make install这样就把mcrypt安装到「 /home/reetsee/environment/lib/mcrypt」下了。在PHP的源码目录进行「./configure ...」时,将原本的「--with-mcrypt」更改为「--with-mcrypt= /home/reetsee/environment/lib/mcrypt」,粗体部分就是你安装mcrypt的目录。 ———— mcrypt安装结束 ————回到PHP源码的目录重新 configure,这次输入的命令要将mcrypt的安装路径添加进去,具体命令变为:
./configure --prefix=/home/reetsee/environment/php --enable-fpm --with-mcrypt=/home/reetsee/environment/lib/mcrypt \ --enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath \ --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets \ --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex \ --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli \ --with-gd --with-jpeg-dir --with-openssl最后配置成功会出现「 Thank you for using PHP.」,如下图: 如果你是用Ubuntu,会遇到很多编译依赖问题,例如上面的mcrypt的缺失,可以参考这篇博客: http://www.cnblogs.com/alexqdh/archive/2012/11/20/2776017.html,博主碰到的问题与原本我碰到的问题几乎一模一样。配置完就输入以下命令进行安装:
make && make install安装需要一段时间,可以喝杯茶~安装完后还有一点收尾工作,首先是配置php-fpm,首先是切换到php的安装目录下的etc文件夹:
cd /home/reetsee/environment/php/etc/然后执行下面的命令:
cp php-fpm.conf.default php-fpm.conf再对php-fpm.conf的内容进行修改,将「 user = nobody」,「 group = nobody」分别改为「 user = www-data」,「 group = www-data」,即如下图所示: 保存后需要保证名为「www-data」的用户以及组存在,因此在命令行执行下列语句:
groupadd www-data useradd -g www-data www-data这样PHP的安装配置工作就大体完成了 :-D 。不放心的可以编写一个简单的php脚本来测试一下有没有输出:
<?php /** /home/reetsee/tmp/phpinfo.php **/ echo phpinfo(); ?>然后执行:
/home/reetsee/environment/php/bin/php phpinfo.php如果看到PHP有关的信息,起码说明PHP本身的安装成功了。但是还有一些手尾要做:
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.34.tar.gz tar zxvf pcre-8.34.tar.gz下载并解压zlib:
wget http://zlib.net/zlib-1.2.8.tar.gz tar zxvf zlib-1.2.8.tar.gz下载并解压openssl:
wget http://www.openssl.org/source/openssl-1.0.1g.tar.gz tar zxvf openssl-1.0.1g.tar.gz好了,必要的库已经下载好,现在就正式开始下载Nginx并安装。首先下载Nginx并解压缩:
wget http://nginx.org/download/nginx-1.4.2.tar.gz tar zxvf nginx-1.4.2.tar.gz切换到Nginx的源码目录 「 /home/reetsee/download/nginx-1.4.2」进行安装前的配置,根据你pcre、zlib、openssl所在的源码目录以及Nginx的最终安装路径,输入配置命令,我的配置命令如下:
./configure --prefix=/home/reetsee/environment/nginx \ --with-http_ssl_module \ --with-pcre=/home/reetsee/download/pcre-8.34 \ --with-zlib=/home/reetsee/download/zlib-1.2.8 \ --with-openssl=/home/reetsee/download/openssl-1.0.1g这里附上一个配置说明列表(参考自 http://www.nginx.cn/install):
--prefix=path 定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录。默认使用 /usr/local/nginx。--sbin-path=path 设置nginx的可执行文件的路径,默认为 prefix/sbin/nginx.--conf-path=path 设置在nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf.--pid-path=path 设置nginx.pid文件,将存储的主进程的进程号。安装完成后,可以随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认情况下,文件名 为prefix/logs/nginx.pid.--error-log-path=path 设置主错误,警告,和诊断文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默认情况下,文件名 为prefix/logs/error.log.--http-log-path=path 设置主请求的HTTP服务器的日志文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默认情况下,文件名 为prefix/logs/access.log.--user=name 设置nginx工作进程的用户。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的用户名是nobody。--group=name 设置nginx工作进程的用户组。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的为非特权用户。--with-select_module --without-select_module 启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。--with-poll_module --without-poll_module 启用或禁用构建一个模块来允许服务器使用poll()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。--without-http_gzip_module — 不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。--without-http_rewrite_module 不编译重写模块。编译并运行此模块需要PCRE库支持。--without-http_proxy_module — 不编译http_proxy模块。--with-http_ssl_module — 使用https协议模块。默认情况下,该模块没有被构建。建立并运行此模块的OpenSSL库是必需的。--with-pcre=path — 设置PCRE库的源码路径。PCRE库的源码(版本4.4 - 8.30)需要从PCRE网站下载并解压。其余的工作是Nginx的./ configure和make来完成。正则表达式使用在location指令和 ngx_http_rewrite_module 模块中。--with-pcre-jit —编译PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。--with-zlib=path —设置的zlib库的源码路径。要下载从 zlib(版本1.1.3 - 1.2.5)的并解压。其余的工作是Nginx的./ configure和make完成。ngx_http_gzip_module模块需要使用zlib 。--with-cc-opt=parameters — 设置额外的参数将被添加到CFLAGS变量。例如,当你在FreeBSD上使用PCRE库时需要使用:--with-cc-opt="-I /usr/local/include。.如需要需要增加 select()支持的文件数量:--with-cc-opt="-D FD_SETSIZE=2048".--with-ld-opt=parameters —设置附加的参数,将用于在链接期间。例如,当在FreeBSD下使用该系统的PCRE库,应指定:--with-ld-opt="-L /usr/local/lib".执行configure成功后进行安装:
make && make install要验证Nginx是否安装成功了,可以切换到Nginx的安装目录(我的是「 /home/reetsee/environment/nginx」),然后启动Nginx:
./sbin/nginx然后你在浏览器中访问你的机器的IP地址(有公网IP的可以访问公网IP,没有的可以打开CentOS的浏览器然后访问「127.0.0.1」),是不是就看到很漂亮的「 Welcome to nginx!」了?如果你访问时出现「403 Forbidden」,那么极其有可能你的nginx下的html所在的绝对路径中的某些文件夹的权限没有 r或者 x,你是否将Nginx安装到你的个人文件夹下了?例如你的用户名叫「abc」,然后你安装到了「/home/abc」下的子目录中?如果是的话,那就是权限不够了,因为Nginx的worker进程默认用户为「nobody」。解决方法有3个:
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #}将第3~第7个「#」去掉,就是取消注释,同时 将「/scripts$fastcgi_script_name」改为「$document_root$fastcgi_script_name」,即变为下面这样:
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }使用vim的列操作可以很快去掉它们。在nginx的安装目录下,新增一个PHP文件「html/index.php」,文件内容如下:
<?php echo phpinfo(); ?>接下来就启动php-fpm以及重启nginx:
/home/reetsee/environment/php/sbin/php-fpm #启动php-fpm /home/reetsee/environment/nginx/sbin/nginx -s reload #重启nginx然后打开浏览器,访问一下「 机器ip/index.php」,例如「127.0.0.1/index.php」,如果你看到PHP的输出信息了~恭喜就成功啦~那么Nginx的安装完成了。效果图如下: 图中的蓝色框内如果出现了php.ini,就证明加载php.ini配置文件成功了。如果你失败了欢迎留言。另外是关于nginx.conf中的「127.0.0.1:9000」,这个其实是php-fpm的监听端口,是可以在php-fpm.conf中设置的。没有特殊需要使用默认即可。
yum -y install cmakeUbuntu可以尝试「sudo apt-get install cmake」。或者也可以直接到 cmake的官网下载源码后安装。下面输入命令添加名为「mysql」的用户和组,为后续步骤作准备:
groupadd mysql useradd -r -g mysql mysql解压下载好的MySQL:
tar zxvf mysql-5.5.38.tar.gz接下来就要使用cmake对MySQL进行安装选项的设置(之前安装的PHP、Nginx都是使用源码目录下的configure文件),安装选项可以参考 官方文档,同时这篇博客也有参考作用: http://www.blogjava.net/kelly859/archive/2012/09/04/387005.html。官方文档中列出的cmake选项,前面要加个D,例如「CMAKE_INSTALL_PREFIX」要变成「-DCMAKE_INSTALL_PREFIX」,参见下面我的cmake命令。进入MySQL的源码目录,我的cmake命令如下:
cmake \ -DCMAKE_INSTALL_PREFIX=/home/reetsee/environment/database/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DMYSQL_TCP_PORT=3306 \ -DMYSQL_UNIX_ADDR=/home/reetsee/environment/database/mysql/run/mysql.sock \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_SSL=yes以上各个选项的含义可以参看 官方文档。对于「-DDEFAULT_CHARSET=utf8」以及「-DDEFAULT_COLLATION=utf8_general_ci」,主要考虑绝大多数情况下utf8编码就能够显示绝大多数的字符了,设置成默认字符编码比较好,即便对于中文字符集的要求很高(例如各种生僻字、繁体字等),也可以在新建数据库表的时候显式地指定字符集为GBK。至于「-DMYSQL_UNIX_ADDR」这个选项,默认是等于「/tmp/mysql.sock」。设置完后安装MySQL:
make && make install安装需要一段时间,可以 喝杯茶~然后就开始数据库的初始化操作,首先切换目录到MySQL的安装目录:
cd /home/reetsee/environment/database/mysql/然后改变安装目录下所有文件的用户及组为「mysql」(这个用户在上面安装MySQL前已经在系统中添加好了,没有添加的可以拉到上面看一下):
chown -R mysql . chgrp -R mysql .初始化数据库:
./scripts/mysql_install_db --user=mysql --basedir=/home/reetsee/environment/database/mysql这个选项「--basedir」指定为你的MySQL安装目录。然后将目录的所有文件的所属用户改为「root」,接着将目录「data」的所属用户改为「mysql」(这一步很重要,否则数据库可能无法对这个目录进行操作):
chown -R root . chown -R mysql data将MySQL的配置文件拷贝到配置文件目录「/etc/」下,询问是否覆盖源文件输入「yes」即可:
cp support-files/my-medium.cnf /etc/my.cnf要对MySQL进行设置(例如日志文件路径,.pid文件的路径,mysql.sock文件路径等),可以编辑「/etc/my.cnf」。接下来很重要的一步,就是确认用户「mysql」拥有「mysql.sock」文件所在目录的所有控制权,「mysql.sock」所在目录可以查看「/etc/my.cnf」中的配置,如果在cmake时没有设置过那么就是「/tmp/」目录。我自己设置为 安装目录下的「run/」文件夹,因此要把这个文件夹的所属用户设置为「mysql」:
chown -R mysql ./run接下来就是最有标志性的一步,运行MySQL的守护进程:
bin/mysqld_safe --user=mysql &如果运行成功了,那么是不会出现类似这一行信息的「 mysqld_safe mysqld from pid file /home/reetsee/environment/database/mysql/data/reetsee.pid ended」。这个时候输入回车(Enter),应该不会出现任何信息,如果出来一个「 Done」之类的,那么十有八九失败了。查看一些错误日志看看是什么原因,错误日志的路径在你运行上面的命令时会看到的,我的是在「data/reetsee.err」,个人碰到过的问题主要包括以下两个:
第1个:[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist # 如果你正确设置了mysql_install_db时的「--basedir」选项,应该不会出现这个情况,如果没有设置,重新从运行mysql_install_db那里开始; 第2个:与mysql.sock有关的错误提示,具体是什么内容忘记了,不过你检查一下my.cnf中mysql.sock所在的目录的拥有着是否为「mysql」,不是则更改目录的用户。最后就是给MySQL数据库里的「root」账号一个密码:
./bin/mysqladmin -u root password '123abc'里面的「123abc」替换成你自己想要设置的密码即可。要注意的是这个MySQL的root不是指操作系统的root,而是指这个数据库管理系统的root,以后我们就可以使用这个账号对数据库进行添加用户、赋予权限等操作,所以一定要设置一个密码。至此,繁琐的MySQL安装就所剩无几了! Congratulations!最后还有几件事要做:
./bin/mysql -u root -p弹出提示时输入密码即可。进入后的界面应该类似这样: 在MySQL内创建一个叫做「hello」的账号,为它设置密码:在mysql中输入以下语句:
CREATE USER 'hello'@'localhost' IDENTIFIED BY '123456';在使用MySQL语句时,有个好习惯是对于命令的保留字使用全大写的形式,这样语句会更好的易读性。上面的「123456」是密码,替换成你自己的密码即可。在上面的「@localhost」是有经过一些考虑,目前对于我们来说,我们的MySQL和PHP部署的机器是一样的,因此PHP通过localhost就可以访问数据库。因此我们希望只有本地的连接可以访问数据库,来自其它IP或者域名的连接不能访问数据库,这样做的好处是即便你的密码泄露了,入侵者也无法直接通过网络来操作数据库,除非你的机器登陆密码被入侵者知道了,他才能够直接登陆到你的机器,然后通过localhost访问数据库。如果你将「@localhost」替换成「@127.0.0.1」,那么只有IP为127.0.0.1的连接才能够访问数据库。如果你不想对连接进行过滤,所有连接都能够访问到数据库,那么你上网查资料应该替换成什么吧,我不会告诉你的:)在MySQL内建立一个名为「hello_db」的数据库,然后让「hello」账号拥有对「hello_db」数据库的完全操作权限:首先是创建数据库「hello_db」:
CREATE DATABASE hello_db;然后是让「hello」账号拥有对「hello_db」数据库的完全操作权限:
GRANT ALL ON hello_db.* TO 'hello'@'localhost';上面的「ALL」即所有权限,「hello_db.*」即权限是针对hello_db下的所有表,「‘hello’@‘localhost’」即来自localhost的名为「hello」的用户。退出MySQL管理系统,使用「hello」账户进入MySQL管理系统中:先退出:
exit;然后以「hello」账号进入MySQL:
./bin/mysql -u hello -p输入密码后即可。在「hello_db」数据库中创建一张名为「hello_table」的表,在里面插入一条数据:使用「hello_db」数据库:
USE hello_db;建一张名为「hello_table」的表(下面普通的换行不会执行语句,MySQL在换行时检测到分号「;」才会执行语句):
CREATE TABLE `hello_table`( `id` INT(10) PRIMARY KEY NOT NULL AUTO_INCREMENT, `content` VARCHAR(256) DEFAULT 'Hello LNMP!' );注意!上面对于表名如「hello_table」,列名如「id」和「content」,它们使用的引号是反引号「 `」, 不是单引号。这样一张表就建立好了,通过命令「SHOW TABLES」就可以看到。然后就是往里面插入一条数据:
INSERT INTO `hello_table` (`id`, `content`) VALUES(1, 'Hello World! Hello LNMP!');出现 「 Query OK, 1 row affected」就证明成功了!编写一个简单的PHP文件,通过浏览器的访问将上面一步中插入的数据显示在网页上:切换到 Nginx安装目录下的「html」文件夹:
cd /home/reetsee/environment/nginx/html/新建一个名为「 lnmp.php」的文件,内容如下:
<?php $con = mysqli_connect('localhost:3306', 'hello', '123456', 'hello_db'); //检查连接是否出错 if (mysqli_connect_errno($con)) { echo 'Failed to connect to MySQL: ' . mysqli_connect_error() . "\n"; die("Connect to database failed.\n"); } //执行读取数据的语句 $query = 'SELECT `id`, `content` FROM `hello_table` WHERE `id`=1;'; $result = mysqli_query($con, $query); $row = mysqli_fetch_array($result, MYSQLI_ASSOC); //输出结果 echo $row['content']; //关闭连接 mysqli_close($con); ?>里面的用户名、密码等替换成自己的。没用过PHP的同学要留一下PHP中双引号和单引号的含义是不同的。注意上面在初始化连接是的端口号「 3306」不能少呀。保存后将这个文件的权限设置为755,即执行命令「 chmod 755 lnmp.php」。接下来就打开浏览器,访问一下「127.0.0.1/lnmp.php」,是不是就看到了万众期待的「 Hello World! Hello LNMP!」?效果如下: 如果你没有成功,那么欢迎在原文下留言(原文地址: http://blog.reetsee.com/archives/296),不过麻烦将情况描述得详细一点。我有空会尽快回复的。
好了,最后就祝大家身体健康,天天开心!
转载请注明: 吹水小镇 | reetsee.com
原文链接地址: 从零搭建LNMP环境