php

Linux之nginx

2016-03-07  本文已影响630人  魏镇坪

Nginx简介

解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现状,2006年由俄罗斯lgor sysoev编写,全称为engine X, 缩写为nginx,官方站点为http://nginx.org,2013年发出企业版本Nginx Plus. 二次发行版本:Tengine, OpenResy....

Nginx特性

Nginx基本功能

standard HTTP modules 标准(核心)HTTP模块:自动编译进程序不止一个
Optional HTTP modules 可选http模块
Mail modules 邮件模块
3rd party modules 第三方模块,在编译时需手动指明加载方式加载

web服务相关的功能

Nginx的基本架构:master/worker

master/worker模型:
nginx工作原理图
img

Nginx编译安装配置

环境准备
Nginx的编译及安装
./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx  --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-debug

make && make install
Nginx的配置文件
/etc/nginx/nginx.conf配置文件的一般格式:

主配置文件框架解析

Main配置段常用参数
event配置段常用参数
http配置段常用参数
面向客户端请求相关的配置
对客户端请求进行限制
文件操作优化相关的配置
ngx_http_access_module模块的配置(基于IP的访问控制)
ngx_http_auth_basic_module模块的配置(basic认证)
ngx_http_log_module模块的配置(访问日志)
ngx_http_stub_status_module模块配置(stub_status)

启用stub_status功能, 只能用于server,location中,通过指定的URL输出stub_status

示例:
    location /status/ {
        stub_status on;
    }
    
    http://www.zhenping.me/status
Active connections: 1 
server accepts handled requests
 2 2 18 
Reading: 0 Writing: 1 Waiting: 0 
ngx_http_referer_module模块配置

基于请求报文中的referer首部的值, 做访问控制 ,可以防止盗链,其只应用于server,location上下文

ngx_http_ssl_module模块配置
ngx_http_rewrite_module模块配置(URL重写)

将请求的url基于正则表达式进行重写(URL重定向),在如下情况下可以使用:http转换成httpd服务(http-->https),域名转换domain.tld -->domain2.tld, URL转换uri --> uri2,实现SEO搜索引擎优化效果.... 将用户请求的URL基于正则表达式进行重写

ngx_http_gzip_module模块的配置(压缩功能)
示例:
    http {
        ....
        gzip on;
        gzip_http_version 1.0;
        gzip_comp_level 6;
        gzip_disable msie6;
        gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;
        gzip_min_length 2;
    }

ngx_http_fastcgi_module模块配置(LNMP架构搭建)

fastcgi_module只能对后端的一台应用服务器进行反代,如果需要给多台应用服务器进行反代实现负载,需借助upstream模块定义一组服务器,由fastcgi功能引用来完成, lnmp的架构中, ningx只支持fastcgi的模式连接后端php服务器,不能将应用服务运行为一个子模块的方式.nginx不支持动态加载模块机制(DSO),所以需要编译php工作为fpm机制时,将ngnx_http_fastcgi_module编译到nginx程序中,在php编译时需使用 --enable-fpm,将Php设置为fpm模式.

```
示例:
    http {
        ....
        fastcgi_cache_path /var/cache/fastcgi levels=1:1 keys_zone=fcache:10m inactive=5m max_size=1g;
        location ~ \.php$ {
            ....
            fastcgi_cache fcache
            fastcgi_cache_key $request_uri;
            fastcgi_cache_valid 202 302 10m;
            fastcgi_cache_valid 404 1m;
        }
    }
 ```
 
 * 缓存的设定及调用:
    
 ```
 首先使用fastcgi_cache_path设定缓存的存放路径,及内存中的存放名称,以便后面调用. 还需设置其它信息
 再分别使用:
    fastcgi_cache : 调用内存中存放的缓存名称
    fastcgi_cache_key : 以什么键来进行缓存
    fastcgi_cache_valid : 必须指定哪些状态码的响应才能进行缓存
 ```
ngx_http_proxy_module模块配置(http和https的代理 )

反向代理(reverse proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器, 并将从服务器上得到的结果返回给internet上请求连接的客户端,此时站在服务器角度来看,代理服务器对外就表现为一个反向代理服务器,对反向代理服务器的攻击并不会使得后端内网web服务器上网页信息破坏,增强了web服务器的安全性

```
示例:
    一   利用nginx完成反向代理,并且通过poxy_set_header 参数将客户端真实IP地址传递给后端真实服务器
    server { 
        listen 80; 
        server_name www.zhenping.me; 
        root /www/html; 
        index index.php index.html; 
        access_log /var/log/nginx/access.log combined; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        location ~* /name/? { 
            proxy_pass http://172.16.36.72; 
        } 
    }
    
    二  在后端的真实服务器上需要修改日志的记录格式后,才能将客户端的真实IP记录下来

    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"” combined
```
示例:
    http {
        ...
        proxy_cache_path /var/cache/proxy/ levels=1:2 keys_zone=pcache:10m max_size=1g;
        server {
            listen 80;
            server_name www.c.org c.org web.c.org;
            root /data/www;
            add_header via $server_addr;
            location / {
                proxy_pass http://172.16.100.68;
                proxy_cache pcahce;
                proxy_cache_key $request_uri;
                proxy_cache_valid 200 302 10m;
                proxy_cache_valid 404 1m;
            }
        }
    }
跟连接相关的选项
示例:
    http { 
        proxy_cache_path /var/cache/pcache levels=1:2 keys_zone=pcache:10m inactive=5m max_size=1g; 
        server { 
            listen 80; 
            server_name www.zhenping.me; 
            root /www/html; 
            index index.php index.html; 
            access_log /var/log/nginx/access.log combined; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            location ~* /name/? { 
                proxy_pass http://172.16.36.72; 
                proxy_cache pcache; 
                proxy_cache_key $uri; 
                proxy_cache_valid 200 202 301 302 10m; 
                proxy_cache_valid 404 1m; 
                proxy_connect_timeout 60s; 
                proxy_send_timeout 60s; 
                proxy_read_timeout 60s; 
            } 
        }
    }
ngx_http_headers_module模块配置
示例:
    http { 
        proxy_cache_path /var/cache/pcache levels=1:2 keys_zone=pcache:10m inactive=5m max_size=1g; 
        server { 
            listen 80; 
            server_name www.zhenping.me; 
            root /www/html; 
            index index.php index.html; 
            access_log /var/log/nginx/access.log combined; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            location ~* /name/? { 
                proxy_pass http://172.16.36.72; 
                proxy_cache pcache; proxy_cache_key $uri; 
                proxy_cache_valid 200 202 301 302 10m; 
                proxy_cache_valid 404 1m; 
                proxy_connect_timeout 60s; 
                proxy_send_timeout 60s; 
                proxy_read_timeout 60s; 
                add_header Via $server_addr; 
                expires 30m; 
            } 
        } 
    }
ngx_http_upstream_module模块配置

用于将多个服务器定义成服务器组,而由proxy_pass fastcgi_pass等指令引用,应用于http上下文

示例1:
    upstream backend {
        server backend1.example.com weight=5;
        server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
        server unix:/tmp/backend3;
        server backup1.example.com backup;
    }
    
示例2:
    upstream websrvs {
        server 172.16.100.68 weight=2 max_fails=2 fail_timeout=6s;
        server 172.16.100.6 weight=6 max_fails=2 fail_timeout=6s;
    }
    
    server {
        listen 80;
        server_name www.zhenping.me;
        root /data/www;
        add_header via $server_addr;
        location / {
            proxy_pass http://websrvs/;
        }
    }
示例:
    http {
        server
            ...
            location / {
                proxy_pass http://backend;
                health_check match=webcome;
            }
        }
        
        match welcome {
            status 200;
            header content-type = text/html;
            body ~ "welcom to nginx!";
        }
    }
示例: 实现动静分离
    http { 
        upstream http_servers { 
            server 172.16.36.71 weight=1 max_fails=2 fail_timeout=6s; 
            server 172.16.36.72 weight=2 max_fails=2 fail_timeout=6s; 
            # ip_hash; 
            } 
        server { 
            listen 80; 
            server_name www.zhenping.me; 
            root /www/html; 
            index index.php index.html; 
            access_log /var/log/nginx/access.log combined; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            location ~* \.php$ { 
                proxy_pass http://172.16.36.72; 
            } 
            location / { 
                proxy_pass http://http_servers/; 
            } 
        }
session会议保持机制:
上一篇下一篇

猜你喜欢

热点阅读