LAMP安装及配置

来源:实验楼

LAMP介绍及安装

1. LAMP是什么?

LAMP,包含Linux + Apache + PHP + Mysql。

LAMP适用环境

适用于追求极致稳定的WEB环境,缺点是需要消耗更多资源。

除了LAMP之外,大家应该也经常听到LNMP,不同之处就是Apache换成了Nginx。Apache的工作模式默认采用prefork工作模式,多个进程,每个进程只采用一个线程。还有另一个worker工作模式,每个子进程有多个线程,适合高并发场景,但是线程安全需要自己保证,故此不推荐。

Apache与Nginx比较

  • Apache较为稳定,Nginx适合高并发场景
  • Apache配置文件相对复杂,Nginx配置简单
  • Apache处理动态进程,Nginx适合处理静态
  • Apache模块化的体系,不过Nginx也逐渐有丰富的三方库。

常用环境

  • Apache因其稳定性与动态处理能力,常用于最后端Server。
  • Nginx因其高并发处理能力,以及强大的正则表达式,用于前端转发。

2. LAMP的编译安装

通常情况下在ubuntu及centos等发行版中只需要执行简单的yum或apt-get命令即可快速安装LAMP全套组件,但有时因为性能等因素的考虑会选择复杂的源码安装,这里介绍源码安装LAMP的方法,部分内容在实验楼环境中需要先停止已通过apt-get安装的apache及mysql服务才可以操作。

2.1 Apache编译

apache相关链接:

  • 下载地址 http://mirrors.aliyuncs.com/apache/httpd/
  • httpd 2.4文档 http://httpd.apache.org/docs/2.4/

下载最新版本

$ wget http://labfile.oss.aliyuncs.com/httpd-2.4.12.tar.gz

编译前解决依赖关系

$ sudo apt-get install gcc g++ make libtool -y

安装依赖

#####install apr
$ wget http://labfile.oss.aliyuncs.com/apr-1.5.1.tar.gz
$ tar xvf apr-1.5.1.tar.gz
$ cd apr-1.5.1
~/apr-1.5.1$ ./configure --prefix=/app/apr
~/apr-1.5.1$ make && make install

#####install apr-util
$ wget http://labfile.oss.aliyuncs.com/apr-util-1.5.4.tar.gz
$ tar xvf apr-util-1.5.4.tar.gz
$ cd apr-util-1.5.4
~/apr-util-1.5.4$ ./configure --prefix=/app/apr-util --with-apr=/app/apr

#####install pcre
$ wget  http://labfile.oss.aliyuncs.com/pcre-8.36.tar.gz
$ tar xvf pcre-8.36.tar.gz
$ cd pcre-8.36
~/pcre-8.36$ ./configure --prefix=/app/pcre
~/pcre-8.36$ make && make install

编译安装apache

$ tar xvf httpd-2.4.12.tar.gz
$ cd httpd-2.4.12
~/httpd-2.4.12$ ./configure --prefix=/app/apache --with-apr=/app/apr --with-apr-util=/app/apr-util --with-pcre=/app/pcre/
~/httpd-2.4.12$ make && make install

启动

$ sudo /app/apache/bin/httpd
$ netstat -anp | grep 80
(No info could be read for "-p": geteuid()=1000 but you should be root.)
tcp6       0      0 :::80                   :::*                    LISTEN      -

测试

$ curl -I 127.0.0.1
HTTP/1.1 200 OK
Date: Tue, 03 Feb 2015 16:17:15 GMT
Server: Apache/2.4.12 (Unix)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html

2.2 MySQL编译

这里我们采用MySQL,虽然这不是最佳选择。我们推荐mariadb或者percona,他们都是MySQL的分支,拥有比MySQL更加优秀的性能,与MySQL完全兼容,而且不受厂商控制。

PS:MySQL5.5之后将采用cmake进行编译

解决依赖关系

$ sudo apt-get install cmake g++ libbison-dev libncurses-dev

编译安装

$ wget http://labfile.oss.aliyuncs.com/mysql-5.6.24.tar.gz
$ tar xf mysql-5.6.24.tar.
~/mysql-5.6.24$
~/mysql-5.6.24$ cmake -DCMAKE_INSTALL_PREFIX=/app/mysql -DMYSQL_DATADIR=/app/mysql/data -DWITH_INNOBASE_STORAGE_ENGINE=1
~/mysql-5.6.24$ make && make install

赋予权限与初始化

$ sudo useradd mysql
$ sudo chown -R mysql.mysql /app/mysql/
$ sudo /app/mysql/scripts/mysql_install_db --basedir=/app/mysql --datadir=/app/mysql/data --user=mysql

启动

$ sudo /app/mysql/bin/mysqld_safe &
[1] 2255
$ 150204 09:30:14 mysqld_safe Logging to '/app/mysql/data/ubuntu.err'.
150204 09:30:14 mysqld_safe Starting mysqld daemon with databases from /app/mysql/data

测试

$ netstat -anp | grep 3306
(No info could be read for "-p": geteuid()=1000 but you should be root.)
tcp6       0      0 :::3306                 :::*                    LISTEN      -

端口已经监听,已经成功安装并启动。

2.3 PHP编译

PHP的扩展包有点多,我们直接apt安装了,如有特殊需求可下载指定包编译安装,常规编译方法。

安装依赖

$ sudo apt-get install zlib1g-dev libbz2-dev libcurl4-gnutls-dev  libjpeg-dev libpng12-dev  libfreetype6-dev  libmcrypt-dev libxml2-dev

编译安装

$ wget\ http://labfile.oss.aliyuncs.com/php-5.5.21.tar.gz
$ tar xf php-5.5.21.tar.gz
$ cd php-5.5.21
~/php-5.5.21$ ./configure --prefix=/app/php --with-bz2 --with-curl --with-jpeg-dir --with-gd --enable-shared --enable-mbstring --with-mcrypt --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-fpm --enable-phar --enable-bcmath --with-zlib --enable-zip --enable-ftp --with-gettext --enable-sockets --with-freetype-dir  --with-config-file-path=/app/php/etc/php.ini --with-config-file-scan-dir=/app/php/etc/conf.d --with-apxs2=/app/apache/bin/apxs
~/php-5.5.21$ make && make install
~/php-5.5.21$ cp php.ini-production /app/php/etc/php.ini

查看php是否支持mysql,以下为支持的模块。

~/php-5.5.21$ /app/php/bin/php -m | grep mysql
mysql
mysqli
mysqlnd
pdo_mysql

修改apache配置文件/etc/apache2/apache2.conf,添加以下内容,使支持php

AddType application/x-httpd-php .php

重新启动apache

$ sudo /app/apache/bin/httpd

访问测试

$ cat /app/apache/htdocs/index.php

 
 echo phpinfo();
 ?>

使用浏览器访问,正常访问情况如下,说明apache已经配置好了:

LAMP配置及调优

1. Apache常用配置

配置文件内容

新版Apache的配置文件已经非常优雅,这里只选取几个默认参数讲解。

#apache服务根目录
ServerRoot "/app/apache"
#服务管理员
ServerAdmin [email protected]
#监听端口
Listen 80
#默认首页
DirectoryIndex index.php
#加载php模块
LoadModule php5_module        modules/libphp5.so
#解析php
AddType application/x-httpd-php .php

目录权限参数

DocumentRoot "/app/apache/htdocs"   #WEB文件根目录

    # 官方文档链接 http://httpd.apache.org/docs/2.4/mod/core.html
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted   #允许所有请求

AllowOverride参数详解

  • none 这个不用讲了吧
  • AuthConfig 允许使用所有的权限指令,他们包括 AuthDBMGroupFile AuthDBMUserFile AuthGroupFile AuthName AuthTypeAuthUserFile 和 Require
  • FileInfo 允许使用文件控制类型的指令。它们包括 AddEncoding AddLanguage AddType DEfaultType ErrorDocument LanguagePriority
  • Indexes 允 许使用目录控制类型的指令。它们包 括 AddDescription AddIcon AddIconByEncoding AddIconByType DefaultIcon DirectoryIndex FancyIndexing HeaderName IndexIgnore IndexOptions ReadmeName
  • Limit 允许使用权限控制指令。它们包括Allow Deny和Order
  • Options 允许使用控制目录特征的指令.他们包括Options 和XBitHack

Options参数详解

  • All 表示除MultiViews之外的所有特性。这也是Options指令的默认设置。
  • None 表示不启用任何的服务器特性。
  • FollowSymLinks 服务器允许在此目录中使用符号连接。如果该配置选项位于配置段中,将会被忽略。
  • Indexes 如果输入的网址对应服务器上的一个文件目录,而此目录中又没有DirectoryIndex指令
  • MultiViews 允许使用mod_negotiation模块提供内容协商的"多重视图"。如果客户端请求的路径可能对应多种类型的文件,那么服务器将根据客户端请求的具体情况自动选择一个最匹配客户端要求的文件。
  • SymLinksIfOwnerMatch 服务器仅在符号连接与目标文件或目录的所有者具有相同的用户ID时才使用它。只有当符号连接和符号连接指向的目标文件或目录的所有者是同一用户时,才会使用符号连接。
  • ExecCGI 允许使用mod_cgi模块执行CGI脚本。
  • Includes 允许使用mod_include模块提供的服务器端包含功能
  • IncludesNOEXEC 允许服务器端包含,但禁用"#exec cmd"和"#exec cgi"。但仍可以从ScriptAlias目录使用"#include virtual"虚拟CGI脚本。

日志配置参数

ErrorLog "logs/error_log"
LogLevel warn  #错误日志记录等级


    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common  #自定义日志 名为common

    
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    CustomLog "logs/access_log" common   #日志路径  使用名为common的自定义格式

LogLevel记录日志等级

  • error 错误情况
  • warn 警告情况
  • info 普通信息
  • debug 出错级别信息

日志格式

  • %h - 客户端的ip地址或主机名
  • %l - The 这是由客户端 identd 判断的RFC 1413身份,输出中的符号 "-" 表示此处信息无效
  • %u - 由HTTP认证系统得到的访问该网页的客户名。有认证时才有效,输出中的符号 "-" 表示此处信息无效
  • %t - 服务器完成对请求的处理时的时间
  • "%r" - 引号中是客户发出的包含了许多有用信息的请求内容
  • %>s - 这个是服务器返回给客户端的状态码
  • %b - 最后这项是返回给客户端的不包括响应头的字节数
  • "%{Referer}i" - 此项指明了该请求是从被哪个网页提交过来的
  • "%{User-Agent}i" - 此项是客户浏览器提供的浏览器识别信息

实际访问日志

192.168.1.166 - - [04/Feb/2015:12:52:35 +0800] "GET / HTTP/1.1" 200 25

判断参数

如果加载了unixd_module模块,则使用以下参数。

 
 User daemon
 Group daemon
 

虚拟主机参数

基于域名的虚拟主机

    
        DocumentRoot /web1
        ServerName web1.com
        ErrorLog /app/apache/logs/error_log
        CustomLog /app/apache/logs/access_log combined
    

    
        DocumentRoot /web2
        ServerName web2.com
    

基于IP的虚拟主机

    
    DocumentRoot /web1
    ServerName web1.com
    
    
    DocumentRoot web2
    ServerName web2.com
    

基于端口的虚拟主机

    Listen 172.20.30.40:80
    Listen 172.20.30.40:8080
    
    DocumentRoot /web1
    ServerName web1.com
    
    
    DocumentRoot /web2
    ServerName web2.com
    

2. PHP常用配置

php.ini配置文件详解,前面介绍过的参数不再复述。

    ###常规配置
    engine = On
    short_open_tag = Off  #tags识别
    asp_tags = Off #asp tags识别
    precision = 14  #浮点类型数显示时的有效位数
    output_buffering = 4096   #输出缓存允许你在输出正文内容之后发送 header
    implicit_flush = Off   #告诉输出层在每个输出块之后自动刷新自身数据
    disable_functions =    #关闭特定函数
    display_errors = Off   #显示错误信息
    log_errors = On        #在日志文件里记录错误
    request_order = "GP"   #GET POST
    register_argc_argv = On #是否声明 argv和argc 变量
    post_max_size = 8M     #最大POST大小
    file_uploads = On      #是否允许HTTP方式文件上载 
    upload_tmp_dir =       #用于HTTP上载的文件的临时目录
    upload_max_filesize = 2M   #上载文件的最大大小
    max_file_uploads = 20      #每次最大上传文件个数
    allow_url_fopen = On   #是否允许把URLs当作http:.. 或把文件当作ftp:...
    default_socket_timeout = 60  #默认socker超时时间

    #MySQL相关
    mysql.allow_persistent = On #允许持久连接
    mysql.cache_size = 2000  #缓存大小
    mysql.max_persistent = -1  #持久连接的最大数目 -1不限制
    mysql.max_links = -1  #最大链接 
    mysql.connect_timeout = 60  #连接超时时间

    #session相关
    session.save_handler = files #用于保存/取回数据的控制方式
    session.use_cookies = 1 #是否使用cookies
    session.name = PHPSESSID  #设置cookies名
    session.use_only_cookies = 1  #强制SESSION ID必须以COOKIE传递
    session.auto_start = 0  #在请求启动时初始化session 
    session.cookie_lifetime = 0  #cookies保持时间

    #session垃圾回收参数
    session.gc_probability = 1 #按百分比整理
    session.gc_divisor = 1000  #每次请求时有1/1000的机会启动"垃圾回收"进程

    #Session ID传递参数
    session.use_trans_sid = 0 #使用URL的方式传递session id
    session.hash_function = 0 #生成SID MD5算法
    session.hash_bits_per_character = 5  #指定在SID字符串中的每个字符内保存多少bit

PHP配置相关链接:

  • PHP中文手册 http://php.net/manual/zh/
  • 完整php.ini 参数详解 http://php.net/manual/zh/ini.php

3. LAMP常用调优方法

LAMP环境下的调优,以下所有参数均来自于网络,请根据实际环境进行调整。

基于稳定的perfork工作模式,调整apache主配置文件以下参数。

    StartServers       50   #预创建50个进程
    MinSpareServers   15    #保持最小空闲进程
    MaxSpareServers   30    #保持最大空闲进程
    MaxClients       225    #最大进程数
    MaxRequestsPerChild  4000   #用来控制每个进程在处理了多少次请求之后自动销毁

请使用ps aux 查看进程占用内存数,以此调整实际环境中的参数,防止此消耗所有的资源。

php.ini常用配置参数

    max_execution_time 30   #一个脚本可使用多少 CPU 秒
    max_input_time 60       #一个脚本等待输入数据的时间有多长(秒)
    memory_limit  32M       #在被取消之前,一个脚本可使用多少内存(字节)
    output_buffering  4096  #数据发送给客户机之前,有多少数据(字节)需要缓存

MySQL调优,这个我也是不太熟悉,请参考MySQL相应实验。

相关链接:

  • 实际生产环境64GB内存配置文件http://cancait.blog.163.com/blog/static/21335744201351011939299/

  • 奉上一个my.cnf在线生成的链接 http://imysql.cn/my_cnf_generator

更加详细的参数请参考官方手册。

系统层面的调优不在范围之内,简单介绍下

  • 解除ulimit限制
  • I/O优化
  • 内核参数优化 TCP等.

4. 其他高级用法

使用apxs手动编译Apache模块

官方文档:http://httpd.apache.org/docs/2.4/programs/apxs.htmlmod_ssl :http://httpd.apache.org/docs/current/mod/mod_ssl.html

常用参数介绍

-c   此选项表示需要执行编译操作。 它首先会编译C源程序(.c)files为对应的目标代码文件(.o), 然后,连接这些目标代码和files中其余的目标代码文件(.o and .a), 以生成动态共享对象dsofile。如果没有指定-o选项, 则此输出文件名由files中的第一个文件名推测得到, 所以,缺省时,它一般会是mod_name.so
-i   此选项表示需要执行安装操作, 以安装一个或多个动态共享对象到服务器的modules目录中。
-a   此选项自动在httpd.conf文件中增加一个LoadModule行,以激活此模## 标题 ##块,或者,如果此行已经存在,则启用之。

编译方法

/app/apache/bin/apxs –i –a –c   mod_headers.c

#附ssl模块编译方法
apxs -I/path/openssl/include -L/path/openssl/lib -c *.c -lcrypto -lssl -ldl

使用phpsize手动编译PHP模块

 #进入源码目录
 cd php-5.5.21/ext/ftp
 #执行phpize
 /app/php/bin/phpize
 #编译 指定php-config
 ./configure --with-php-config=/usr/local/php/bin/php-config
 make && make install

php.ini加载模块

    extension=ftp.so





你可能感兴趣的:(其他)