nginx 基础知识解析

工作架构模型是    
nginx做前端反向代理处理请求,后端为lamp(php-fpm也为代理,代理处理动态网页请求,此外我们还可以安装Xcache为php-fpm处理动态网页加速)或者lnmp

一、基础知识理解    
1、代理基础知识    

代理:就是客户端请求一个互联网资源时,他没有能力到达真正的服务器,而是通过委托一个能够在互联网上取得各种资源的专业服务器帮他完成它想要请求的资源,并把结果返回给客户端的服务器叫做代理服务器     
代理工作原理     
分两个阶段,一是客户端请求到代理,代理到服务器取回资源到代理,然后代理服务器再拆封装,查看请求的资源,并缓存请求资源,再封装成httpd响应报文返回给客户端,不是所有的资源都会缓存,不缓存也要拆封装,代理服务器起到乘上启下的作用,压力较大,它要维持两个会话,一个是客户端到代理,另一个是代理到服务器。     
正向代理     
正向代理:代理服务器代理客户端,代理去找任何服务器,并把结果返回给客户端的服务器,他工作在局域网边缘,代理客户端去跟服务器打交道。    
缓存代理服务器:由于代理服务器的压力比较大,就引入了缓存代理服务器,当代理客户端去访问远程服务     
反向代理     
反向代理:代理服务器代理服务器接受客户端的请求,接受客户端的请求,到后端服务器取回资源修改源地址放回给客户端,代理服务器就好像秘书,服务器就是老板。

  

数据包、http应用层首部、tcp首部、ip首部、帧首部  

代理服务工作原理    
多级代理:让客户端知道经过哪些代理    
nginx:工作原理     

请求:客户端请求是把所有请求缓存在代理,再把全部请求一次性发给后端服务器     
响应:响应是服务器边响应就边发给缓存代理,代理也就马上发给客户端不做缓存,如果服务端响应完代理,代理还没有响应完客户端,代理才会缓存     
squal和nginx的不同也就在于此处,它是响应代理都是边响应边发送。导致会话建立长久,并发大的时候,压力就很大

2、内存及磁盘资源分配    

1、client_body_in_file_only on|cleaan|off
http 的包体是否出场在磁盘文件中;非off表示存储,即使包体大小为0也会创建一个磁盘文件,弄表示请求结束后包体文件不会被删除,clean表示会别删除,默认为off
clean 的话是客户端上传一个大的附件上传完了就回删除
2、client_body_in_single_buffer on|off     http 的包体是否存储在内存buffer当中;默认为off
3、client_body_buffer_size size     nginx 接受HTTP包体的内存缓存区大小
4、client_body_temp_path dir-path [level1 [level2 [level3]]];  缓存子目录 http包体重复的临时目录
5、client_header_buffer_size size;     正常情况下接受用户请求的http报文header部分是分配的buffer大小,默认为k
6、large_client_header_buffers number size     存储超大http请求首部的捏成buffer大小及个数
7、connection_pool_size size     内存连接池     nginx对于每个建立成功的tcp连接都会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为256,
2 8 法则,正太分布
8、request_pool size size    nginx在处理每个http请求时会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为4k

nginx 的两种用途

静态内容的web服务器    
反向代理

编译安装时注意启用epoll    
阻塞 、同步    
阻塞 、异步    
非阻塞、异步

从上到下一个比一个性能要好

二、安装Nginx:

1、解决依赖关系
# yum groupinstall "Development Tools" "Server Platform Deveopment" -y && yum install openssl-devel pcre-devel -y
2、安装
首先添加用户nginx,实现以之运行nginx服务进程:    # groupadd -r nginx     # useradd -r -g nginx nginx
mkdir /data
接着开始编译和安装:    # ./configure \       --prefix=/usr/local/nginx \     
--error-log-path=/data/applogs/nginx/error.log \     
--http-log-path=/data/applogs/nginx/access.log \  
--pid-path=/var/run/nginx/nginx.pid  \      
--lock-path=/var/lock/nginx.lock \       
--user=nginx \      
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/usr/local/nginx/client/ \ 
--http-proxy-temp-path=/usr/local/nginx/proxy/ \
--http-fastcgi-temp-path=/usr/local/nginx/fcgi/ \
--http-uwsgi-temp-path=/usr/local/nginx/uwsgi \ 
--http-scgi-temp-path=/usr/local/nginx/scgi \ 
--with-pcre

# make && make install

启动脚本

#!/bin/sh    
#     
# nginx - this script starts and stops the nginx daemon     
#     
# chkconfig:   - 85 15     
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \     
#               proxy and IMAP/POP3 proxy server     
# processname: nginx     
# config:      /etc/nginx/nginx.conf     
# config:      /etc/sysconfig/nginx     
# pidfile:     /var/run/nginx.pid     
# Source function library.     
. /etc/rc.d/init.d/functions     
# Source networking configuration.     
. /etc/sysconfig/network     
# Check that networking is up.     
[ "$NETWORKING" = "no" ] && exit 0     
nginx="/usr/local/nginx/sbin/nginx"     
prog=$(basename $nginx)     
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"     
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx     
lockfile=/var/lock/subsys/nginx     
make_dirs() {     
   # make required directories     
   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`     
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`     
   for opt in $options; do     
       if [ `echo $opt | grep '.*-temp-path'` ]; then     
           value=`echo $opt | cut -d "=" -f 2`     
           if [ ! -d "$value" ]; then     
               # echo "creating" $value     
               mkdir -p $value && chown -R $user $value     
           fi     
       fi     
   done     
}     
start() {     
    [ -x $nginx ] || exit 5     
    [ -f $NGINX_CONF_FILE ] || exit 6     
    make_dirs     
    echo -n $"Starting $prog: "     
    daemon $nginx -c $NGINX_CONF_FILE     
    retval=$?     
    echo     
    [ $retval -eq 0 ] && touch $lockfile     
    return $retval     
}     
stop() {     
    echo -n $"Stopping $prog: "     
    killproc $prog -QUIT     
    retval=$?     
    echo     
    [ $retval -eq 0 ] && rm -f $lockfile     
    return $retval     
}     
restart() {     
    configtest || return $?     
    stop     
    sleep 1     
    start     
}     
reload() {     
    configtest || return $?     
    echo -n $"Reloading $prog: "     
    killproc $nginx -HUP     
    RETVAL=$?     
    echo     
}     
force_reload() {     
    restart     
}     
configtest() {     
  $nginx -t -c $NGINX_CONF_FILE     
}     
rh_status() {     
    status $prog     
}     
rh_status_q() {     
    rh_status >/dev/null 2>&1     
}     
case "$1" in     
    start)     
        rh_status_q && exit 0     
        $1     
        ;;     
    stop)     
        rh_status_q || exit 0     
        $1     
        ;;     
    restart|configtest)     
        $1     
        ;;     
    reload)     
        rh_status_q || exit 7     
        $1     
        ;;     
    force-reload)     
        force_reload     
        ;;     
    status)     
        rh_status     
        ;;     
    condrestart|try-restart)     
        rh_status_q || exit 0     
            ;;     
    *)     
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"     
        exit 2     
esac

chmod +x nginx    
不然回出现这种情况    
env: /etc/init.d/nginx: Permission denied

1、记录真实访问web的日志    

proxy_set_header X-Real-IP $remote_addr;
LogFormat "%{X-Real-IP}i    service httpd restart
#gzip  on;  下
       upstream webservers {      
       server 192.168.1.144 weight=3 max_fails=2 fail_time=3;
       server 192.168.1.145 weight=1 max_fails=2 fail_time=3;
       server 127.0.0.1 backup;
       ip hash session 绑定
       lest_conn     
       }
       server {            
       listen 80;                     
       server_name www.node3.com;             
       proxy_set_header X-Real-IP $remote_addr; 
        
后端服务端http加  LogFormat "%{X-Real-IP}i  
然后访问,查看记录     add_header X-Via $server_addr;  让经过代理的信息,留下自己的ip,这个可以在服务器的浏览查看到

2、nginx在安装时应该注意的小细节      

         

location / {                             
proxy_pass http://webservers;                             
proxy_set_header   显示标记ip                 
proxy_hide_header  不显示版本号                 
proxy_pass_header  显示版本号                 
proxy_pass_request_body     是否将http请求报文的包体发往上游服务器                 proxy_pass_request_header 是否将http首部发往上游服务器             
}             
}
    # another virtual host  上
server {            
listen 8080;             
server_name 127.0.0.1;   #灰度发布          
root /www/backup;            
 }

3、一些命令的意义和使用规则

proxy_redirect [default|off|redirect|replacement]    
当上游服务器返回的响应是重定向或刷新请求时,proxy_redirect会重新设定http首部的location或refresh    
proxy_redirect http://localhost:8080/imgs  http://www.org.com/images    
proxy_redirect http://localhost:8080/imgs http://www.org.com/images    
网页重写

upstream  定义服务器组    
server 在服务器组中定义各上游服务器    
max_fails times    
weight    
backup    
ip hash

proxy_buffer_size size 设定用于暂存来自于upsteam服务器的第一个响应报文的缓冲区大小 
proxy_buffering on|off 启用缓冲upsteam服务器的响应报文,默认是关闭的,nginx对内存的使用有用严格的限制     
如果要使用的话proxy_buffering on  
proxy_max_temp_file_size 设为0  就具有缓存功能,可以不把缓存存储在磁盘,直接就     同步发给客户端     
proxy_cache_path 定义缓存目录     
nginx默认缓存是保存在磁盘上,但是可以把缓存放在mem-cache     
nginx缓存的原理
(zone name)hash表-----缓存空间---多级缓存    
缓存信息:客户端的私人信息不被缓存  可以定义缓存那些,不缓存那些,缓存时间多久等   wanish  可以把缓存直接缓存内存中
levels  层级目录
proxy_cache_use_stale error  过期缓存
在server下定义    
定义nginx缓存(缓存在固态硬盘较好)             
key缓存在哪里大小100m 磁盘空间有多大 缓存保存多久    
4、缓存实例
定义缓存
proxy_cache_path /cache/webserve levels=1:2 keys_zone=web:100m max_size=1g inactive=12h;
设置查看缓存是否命中
server {            
listen 80;                     
server_name www.node3.com;             
proxy_set_header X-Real-IP $remote_addr;  
后端服务端http加  LogFormat "%{X-Real-IP}i  然后访问,查看记录             
add_header X-Via $server_addr;  让经过代理的信息,留下自己的ip,这个事在服务器上浏览查看浏览器可以看到                     
add_header X-Cache $upstream_cache_status; 在网页浏览器中定义可以查看网页是否命中  
调用缓存及设置缓存规则
             location / {                             
             proxy_pass http://webservers;                             
             proxy_set_header   #显示标记ip                 
             proxy_hide_header  #不显示版本号                 
             proxy_pass_header  #显示版本号                 
             proxy_pass_request_body     #是否将http请求报文的包体发往上游服务器  
             proxy_pass_request_header #是否将http首部发往上游服务器              
             proxy_cache web; #调用缓存                 
             proxy_cache_valid 200 2h;                 
             proxy_cache_vaild 301 302 10m;                 
             proxy_cache_vaild any 1m; #定义缓存那些内容             
             }             
             }
mkdir /cache/webserver   
/cache/webserver #此分区最好为固态硬盘
验证结果
可以 ls查看     或者去浏览器访问,f12查看hit是否命中
cdn  缓存服务器

全局服务缓存服务器 

5、对nginx实现动静分离

            location 匹配定义重定向至那台服务器
            server {            
            listen 80;                    
            server_name www.node3.com;            
            proxy_set_header X-Real-IP $remote_addr;  后端服务端http加  
            LogFormat "%{X-Real-IP}i  然后访问,查看记录             
add_header X-Via $server_addr;  让经过代理的信息,留下自己的ip,这个在服务器上浏览查看浏览器可以查看到                  
            add_header X-Cache $upstream_cache_status; 在网页浏览器中定义可以查看网页是否命中                  
            location / {                             
            #proxy_pass http://webservers;基于域名来做的nginx反代                 
            proxy_pass http://192.168.1.144;  其它的重定向到这个服务器                         proxy_set_header   显示标记ip                 
            proxy_hide_header  不显示版本号                 
            proxy_pass_header  显示版本号                 
            proxy_pass_request_body     是否将http请求报文的包体发往上游服务器                 proxy_pass_request_header 是否将http首部发往上游服务器                             proxy_cache web; 调用缓存                 
            proxy_cache_valid 200 2h;                 
            proxy_cache_vaild 301 302 10m;                 
            proxy_cache_vaild any 1m; #定义缓存那些内容                 
            }                      
            location ~* \.(jpg|jpeg|png|gif)$ { # 图片全部重定向这个服务器                      proxy_pass http://192.168.1.145;                 
            proxy_cache web; 调用缓存                 
            proxy_cache_valid 200 2h;                 
            proxy_cache_vaild 301 302 10m;           
            proxy_cache_vaild any 1m; #定义缓存那些内容                 
            }             
            }


6、其它讲解

lnmp 
nginx服务器自己提供静态内容服务;    
对php的请求通过fastcgi模块代理制php-fpm服务器;

httpd,nginx    
cg协议,通用网关协议

动态网页语言

php  jsp  python  perl

cgi   module   fastcgi

四种模型    
prework

event

thread

php-fpm的工作原理    
与prework模型一样

与python  web    
uwsgi协议    
isp   web    
http协议    
与php    
fastcgi协议    
perl  web    
http协议

php-fpm    
先装mysql 或者maridb    
在安装http    
再安装php-fpm

7、php-fpm结合nginx的安装讲解   
提供php的服务脚本    
在解压包中    

cp php.ini-production /etc/php.ini     
2、提供php-fpm的启动脚本     
cp sapi/fpm/init.d.php /etc/rc.d/init.d/php-fpm     
3、提供php-fpm配置脚本     
cd  /usr/local/php/etc/     
cp php.fpm.conf.default php-fpm.conf     
修改php-fpm.conf     
1、pid     保证pid一致     
[global]     
pid = /usr/local/php/var/run/php-fpm.pid     
2、启用日志    
error.log = /var/log/php-fpm     
pm = dynaminc配置段     
pm.max.childen = 128 每个进程启动线程数     
pm.start-server = 5 启动php-fpm时启动几个进程     
pm.max-space-server = 5 启动空闲进程     
pm.max-requests = 500 一个线程在处理完多少个请求时消亡 0表示 处理无数个,都不消亡,除非关机     
pm.status-path = /status 主机状态信息     
ping.path = /ping    
ping.response = pong    
php-fpm 类似一个轻量级的web网页服务器,http的精简版
php-fpm提供缓存    
fastcgi_index: php的主页面文件    
http 段定义一个缓存     
fastcgi_cache_path /cache/fastcgi levels=1:2 keys_zone=fcgi:50m  max_size=1g inactive=12h;     
在location段调用缓存,并设置具体的缓存机制     
fastcgi_cache 和 proxy_cache类型定义相同     
                server {             listen 80;                     
                server_name www.node3.com;     
                location ~* \.(jpg|jpeg|png|gif)$ {  图片全部重定向这个服务器                      fastcgi_pass http://192.168.1.145;                 
                fastcgi_cache fcgi; 调用缓存                 
                fastcgi_cache_valid 200 2h;                 
                fastcgi_cache_vaild 301 302 10m;                 
                fastcgi_cache_vaild any 1m; 定义缓存那些内容                 
                }     
                }
                fastcgi_connect_timeout #连接fastcgi服务器的超时时长    
                fastcgi_send_timeout #向fastfcgi服务器传输数据的超时时长     
                http://www.org.com/test.php



8、健康状态页面设置

定义fast_cgi的状态信息页面    
            location ~* /(status|ping) 
            {         
            root    /www/a.com;         
            fastcgi_pass    127.0.0.1:9000;         
            fastcgi_param     SCRIPT_FILENAME $fastcgi_script_name;         
            include fastcgi_params;         
            }
            访问要求  http://www.a.com/status    
            http://www.a.com/status?html


9、健康状态页面的显示理解

pool    
进程池     
线程有线程池     
定义最多启用多少个进程响应请求     
cd /usr/local/php/etc     
vim php-fpm.conf     
process manager dynamic     
进程管理器 有两类static和dynamic     
start time 25/Apri     启动时间     
start since 2150     运行时长     
acceptnd conn  4021     已经接受的请求数     
listen queue     等待队列中的请求个数     
max listen queue 90     fpm启动以来等待队列中的请求的总数     
listen queue len 128     等待队列长度     
idle processes 4     空闲的进程数     
active processes 5     活动进程数     
total processes 5     总进程数     
max active process 8     ftp启动以来最大活动进程数     
max children  reached 0     达到最大进程的次数     
slow requests 0     慢速请求的个数

10、memcache的引入

 

 传统内存分配方式:malloc()、free()一有缓存就像内核申请内存,缓存失效就回收内存,会导致内存泄漏,内存丢失,反而降低了服务器的性能    memcache 解决了这个问题     如果设置了memcache,开机启动就会像内核申请一个固定内存空间,然后再把这个空间分成许多个固定的小片,有缓存来,就给他分配一个固定的小片,缓存失效就回收缓存,这个过程不再需要向内核申请参与,它会维持着像内核申请而来固定空间的大小。另外一个好处就是如果客户端来请求资源,它是指向服务器的,他最先会到缓存中来找资源,如果找到就直接返回给代理,而不会到后端服务器,基于这两点就可以提过服务器并发请求性能。    
  page 分配给slab用于切割的内存空间,默认大小1MB   
  chunk:用户缓存记录的内存空间    
  slab class 特定大小的
  chunk     自定义增长因子
  memcache协议:文本格式,二进制格式
    如果memcache是共享的话就会有一个很致命的弱点,如果其中一台服务器宕机或新上架一台服务器就会导致整个缓存改变,需要重新计算,重新生成缓存,如果这个时候压力过大就会导致雪崩效应,致使其它服务器压力过大,也宕机,这时候要重启服务器是起步起来的,压力太大,唯一有效的方法就是在前端反向代理那里控制请求并发,(具体做法是可以减少并发数,让其排队,或者把他重定向到状态页面内容为在维修,或者其他公共服务器上,再重新启动服务器,在慢慢放开前端并发。
针对memcache这个弱点,引入了环状一致性hash算法,作用就是如果后端服务器挂掉或者上架,只会导致一部分memcache丢失,损失不会太大。
并发响应模型    
libevent库:epoll,poll,select
安装memcache    
必须要安装libevent     
然后安装memcache     
编译安装也可以rpm包安装

11、命令基本讲解   

yum install memcache -y
memcached  
-l  监听的地址    
-d  运行的守护进程     
-u  以指定的身份运行     
-m  缓存服务器使用的内存空间,默认为64M     
-c 最大并发连接数,默认1024     
-p 监听的tcp端口,监听的tcp端口,默认12111    
-u 监听的udp端口,0默认禁止,     
-M 内存耗尽时返回错误而非删除缓存对象     
-f 指定增长因子,默认为1.25     
-n chuck起始大小,key+value+flags 默认为48
memcached -u memcached #启动memcached    
ss -tulp     
memcached -u memcached -f 1.5 -vv
存储类命令 set add replace append  prepend    
获取数据类命令 get delete incr/decr     
统计类的命令:stats ,stats items , stats slabs, stats sizes     
清除命令  flush_all
memcache  一半在缓存,一半在应用程序    
程序员在开发时,自行调用了memcached的API,memcached的功能才能生效     
memcached:服务器     
memcached:php连接memcached服务可以使用扩展     
memcache: php连接memcached服务可以使用另一个扩展     
libmemcached: c库     
memcache  服务安装


你可能感兴趣的:(nginx,基础解析)