目录
LAMP 架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web 站点服务及其应用开发环境。LAMP 是一个缩写词,具体包括 Linux 操作系统、Apache 网站服务器、MySQL数据库服务器、PHP(或 Per、Python)网页编程语言。
在构建 LAMP 平台时,各组件的安装顺序依次为 Linux、Apache、MySQL、PHP其中 Apache 和 MySQL 的安装并没有严格的顺序;而 PHP 环境的安装一般放到最后,负责沟通 Web 服务器和数据库系统以协同工作。
2.1Apache网站服务基础
2.1Apache简介
"Apache HTTP Server"是开源软件项目的杰出代表,它基于标准的 HTTP 网络协议提供网页浏览服务,在 Web 服务器领域中长期保持着超过半数的份额。Apache 服务器可以运行在 Linux、UNIX、Windows 等多种操作系统平台中。
1. Apache的起源
Apache HTTP Server(简称Apache)的起源可以追溯到NCSA httpd服务器,其名称Apache取自“A Patchy Server”的读音,意为“基于原有Web服务程序的代码进行修改(补丁)后形成的服务器程序”。以下是Apache起源的详细概述:
起源背景
- 前身:Apache HTTP Server的前身是NCSA httpd服务器,这是一个由美国国家超级电脑应用中心(National Center for Supercomputing Applications,NCSA)开发的Web服务器软件。
- 发展:随着互联网的兴起,Web服务器的需求日益增长,NCSA httpd服务器因其性能限制和缺乏扩展性而难以满足日益增长的需求。此时,一群开发者开始对NCSA httpd服务器进行修改和完善,以提高其性能和可扩展性。
Apache的诞生
- 成立Apache Group:这群开发者逐渐形成了Apache Group,他们致力于对NCSA httpd服务器进行持续的开发和维护。Apache Group的成立标志着Apache HTTP Server项目的正式启动。
- 发布版本:1995年,Apache Group发布了Apache HTTP Server的1.0版本,这一版本在性能和功能上都有了显著提升,逐渐赢得了用户的青睐。
Apache软件基金会的成立
- 背景:随着Apache HTTP Server的流行和成功,Apache Group在1999年进一步发展为Apache软件基金会(Apache Software Foundation,ASF)。ASF是一个非营利性组织,致力于开源软件的开发和推广。
- 目标:ASF的成立为Apache HTTP Server的发展提供了更加坚实的后盾,它吸引了更多的开发者参与到Apache项目的开发中来,推动了Apache HTTP Server的不断进步和创新。
Apache的流行和影响
- 全球排名:经过多年的发展,Apache HTTP Server已经成为世界使用排名第一的Web服务器软件,其市场占有率一直保持在较高水平。
- 特点:Apache HTTP Server以其跨平台、安全性高、模块化设计以及丰富的功能特性而著称。它支持多种操作系统平台,可以轻松地与各种编程语言和数据库进行集成,为开发者提供了极大的灵活性和便利性。
2.1.1 安装httpd服务器
在配置 Apache 网站服务之前,需要正确安装好 httpd 服务器软件。httpd 服务器的安装可以选用 RPM 安装、源码编译安装这两种方式,前者相对比较简单、快速,但是在功能上存在一定的局限性。
1.准备工作
为了避免发生端口冲突、程序冲突等现象,建议卸载使用RPM 方式安装的httpd.httpd 服务编译安装时需要依赖 apr-util-devel、pcre-devel 等软件,因此在 httpd 编译安装之前需要先安装依赖软件。
检查是否已经安装httpd
关闭防火墙
如果提示错误,证明没有rpm安装的httpd
- apr-util-devel
- apr-util 是Apache Portable Runtime Utility Libraries的缩写,它是Apache可移植运行时(APR)的一部分,但提供了额外的实用程序功能,如数据库连接池、加密和URI解析等。
- apr-util-devel 包包含了开发apr-util库所需的头文件、链接库以及可能的文档和示例代码。如果你需要编译依赖于apr-util的应用程序或库,这个包是必须的。
- pcre-devel
- PCRE(Perl Compatible Regular Expressions)是一个Perl兼容的正则表达式库,它提供了正则表达式的全面支持,包括Perl的许多高级特性。
- pcre-devel 包包含了开发时需要的PCRE库的头文件和开发文档,这对于编译需要PCRE支持的应用程序或库是必要的。
- gcc*
- GCC(GNU Compiler Collection)是GNU项目的一部分,是一套编程语言编译器,支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada和Go等。
- gcc* 通常不是一个具体的包名,而是指与GCC编译器相关的多个包。在安装GCC时,你可能会看到如gcc、gcc-c++(C++编译器)、gcc-objc(Objective-C编译器)等不同的包。根据你的需要,你可能需要安装这些包中的一个或多个。
- GCC是编译和构建许多Linux应用程序和库所必需的编译器。
- lrzsz
- lrzsz 是两个程序lrz和lsz的集合,这两个程序用于通过串行通信线路(如telnet或SSH)在本地和远程系统之间传输文件。lrz用于接收文件,而lsz用于发送文件。
- 尽管lrzsz主要用于文件传输,但在某些情况下,它可能是安装或配置某些软件时的一个依赖项,特别是那些需要与远程系统交换数据的软件。
2.源码编译及安装
(1)解包
将下载获得的 httpd 源码包解压并释放到/usr/src 目录下,且切换到展开后的源码目录中。
(2)配置
根据服务器的实际应用需要,可以灵活设置不同的定制选项,如指定安装路径、启用字符集支持等。若要获知可用的各种配置选项及其含义,可以执行“./configure --help命令
--prefix:制定程序的安装目录
--enable-so:启用动态加载模块DSO的支持,使httpd具备进一步扩展功能的能力
--enable-rewrite:启用网页地址重写功能,用于网站优化
--enable-charset-lite:启动字符集支持,以便支持使用各种字符集编码的网页
--enable-cgi:启用cgi脚本程序支持,扩展网站的应用访问能力
(3)编译及安装
上面执行后显示版本及配置成功
3.确认安装结果
4 优化执行路径
5.添加httpd系统服务
[root@bogon system]# cd /lib/systemd/system [root@bogon system]# vim httpd.service [Unit] Description=The Apache HTTP Server After=network.target [Service] Type=fotking PIDFile=/usr/local/httpd/logs/httpd.pid ExecStart=/usr/local/bin/apachectl $OPTIONS ExecReload=/bin/kill -HUP $MAINPID [install] WantedBy=multi-user.target 注释: After=network.target Before/After:要是一个服务 Before 另一个服务,那么在并行启动时(Systemd 总是用进程 0 并行启动所有东西,然后通过这两个标记来二次等待排序),那另一个服务这时就会等这个服务先启动并返回状态,注意是先启动而不是启动成功,因为失败也是一种状态,一定要成功才启动另一个服务是通过依赖关系定义的。反之 After 亦然。After=network.target 指的是后于network服务启动。 Type=forking 服务的启动方式,有fork方式和simple方式 forking的方式在启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。你要是使用的这种方式,最好也指定下 PIDFILE=,不要让 Systemd 去猜,非要猜也可以,设置 GuessMainPID 为 yes。 ExecReload= /bin/kill -HUP $MAINPID $ MAINPID是服务的systemd变量,它指向主应用程序的PID WantedBy=multi-user.target 指定运行级别
2.2 httpd 服务器的基本配置
1:确定网站名称、IP 地址
2:配置并启动 httpd 服务
(1)配置 httpd 服务
[root@www system]# vim /usr/local/httpd/conf/httpd.conf 修改网站名称: ServerName www.benet.com [root@www ~]# httpd -t Syntax OK
(2)启动 httpd 服务
3:部署网页文档
[root@localhost ~]# vim /etc/hosts 添加域名解析: 192.168.10.101 www.benet.com [root@localhost ~]# curl www.benet.com <html><body><h1>It works!</h1></body></html>
4:查看 Web 站点的访问情况
2.3 构建虚拟 Web 主机
1:为虚拟主机提供域名解析(两个域名)
[root@www ~]# vim /etc/hosts 192.168.10.101 www.benet.com 192.168.10.101 www.accp.com
2:为虚拟主机准备网页文档(两个网站)
[root@www ~]# mkdir -p /var/www/html/benetcom [root@www ~]# mkdir -p /var/www/html/accpcom [root@www ~]# echo "<h1>www.benet.com</h1>"> /var/www/html/benetcom/index.html [root@www ~]# echo "<h1>www.accp.com</h1>"> /var/www/html/accpcom/index.html
3:添加虚拟主机配置
[root@www ~]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf <Directory "/var/www/html"> Require all granted </Directory> <VirtualHost *:80> DocumentRoot "/var/www/html/benetcom" ServerName www.benet.com ErrorLog "logs/www.benet.com.error_log" CustomLog "logs/www.benet.com.access_log" common </VirtualHost> <VirtualHost *:80> DocumentRoot "/var/www/html/accpcom" ServerName www.accp.com ErrorLog "logs/www.accp.com.error_log" CustomLog "logs/www.accp.com.access_log" common </VirtualHost> [root@www ~]# vim /usr/local/httpd/conf/httpd.conf 去掉注释符号: Include conf/extra/httpd-vhosts.conf [root@www ~]# systemctl restart httpd
4:在客户机中访问虚拟 Web 主机
[root@node2 ~]# cat /etc/hosts 192.168.10.101 www.benet.com 192.168.10.101 www.accp.com [root@node2 ~]# curl www.benet.com <h1>www.benet.com</h1> [root@node2 ~]# curl www.accp.com <h1>www.accp.com</h1>
2.4 基于 IP 地址、基于端口的虚拟主机
1:为主机设置多个IP地址
[root@www ~]# cd /etc/sysconfig/network-scripts/ [root@www network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0 [root@www network-scripts]# cp ifcfg-ens33 ifcfg-ens33:1 [root@www network-scripts]# vim ifcfg-ens33:0 IPADDR=192.168.10.210 NETMASK=255.255.255.0 GATEWAY=192.168.10.254 NAME=ens33:0 DEVICE=ens33:0 [root@www network-scripts]# vim ifcfg-ens33:1 IPADDR=192.168.10.220 NETMASK=255.255.255.0 GATEWAY=192.168.10.254 NAME=ens33:1 DEVICE=ens33:1 [root@www network-scripts]# systemctl restart network [root@www network-scripts]# ip address 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:21:68:67 brd ff:ff:ff:ff:ff:ff inet 192.168.10.101/24 brd 192.168.10.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.10.220/24 brd 192.168.10.255 scope global secondary noprefixroute ens33:1 valid_lft forever preferred_lft forever inet 192.168.10.210/24 brd 192.168.10.255 scope global secondary noprefixroute ens33:0 valid_lft forever preferred_lft forever inet6 fe80::91e7:44c5:3a3:b5d1/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@www network-scripts]#
2:基于 IP 地址的虚拟主机
[root@www ~]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf <Directory "/var/www/html"> Require all granted </Directory> <VirtualHost 192.168.10.210:80> DocumentRoot "/var/www/html/benetcom" ServerName www.benet.com ErrorLog "logs/www.benet.com.error_log" CustomLog "logs/www.benet.com.access_log" common </VirtualHost> <VirtualHost 192.168.10.220:80> DocumentRoot "/var/www/html/accpcom" ServerName www.accp.com ErrorLog "logs/www.accp.com.error_log" CustomLog "logs/www.accp.com.access_log" common </VirtualHost> [root@www ~]# systemctl restart httpd 客户端测试 [root@node2 ~]# curl 192.168.10.210 <h1>www.benet.com</h1> [root@node2 ~]# curl 192.168.10.220 <h1>www.benet.com</h1>
3:基于端口的虚拟主机
[root@www ~]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf <Directory "/var/www/html"> Require all granted </Directory> Listen 80 Listen 8080 <VirtualHost 192.168.10.101:80> DocumentRoot "/var/www/html/benetcom" ServerName www.benet.com ErrorLog "logs/www.benet.com.error_log" CustomLog "logs/www.benet.com.access_log" common </VirtualHost> <VirtualHost 192.168.10.101:8080> DocumentRoot "/var/www/html/accpcom" ServerName www.accp.com ErrorLog "logs/www.accp.com.error_log" CustomLog "logs/www.accp.com.access_log" common </VirtualHost> [root@www ~]# systemctl restart httpd [root@www ~]# netstat -anpt | grep httpd 客户端测试 [root@node2 ~]# curl 192.168.10.101:80 <h1>www.benet.com</h1> [root@node2 ~]# curl 192.168.10.101:8080 <h1>www.accp.com</h1>
2.5 MySQL 的编译安装
1:准备工作
(1)检查安装环境
备注:
初始化mysql需要autoconf,它是自动化配置脚本生成工具,安装自动化脚本生成工具
(2)安装cmake
[root@www ~]# tar zxf cmake-2.8.6.tar.gz [root@www ~]# cd cmake-2.8.6 [root@www cmake-2.8.6]# ./configure [root@www cmake-2.8.6]# gmake && gmake install 备注: 此步骤可以用yum的方法安装cmake yum -y install cmake
2:源码编译及安装
(1)创建运行用户
(2)解包
(3)配置
[root@www ~]# cd mysql-5.6.36 [root@www mysql-5.6.36]# cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DSYSCONFDIR=/etc \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all -DDEFAULT_COLLATION:用于指定数据集如何排序,以及字符串的比对规则
(4)编译并安装
3:安装后的其他调整
(1)对数据库目录进行权限设置
(2)建立配置文件
(3)初始化数据库
[root@www mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
4:启动并访问 MySQL 服务
[root@www mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@www mysql-5.6.36]# chmod +x /etc/rc.d/init.d/mysqld [root@www mysql-5.6.36]# chkconfig --add mysql 服务 mysql 信息读取出错:没有那个文件或目录 [root@www mysql-5.6.36]# chkconfig --add mysqld [root@www mysql-5.6.36]# chkconfig mysqld on [root@www mysql-5.6.36]# systemctl start mysql [root@www mysql-5.6.36]# netstat -anpt | grep mysql tcp6 0 0 :::3306 :::* LISTEN 57921/mysqld [root@www mysql-5.6.36]# mysql -u root -p Enter password: //密码是空的 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.36 Source distribution Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> set password =password('123456'); Query OK, 0 rows affected (0.00 sec) mysql> exit Bye [root@www mysql-5.6.36]#
2.6 构建 PHP 运行环境
1:准备工作
为了避免发生程序冲突等现象,建议先将 RPM 方式安装的 PHP 及相关依赖包
2:安装扩展工具库
(1)安装 libmcrypt
[root@www ~]# tar zxf libmcrypt-2.5.8.tar.gz [root@www ~]# cd libmcrypt-2.5.8/ [root@www libmcrypt-2.5.8]# ./configure [root@www libmcrypt-2.5.8]# make && make install [root@www libmcrypt-2.5.8]# ln -s /usr/local/lib/libmcrypt.* /usr/lib/ //做个软连接
(2)安装 mhash
[root@www ~]# tar zxf mhash-0.9.9.9.tar.gz [root@www ~]# cd mhash-0.9.9.9/ [root@www mhash-0.9.9.9]# ./configure [root@www mhash-0.9.9.9]# make && make install [root@www mhash-0.9.9.9]# ln -s /usr/local/lib/libmhash* /usr/lib/
(3)安装 mcrypt
[root@www ~]# tar zxf mcrypt-2.6.8.tar.gz [root@www ~]# cd mcrypt-2.6.8/ [root@www mcrypt-2.6.8]# ./configure [root@www mcrypt-2.6.8]# export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH [root@www mcrypt-2.6.8]# ./configure [root@www mcrypt-2.6.8]# make && make install
3:编译安装 PHP
(1)解包
[root@www ~]# tar zxf php-5.5.38.tar.gz [root@www ~]# cd php-5.5.38
(2)配置
[root@www php-5.5.38]# ./configure --prefix=/usr/local/php5 \ --with-mcrypt \ --with-apxs2=/usr/local/httpd/bin/apxs \ --with-mysql=/usr/local/mysql \ --with-mysqli=/usr/local/mysql/bin/mysql_config \ --with-config-file-path=/usr/local/php5 \ --enable-mbstring
注意:
不能用192.168.10.101连接。
想用主机IP连接需要在安装php时指定mysql函数集为mysqlnd
--with-mysqli=mysqlnd
如果使用本地函数集,php连接mysql数据库可以使用localhost、127.0.0.1、本机主机名
,但不能用本机IP地址192.168.10.101
--with-apxs2=/usr/local/httpd/bin/apxs
整合apache,apxs功能是使用mod_so中的LoadModule指令,加载指定模块到apache,要求apache要打开SO模块
(3)编译及安装
[root@www php-5.5.38]# make && make install 备注: 这一步时间很长 备注: ./configure --prefix=/usr/local/php5 \ --with-apxs2=/usr/local/httpd/bin/apxs \ --with-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-config-file-path=/usr/local/php5 \ --enable-mbstring
2.7 设置 LAMP 组件环境
1:php.ini 配置调整
(1)php.ini 的建立及基本设置
[root@www php-5.5.38]# cp php.ini-development /usr/local/php5/php.ini [root@www php-5.5.38]# vim /usr/local/php5/php.ini default_charset = "UTF-8" #去掉前面的注释 file_uploads = On upload_max_filesize = 2M max_file_uploads = 20 post_max_size = 8M short_open_tag = On ##修改值 extension=php_mysqli.dll ##去掉前面的注释
(2)添加 ZendGuardLoader 优化模块
[root@www~]#tar zxf zend-loader-php5.5-linux-x86_64_update1.tar.gz [root@www~]#cd zend-loader-php5.5-linux-x86_64/ [root@www zend-loader-php5.5-linux-x86_64]#cp ZendGuardLoader.so /usr/local/php5/lib/php [root@www ~]# vim /usr/local/php5/php.ini 在[PHP]下面添加: [PHP] zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so zend_loader.enable=1
2:httpd.conf 配置调整
[root@www ~]# vim /usr/local/httpd/conf/httpd.conf Listen *:80 …… //省略部分内容 LoadModule php5_module modules/libphp5.so <IfModule mime_module> AddType application/x-httpd-php .php </IfModule> DirectoryIndex index.html index.php #Include conf/extra/httpd-vhosts.conf [root@www ~]# apachectl -t Syntax OK [root@www ~]# systemctl restart httpd
2.8 测试 LAMP 协同工作
1:测试 PHP 网页能否正确显示
[root@www ~]# vim /usr/local/httpd/htdocs/test1.php <?php phpinfo( ); ?>
2:测试 PHP 网页能否访问 MySQL 数据库
[root@www ~]# vim /usr/local/httpd/htdocs/test2.php <?php $link=mysqli_connect('localhost','root','123456'); if($link) echo "恭喜你,数据库连接成功啦!!"; mysqli_close($link); ?> 注意: 对数据库的连接授权,授权后可以使用主机名连接 mysql> grant all on *.* to root@'www.benet.com' identified by '123456'; 注意: 如果用的是mysqlnd,要用IP地址进行连接,127.0.0.1或192.168.10.101都可以