从零搭建LNMP环境(二)

不放心的可以编写一个简单的php脚本来测试一下有没有输出:

1 <?php
2 /** /home/reetsee/tmp/phpinfo.php **/
3 echo phpinfo();
4 ?>

然后执行:

1 /home/reetsee/environment/php/bin/php phpinfo.php

如果看到PHP有关的信息,起码说明PHP本身的安装成功了。

但是还有一些手尾要做:

  1. 创建php.ini文件,这个文件是对php一些运行选项进行配置的文件,非常重要,以后肯定会用到。官方文档在这里:http://www.php.net/manual/zh/ini.php。方法是将PHP源码目录下的「php.ini-production」文件复制到PHP安装目录下的「lib/」文件夹,并且重命名为「php.ini」。在我的机器上,输入命令「cp   /home/reetsee/download/php-5.4.29/php.ini-production   /home/reetsee/environment/php/lib/php.ini」即可完成。
  2. 设置php-fpm.pid的路径,这个文件记录了php-fpm的进程id,以后你要重启php-fpm时可以通过命令(假设你在PHP的安装目录下)「kill -USR2 `cat var/run/php-fpm.pid`」。注意那两个引号是反引号「`」,不是单引号或者双引号。具体的做法是编辑PHP安装目录下的「etc/php-fpm.conf」文件,找到「pid = 」这一行,将前面的分号「;」去掉。如下图所示:

php-fpm-conf-pid

 

至此就大功告成了。在下面安装完Nginx后,会启动php-fpm,到时候在PHP安装目录下就能看到 「var/run/php-fpm.pid」文件了。

4 安装Nginx

安装Nginx前也有一些库需要下载,分别是pcre,zlib以及openssl 。这里要说明的是下载这3个库的压缩包后,对其进行解压缩即可,无需安装。openssl要下载是因为Nginx在安装时需要的是openssl的源码(与PHP的安装不同)。

下载并解压pcre:

1 wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.34.tar.gz
2 tar zxvf pcre-8.34.tar.gz

下载并解压zlib:

1 wget http://zlib.net/zlib-1.2.8.tar.gz
2 tar zxvf zlib-1.2.8.tar.gz

下载并解压openssl:

1 wget http://www.openssl.org/source/openssl-1.0.1g.tar.gz
2 tar zxvf openssl-1.0.1g.tar.gz

好了,必要的库已经下载好,现在就正式开始下载Nginx并安装。首先下载Nginx并解压缩:

1 wget http://nginx.org/download/nginx-1.4.2.tar.gz
2 tar zxvf nginx-1.4.2.tar.gz

切换到Nginx的源码目录 「/home/reetsee/download/nginx-1.4.2」进行安装前的配置,根据你pcre、zlib、openssl所在的源码目录以及Nginx的最终安装路径,输入配置命令,我的配置命令如下:

1 ./configure --prefix=/home/reetsee/environment/nginx \
2 --with-http_ssl_module \
3 --with-pcre=/home/reetsee/download/pcre-8.34 \
4 --with-zlib=/home/reetsee/download/zlib-1.2.8 \
5 --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成功后进行安装:

1 make && make install

要验证Nginx是否安装成功了,可以切换到Nginx的安装目录(我的是「/home/reetsee/environment/nginx」),然后启动Nginx:

1 ./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个:

  1. 一个是把Nginx安装到其它目录,可以查看到效果(安装到其它目录后,记得先把原本运行的Nginx给kill掉);
  2. 第二个是将没有权限的目录加上rx权限;
  3. 第三个是在nginx安装目录下编辑「conf/nginx.conf」,将「#user  nobody」改为「user  root」,如下图:

nginx-conf

但是极其不建议使用第2种以及第3种方法,因为这样会有安全风险,如果你正在使用虚拟机测试或者仅仅是试用一下机器验证一下效果,那么就可以使用上面任何3种方法。

下面就让Nginx通过PHP的FastCGI处理请求,首先到nginx的安装目录下,修改「conf/nginx.conf」文件,找到如下内容:

1 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
2 #  
3 #location ~ \.php$ {
4 #    root           html;
5 #    fastcgi_pass   127.0.0.1:9000;
6 #    fastcgi_index  index.php;
7 #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
8 #    include        fastcgi_params;
9 #} 

 将第3~第7个「#」去掉,就是取消注释,同时将「/scripts$fastcgi_script_name」改为「$document_root$fastcgi_script_name」,即变为下面这样:

1 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
2 #  
3 location ~ \.php$ {
4     root           html;
5     fastcgi_pass   127.0.0.1:9000;
6     fastcgi_index  index.php;
7     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
8     include        fastcgi_params;
9 }

使用vim的列操作可以很快去掉它们。

在nginx的安装目录下,新增一个PHP文件「html/index.php」,文件内容如下:

1 <?php
2 echo phpinfo();
3 ?>

接下来就启动php-fpm以及重启nginx:

1 /home/reetsee/environment/php/sbin/php-fpm                 #启动php-fpm
2 /home/reetsee/environment/nginx/sbin/nginx -s reload    #重启nginx

然后打开浏览器,访问一下「机器ip/index.php」,例如「127.0.0.1/index.php」,如果你看到PHP的输出信息了~恭喜就成功啦~那么Nginx的安装完成了。效果图如下:

phpinfo

图中的蓝色框内如果出现了php.ini,就证明加载php.ini配置文件成功了。

如果你失败了欢迎留言。

另外是关于nginx.conf中的「127.0.0.1:9000」,这个其实是php-fpm的监听端口,是可以在php-fpm.conf中设置的。没有特殊需要使用默认即可。

5 安装MySQL

现在到最麻烦的一步了——安装MySQL。

说它麻烦是第一个是因为自从Orcale把MySQL收过来后到它的官网上下载一个MySQL就费力了不少,要找很久才能找到想要的下载连接,而且现在你上官网,不翻墙很有可能找不到下载连接! 我就是这样被坑了很久,我以为是官网网页出BUG了,当选择MySQL的版本时,对应的下载列表并没有更新,后来查看了一些网页的源码发现网页中使用了部分来自Google域名下的js,而最近Google在中国被全面封杀,开了GoAgent重新连接才把列表正常刷出来了(说句题外话最近GoAgent也有点不好使了)。

第二个是因为MySQL安装后要设置的东西蛮多的,当时我也摸索了比较久。强烈建议大家也摸索一下MySQL的安装以及初始配置,在官方文档中有非常详细的介绍。我选择MySQL5.5就是因为官网明确了这个版本是肯定在CentOS 6.x运行的。

为了免去大家麻烦,我已经把下载的链接记录下来了,下面两个连接随便挑一个就可以了:

  1. 下载前的页面:http://dev.mysql.com/downloads/file.php?id=452366,不需要注册或者登陆的,找到下面一行很隐蔽的「No thanks, just start my download.」并点击就可以了。
  2. 下载链接:http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.38-linux2.6-x86_64.tar.gz

对于使用虚拟机的同学可以先用下载工具(如迅雷)先下载到本机,然后再复制到虚拟机里面。对于购买了主机的同学那就直接下载吧,使用wget或者其他方式,大小在20M左右。

先安装cmake,CentOS下执行命令:

1 yum -y install cmake

Ubuntu可以尝试「sudo apt-get install cmake」。或者也可以直接到cmake的官网下载源码后安装。

下面输入命令添加名为「mysql」的用户和组,为后续步骤作准备:

1 groupadd mysql
2 useradd -r -g mysql mysql

解压下载好的MySQL:

1 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命令如下:

1 cmake \
2 -DCMAKE_INSTALL_PREFIX=/home/reetsee/environment/database/mysql \
3 -DDEFAULT_CHARSET=utf8 \
4 -DDEFAULT_COLLATION=utf8_general_ci \
5 -DMYSQL_TCP_PORT=3306 \
6 -DMYSQL_UNIX_ADDR=/home/reetsee/environment/database/mysql/run/mysql.sock \
7 -DWITH_INNOBASE_STORAGE_ENGINE=1 \
8 -DWITH_SSL=yes

以上各个选项的含义可以参看官方文档。对于「-DDEFAULT_CHARSET=utf8」以及「-DDEFAULT_COLLATION=utf8_general_ci」,主要考虑绝大多数情况下utf8编码就能够显示绝大多数的字符了,设置成默认字符编码比较好,即便对于中文字符集的要求很高(例如各种生僻字、繁体字等),也可以在新建数据库表的时候显式地指定字符集为GBK。

至于「-DMYSQL_UNIX_ADDR」这个选项,默认是等于「/tmp/mysql.sock」。

设置完后安装MySQL:

1 make && make install

安装需要一段时间,可以喝杯茶~

然后就开始数据库的初始化操作,首先切换目录到MySQL的安装目录:

1 cd /home/reetsee/environment/database/mysql/

然后改变安装目录下所有文件的用户及组为「mysql」(这个用户在上面安装MySQL前已经在系统中添加好了,没有添加的可以拉到上面看一下):

1 chown -R mysql .
2 chgrp -R mysql .

初始化数据库:

1 ./scripts/mysql_install_db --user=mysql --basedir=/home/reetsee/environment/database/mysql

这个选项「–basedir」指定为你的MySQL安装目录。

然后将目录的所有文件的所属用户改为「root」,接着将目录「data」的所属用户改为「mysql」(这一步很重要,否则数据库可能无法对这个目录进行操作):

1 chown -R root .
2 chown -R mysql data

将MySQL的配置文件拷贝到配置文件目录「/etc/」下,询问是否覆盖源文件输入「yes」即可:

1 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」:

1 chown -R mysql ./run

接下来就是最有标志性的一步,运行MySQL的守护进程:

1 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」账号一个密码:

1 ./bin/mysqladmin -u root password '123abc'

里面的「123abc」替换成你自己想要设置的密码即可。要注意的是这个MySQL的root不是指操作系统的root,而是指这个数据库管理系统的root,以后我们就可以使用这个账号对数据库进行添加用户、赋予权限等操作,所以一定要设置一个密码。

至此,繁琐的MySQL安装就所剩无几了!Congratulations

最后还有几件事要做:

  1. 使用「root」账户进入MySQL管理系统中;
  2. 在MySQL内创建一个叫做「hello」的账号,为它设置密码;
  3. 在MySQL内建立一个名为「hello_db」的数据库,然后让「hello」账号拥有对「hello_db」数据库的完全操作权限;
  4. 退出MySQL管理系统,使用「hello」账户进入MySQL管理系统中;
  5. 在「hello_db」数据库中创建一张名为「hello_table」的表,在里面插入一条数据;
  6. 编写一个简单的PHP文件,通过浏览器的访问将上面一步中插入的数据显示在网页上。

当我们完成最后的这几件事,就真正宣告LNMP搭建成功,所有东西都能串起来了!

MySQL与用户创建、权限赋予的相关操作,请参见官方文档的账户管理部分。下面主要使用的MySQL指令是「CREATE USER」以及「GRANT」。

使用「root」账户进入MySQL管理系统中:

1 ./bin/mysql -u root -p

弹出提示时输入密码即可。进入后的界面应该类似这样:

mysql

在MySQL内创建一个叫做「hello」的账号,为它设置密码:

在mysql中输入以下语句:

1 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」:

1 CREATE DATABASE hello_db;

然后是让「hello」账号拥有对「hello_db」数据库的完全操作权限:

1 GRANT ALL ON hello_db.* TO 'hello'@'localhost';

上面的「ALL」即所有权限,「hello_db.*」即权限是针对hello_db下的所有表,「‘hello’@‘localhost’」即来自localhost的名为「hello」的用户。

退出MySQL管理系统,使用「hello」账户进入MySQL管理系统中:

先退出:

1 exit;

然后以「hello」账号进入MySQL:

1 ./bin/mysql -u hello -p

输入密码后即可。

在「hello_db」数据库中创建一张名为「hello_table」的表,在里面插入一条数据:

使用「hello_db」数据库:

1 USE hello_db;

建一张名为「hello_table」的表(下面普通的换行不会执行语句,MySQL在换行时检测到分号「;」才会执行语句):

1 CREATE TABLE `hello_table`(
2 `id` INT(10) PRIMARY KEY NOT NULL AUTO_INCREMENT,
3 `content` VARCHAR(256) DEFAULT 'Hello LNMP!'
4 );

注意!上面对于表名如「hello_table」,列名如「id」和「content」,它们使用的引号是反引号「`」,不是单引号

这样一张表就建立好了,通过命令「SHOW TABLES」就可以看到。然后就是往里面插入一条数据:

1 INSERT INTO `hello_table` (`id`, `content`) VALUES(1, 'Hello World! Hello LNMP!');

出现 「Query OK, 1 row affected」就证明成功了!

编写一个简单的PHP文件,通过浏览器的访问将上面一步中插入的数据显示在网页上:

切换到Nginx安装目录下的「html」文件夹:

1 cd /home/reetsee/environment/nginx/html/

新建一个名为「lnmp.php」的文件,内容如下:

01 <?php
02 $con = mysqli_connect('localhost:3306''hello''123456','hello_db');
03  
04 //检查连接是否出错
05 if (mysqli_connect_errno($con)) {
06     echo 'Failed to connect to MySQL: ' . mysqli_connect_error() . "\n";
07     die("Connect to database failed.\n");
08 }
09  
10 //执行读取数据的语句
11 $query  'SELECT `id`, `content` FROM `hello_table` WHERE `id`=1;';
12 $result = mysqli_query($con$query);
13 $row    = mysqli_fetch_array($result, MYSQLI_ASSOC);
14  
15 //输出结果
16 echo $row['content'];
17  
18 //关闭连接
19 mysqli_close($con);
20 ?>

里面的用户名、密码等替换成自己的。没用过PHP的同学要留意PHP中双引号和单引号的含义是不同的。注意上面在初始化连接时的端口号「3306」不能少呀。

保存后将这个文件的权限设置为755,即执行命令「chmod 755 lnmp.php」。

接下来就打开浏览器,访问一下「127.0.0.1/lnmp.php」,是不是就看到了万众期待的「Hello World! Hello LNMP!」?效果如下:

hello_lnmp

如果你没有成功,那么欢迎在原文下留言(原文地址:http://blog.reetsee.com/archives/296),不过麻烦将情况描述得详细一点。我有空会尽快回复的。

6 结束前的一些小延伸

其实还有非常多东西可以写,因为我折腾这个LNMP得到的东西还不止那么少。

例如在上面安装Nginx的过程中,nginx.conf中有一行fastcgi_pass,里面指定通过TCP/IP协议进行通信的,如果你的Nginx与PHP是部署在同一台机器(即非分布式部署,就像这篇博文所说的那样部署),可以使用Unix域套接字进行通信,据说性能会有一点点提高。

不过具体的步骤我就暂时不写了,因为写到这里感觉有点累,想必看着这篇博文进行操作的同学也看得累。

把LNMP环境搭建起来后,可玩性就很强了,例如在上面放一个WordPress(安装快到没朋友),或者在上面搭建其它你喜欢的应用和服务。折腾WordPress搭建这个博客时我也学到非常多东西,不过这个可能得下次找机会再写。

作为折腾了那么一些东西的过来人,深刻认识到查阅官方文档的重要性,例如你要自己搭建应用与服务时Nginx要怎么配置?MySQL怎么操作?怎么优化性能?这些问题优先查阅官方文档解决。

我比较懒的,所以官方文档也有很多内容没有看,但是起码得保证先把亟待解决的问题相关的内容看了。


 

好了,最后就祝大家身体健康,天天开心!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值