Nginx和Apache

基本概念:


  • cgi协议(通用网关接口):只要你按照cgi协议去编写程序,就能实现语言解释器与webwerver的通信。如php-cgi程序。
  • fast-cgi 是cgi的改良版本,每次处理完请求后,不会kill掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。
  • php-fpm 即php-Fastcgi Process Manager,是 FastCGI 的实现,并提供了进程管理的功能。
  • Nginx 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。


【PHP的运行原理】

CGI:PHP解析器与webserver的一个协议桥梁。

FastCGI:每次处理完请求后不会kill掉进程,会保留进程。属于CGI的改良版本。

PHP-FPM:PHP FastCGI Process Manager,PHP FastCGI的进程管理器。


PHP的垃圾回收机制:PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数这种单纯的垃圾回收机制。

每个对象都内含一个引用计数器,每个reference链接到对象,计数器加1,当reference离开生存空间或者被设为null,计数器减1,

当某个引用计数器的对象为0时,PHP知道你将不再需要使用这个对象,释放其所占有的内存空间。



CGI、FastCGI和PHP-FPM关系图解?

CGI(Common Gateway Interface)全称是“通用网关接口”,WEB 服务器与PHP应用进行“交谈”的一种工具,其程序须运行在网络服务器上。

CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php、perl、tcl等。

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次。

它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行,并且接受来自其它网站服务器来的请求。


FastCGI与CGI特点:

对于CGI来说,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重初始化全部数据结构。

而使用FastCGI,所有这些都只在进程启动时发生一次。

一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

由于FastCGI是多进程,所以比CGI多线程消耗更多的服务器内存,php-cgi解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。


关于Nginx:


    • 在项目使用中,nginx使用最多的三个核心功能是:反向代理、负载均衡、静态服务器;
    • Nginx进程进程包含 master 进程和 worker 进程两种进程。master 进程只有一个,负责监听端口,接收来自 Web Server 的请求;而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。
    • Nginx通过反向代理功能将动态请求转向后端Php-fpm。配置nginx.conf 支持php-fpm,当请求网站下php文件的时候,反向代理到php-fpm:


location ~ \.php$ {

include /usr/local/etc/nginx/fastcgi.conf; #加载nginx的fastcgi模块

fastcgi_intercept_errors on;

fastcgi_pass 127.0.0.1:9000; #nginx fastcgi进程监听的IP地址和端口

}



nginx与php-fpm的结合,完整的流程是这样的:


www.example.com

--> Nginx

--> 路由到www.example.com/index.php

--> 加载nginx的fast-cgi模块

--> fast-cgi监听127.0.0.1:9000地址

--> www.example.com/index.php请求到达127.0.0.1:9000

--> php-fpm 监听127.0.0.1:9000

--> php-fpm 接收到请求,启用worker进程处理请求

--> php-fpm 处理完请求,返回给nginx

--> nginx将结果通过http返回给浏览器



关于nginx.conf,主要由6个部分组成:


main:用于进行nginx全局信息的配置

events:用于nginx工作模式的配置

http:用于进行http协议信息的一些配置

server:用于进行服务器访问信息的配置

location:用于进行访问路由的配置

upstream:用于进行负载均衡的配置


主要的几个配置项:


worker_processes指定nginx要开启的子进程数量

worker_connections 指定最大可以同时接收的连接数量

multi_accept 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接

keepalive_timeout 10:给客户端分配连接超时时间,服务器会在这个时间过后关闭连接

client_header_timeout 10:设置请求头的超时时间

client_body_timeout 10:设置请求体的超时时间

send_timeout 10:指定客户端响应超时时间

access_log logs/access.log:设置存储访问记录的日志

error_log logs/error.log:设置存储记录错误发生的日志

gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。

gzip_disable 为指定的客户端禁用gzip功能。

open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间。



Nginx缓存的配置:


location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

{

//防盗链设置

valid_referers none blocked imooc.com *.imooc.com;

if ($invalid_referer)

{

#return 403;

rewrite ^/ https://www.baidu.com/img/bd_logo1.png;

}

//加密签名

accesskey on;

accesskey_hashmethod md5;

accesskey_arg sign;

accesskey_signature "jason$remote_addr”;

//过期时间

expires 30d;

etag off;

add_header cache-control max-age=3600 ;

}



关于“正向代理” 和 “反向代理”:

访问google,需要FQ(VPN),对于人来说可以感知到,但服务器感知不到的服务器,我们叫他正向代理服务器。

访问baidu,baidu自己有一个代理服务器用来做负载均衡,路由到不同的server。对于人来说不可感知,但对于服务器来说是可以感知的,我们叫他反向代理服务器


nginx负载均衡:

配置Nginx负载均衡,在nginx.conf 添加下面这段backend,可以自由命名:


upstream backend {

   #添加服务器到负载均衡

    server 192.168.1.252;

server 192.168.1.251 weight=2;#设置该服务器在负载均衡中的权重 默认为1;越高则访问的频次越大

server 192.168.1.252 down; #表示down掉这台服务器,不参与负载均衡

server 192.168.1.247 backup; #备用服务器 当其他服务器很忙或者down掉之后才会启动这台的

}

#配置参数

#max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

#fail_timeout:max_fails次失败后,暂停的时间。

server {

listen 80;

server_name localhost;

location / {

#反向代理的地址

proxy_pass http://backend;

}

}





这样子就已经配置完成了,访问localhost,如果三台服务器能轮询切换就证明配置成功。


Nginx配置虚拟主机:

nginx.conf 每一个server {listen 80; server_name ​​www.a.com;​​ ..... } 就表示一台虚拟域名,


Nginx列出文件目录列表

nginx默认是不允许列出整个目录的,开启目录列表:打开nginx.conf文件,

在location server 或 http段中加入:


autoindex on;//自动显示目录

autoindex_exact_size off;//人性化方式显示文件大小否则以byte显示

autoindex_localtime on;//按服务器时间显示,否则以gmt时间显示



Nginx与Apache的优缺点比较?

(1)最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;

nginx是异步的,多个连接(万级别)可以对应一个进程。

nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的。

(2) 在高并发下nginx 能保持 低资源、低消耗、高性能。

(3) apache 相对于nginx 的优点: rewrite ,比nginx 的rewrite 强大。


Apache 与 Nginx 区别

nginx 相对 apache 的优点:

轻量级,同样是web 服务,比apache 占用更少的内存及资源

抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

高度模块化的设计,编写模块相对简单

apache 相对nginx 的优点:

rewrite ,比nginx 的rewrite 强大

超稳定,少bug ,nginx 的bug 相对较多


Apache设置二级域名和虚拟主机,在httpd.conf的最后:


NameVirtualHost *:80

<VirtualHost *:80>

ServerName www.a.com

DocumentRoot "D:/www"

</VirtualHost>

<Directory "D:/www" >

Options FollowSymLinks

AllowOverride All

Order allow,deny

Allow from all

</Directory>

Options FollowSymLinks 表示不列出目录下的文件,

如果要列出文件列表,则使用 Options Indexes FollowSymLinks。