首页 > 代码库 > lamp架构

lamp架构

一、Apache 进程模式说明

在linux中,我们可以用httpd-l 查看安装的模块是prefork模式还是worker模式

[root@LAMP ~]# /usl/local/apache/bin/apachectl  -l|egrep "worker|prefoker"

  worker.c

[root@LAMP ~]#

或者

[root@LAMP ~]# /usr/local/apache/bin/apachectl  -l |sed -n ‘/worker\|prefork/p‘

  worker.c

[root@LAMP ~]# 

prefork模式(默认)

       prefork使用的是多个子进程,而每一个子进程只有一个线程,每个进程在某个确定的时间只能维持一个连接。

工作原理:

     控制进程最初建立若干个子进程,为了不在请求到来时再生成子进程,所以要根据需求不断的创建新的子进程,最大可以达到每秒32个知道满足需求为止。

worker模式(默认)

          worker模式是Apache2.x新引进的模式,是线程与进程的结合,在worker模式下会有多个子进程,每个子进程又会有多个线程。每个线程在某个确定时间只能维持一个连接。

   工作原理:

   由主控制进程生成若干个子进程,而每个子进程中又包含固定的线程数,各个线程独立处理请求,同样为了不在请求到来时再生成线程,在配置文件中设置了最小和最大空闲线程数及所有子进程的线程总数,如果现有子进程中的线程总数不能满足并发负载,控制进程将派生新的子进程。

   安装方法:

   在配置编译的过程中,加入参数--with-mpm=worker,如果不加的话系统会采用默认的prefork模式

优点:内存占用比prefork模式低,适合高并发高流量的HTTPD服务

缺点:假如一个线程崩溃,整个进程积极会连同其任何线程一起“死掉”。由于线程共享内存空间,所以一个程序在运行时必须被系统识别为“每个线程都是安全的”。服务稳定性不如prefork模式。

event模式:在非常繁忙的服务器下,以上两种服务器有点吃不消,在worker基础上,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的

1.prefork:

<IfModule mpm_prefork_module>

StartServers          5 #服务器开始进程

MinSpareServers       5 #最小空闲进程

MaxSpareServers      10 #最大空闲进程

MaxClients          150 #最大处理请求数,对性能影响最大,默认最大256,再多排队

MaxRequestsPerChild   0 #进程处理的最大请求数,0无限制,可以设置大一点,不用回收

</IfModule>

2.worker:

<IfModule mpm_worker_module>

StartServers          2 #开始进程数

MaxClients          150 #最大处理请求数

MinSpareThreads      25 #最小空闲线程数

MaxSpareThreads      75 #最大空闲线程数

ThreadsPerChild      25 #每个进程可以产生多少线程,最大可以是20000,性能密切相关

MaxRequestsPerChild   0 #线程处理的最大请求数, 0无限制

</IfModule>

worker模式下所能同时处理的请求总数是由子进程总数乘以Threadsperchild值决定的,应该大于等于maxclients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。

 提示: 默认最大的子进程总数为16,如需加大时也需要明显的申明serverlimit的值(最大值时20000)

查看Apache的worker下并发连接数:

[root@LAMP ~]# pstree -a|grep httpd|wc -l

84

[root@LAMP ~]# 

3.event就不研究了

二.测试解析

关键点:

1, apachectl -M 查看是否加载libphp5.so

2. httpd.conf 里面是否写对了AddType  Application/x-httpd-php .php

3. php代码格式要写对

4. selinux要关闭

5. deny没有改成allow  2.4 denied  granted

6. 没有加host

2. 配置第一个虚拟主机

删除httpd.conf中的这行前面的警号

#Include conf/extra/httpd-vhosts.conf

vim /usr/local/apache2/con5. 为某个虚拟主机配置用户认证

http://www.lishiming.net/thread-554-1-1.htmlf/extra/httpd-vhosts.conf

2、web防盗链技术

  简单的说,就是某些不法的网站,通过在其自身网站程序里未经许可非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,达到了填充自身网站显示的效果,但是浪费了调用资源网站的网络流量,造成其他网站的带宽及服务压力吃紧,甚至宕机。

网站被盗链的解决方案:

1、根据http referer实现防盗链

在HTTP协议中,有一个表头字段叫referer,使用URL格式来表示从哪里来的链接到当前网页的资源,通过referer可以检测到目标访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一单检测出来源不是本站进行阻止或返回指定页面。 目前Apache,nginx,lighttpd三者都支持根据http referer实现防盗链

2、根据cookie处理

3、通过加密变换访问路径实现防盗链lighttpd有类似的插件mod_secdownload

Apache web服务实现防盗链实战

<VirtualHost *:80>

    ServerAdmin ucode@gmail.com

    DocumentRoot "/var/html/bbs"

    ServerName ucode.blog.51cto.com

    ServerAlias www.dummy-host.example.com

    ErrorLog "logs/bbs-error_log"

    CustomLog "|/usr/local/sbin/cronolog /app/logs/access_bbs_%Y%m%d.log" combined

    RewriteEngine On #开启防盗链

    RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/.*$ [NC]

    RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/$ [NC]

    RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/.*$ [NC]

    RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com$ [NC]

    RewriteCond .*\.(gif|jpg|swf)$ http://ucode.blog.51cto.com/img/nolink.jpg [ R,NC]

</VirtualHost>

满足以上的黑体部分的就会返回:http://ucode.blog.51cto.com/img/nolink.jpg图片

Listen 80##默认监听的端口是80

PidFile /export/servers/apache2/logs/httpd.pid

LoadModule authn_file_module modules/mod_authn_file.so##加载的模块

User admin ##一般默认设置为admin

Group admin ##一般默认设置为admin

DocumentRoot "/export/servers/apache2/htdocs"##设置你的项目文件路径

ServerAdmin you@example.com       #当服务器报错是,返回客户端,让联系管理员

ServerName localhost:80    ##服务器的名字:端口

AddType application/x-httpd-php .php          让.php文本文件格式也能运行php程序。

1 <Directory />

Options FollowSymLinks

AllowOverride None

Order deny,allow

Allow from all

</Directory>

#Options:配置在特定目录使用哪些特性,常用的值和基本含义如下:

#ExecCGI: 在该目录下允许执行CGI脚本。

#FollowSymLinks: 在该目录下允许文件系统使用符号连接。

#Indexes: 当用户访问该目录时,如果用户找不到DirectoryIndex指定的主页文件(例如#index.html),则返回该目录下的文件列表给用户。

#SymLinksIfOwnerMatch: 当使用符号连接时,只有当符号连接的文件拥有者与实际文件拥有者相同时才可以访问.

Includes 允许服务器端包含。

IncludesNOEXEC 允许服务器端包含,但禁用#exec命令和#exec CGI。但仍可以从ScriptAliase目录使用#include 虚拟CGI脚本。

比如说,没有任何+和-符号:

  1. <Directory /web/docs>

  2. Options Indexes FollowSymLinks

  3. </Directory>

  4. <Directory /web/docs/spec>

  5. Options Includes

  6. </Directory>

则只有  Includes  设置到/web/docs/spec目录上。

然而如果第二个  Options  指令使用了+和-符号:

  1. <Directory /web/docs>

  2. Options Indexes FollowSymLinks

  3. </Directory>

  4. <Directory /web/docs/spec>

  5. Options +Includes -Indexes

  6. </Directory>

那么就会有  FollowSymLinks  和  Includes  设置到/web/docs/spec目录上。

#AllowOverride:允许存在于.htaccess文件中的指令类型(.htaccess文件名是可以改变的,其文件名由AccessFileName指令决定):

#None: 当AllowOverride被设置为None时。不搜索该目录下的.htaccess文件(可以减小服务器开销)。

#All: 在.htaccess文件中可以使用所有的指令。

Order:控制在访问时Allow和Deny两个访问规则哪个优先:

Allow:允许访问的主机列表(可用域名或子网,例如:Allow from 192.168.0.0/16)。

Deny:拒绝访问的主机列表。

Apache服务器可以针对目录进行文档的访问控制,然而访问控制可以通过两种方式来实现,一个是在设置文件 httpd.conf(或access.conf)中针对每个目录进行设置

Timeout 300 ##客户程序和服务器连接的超时间隔

KeepAlive On ###在一次连接中传递多个HTTP请求

MaxKeepAliveRequests 100 ###为一次连接可以进行的HTTP请求的最大请求次数

KeepAliveTimeout 15 ###测试一次连接中的多次请求传输之间的时间,如果服务器已经完成了一次请求,但一直没有接收到客户程序的下一次请求,在间隔超过了这个参数设置的值之后,服务器就断开连接。

ErrorLog logs/error_log #日志的保存位置

LogLevel warn    ##日志级别 debug日志界别,日志就比较多

日志的缺省格式有如下几种:

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 "%{Referer}i -> %U" referer

LogFormat "%{User-agent}i" agent

CustomLog logs/access_log common

格式中的各个参数如下:

%h –客户端的ip地址或主机名

%l –The 这是由客户端 identd 判断的RFC 1413身份,输出中的符号 "-" 表示此处信息无效。

%u –由HTTP认证系统得到的访问该网页的客户名。有认证时才有效,输出中的符号 "-" 表示此处信息无效。

%t –服务器完成对请求的处理时的时间。

"%r" –引号中是客户发出的包含了许多有用信息的请求内容。

%>s –这个是服务器返回给客户端的状态码。

%b –最后这项是返回给客户端的不包括响应头的字节数。

"%{Referer}i" –此项指明了该请求是从被哪个网页提交过来的。

"%{User-Agent}i" –此项是客户浏览器提供的浏览器识别信息。


lamp架构