源码编译nginx和Nginx的特性,配置文件指令说明

nginx的官方站点
www.nginx.org
Nginx:engine X
Tenginx:Taobao enginx
libevent:高性能的网络库
epoll();
Nginx特性
 模块化设计,较好扩展性:但不支持模块的动态装卸载;Tenginx支持;
 高可靠性
  master –> worker
 低内存消耗
 支持热部署
  不停机而跟新配置文件,日志文件滚动,升级程序版本
支持事件驱动,异步IO mmap(内存映射)
Nginx基本功能
 静态资源的web服务器,能够缓存打开的文件描述符
 http,smtp,pop3协议的反向代理服务器
 缓存加速、负载均衡机制
 支持FastCGI(ftm,LNMP),uWSGI(python)
 模块化(非DSO机制)、过滤器zip、SSI及图像的大小调整
 支持SSL
 
代理的概念
正向代理:客户端请求的服务都被代理服务器代替来请求
反向代理:反向代理服务器会帮我们把请求转发到真实的服务器那里去
正向代理代理的对象是客户端,反向代理隐藏了真实的服务端
Nginx的扩展功能
 基于名称和IP的虚拟主机
 支持keepalive
 支持平滑升级
 定制访问日志,支持使用日志缓冲区提供日志存储性能
 支持url rewrite
 支持路径名称
 支持基于IP及用户的访问控制
 支持速率限制,支持并发访问数限制
 
Nginx的架构特性
 一个master进程,生存一个或多个worker进程
 事件驱动模型:epoll(边缘触发)linux 
  复用器:select,poll,rt signal
 支持sendfile,sendfile64
 支持AIO
 支持mmap(内存映射)
 
Nginx的工作模式:非阻塞、事件驱动、由一个master进程生成多个worker线程,每个worker响应n个请求
 worker * n
 
Nginx模块类型:
 核心模块
 standard HTTP modules
 Optional HTTP modules
 Mail modeules
 3rd party modules
Nginx的安装方法 
rpm包:epel
 源码:编译安装
 制作好的程序包:rpm包
源码编译安装Nginx
PCRE(Perl Compatible Regular Expressions中文含义:perl语言兼容正则表达式),实现对URL重写
1.安装所依赖的pcre-devel包
#yum -y install pcre-devel
2.创建系统组nginx和系统用户nginx:用nginx此普通用户来运行worker线程
#groupadd -r nginx
#groupadd -g nginx -r nginx
 
3.编译
#tar xf nginx-1.6.2.tar.gz
#cd nginx-1.6.2
#./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-http_flv_module –with-http_mp4_module –http-client-body-temp-path=/var/tmp/nginx/client –http-proxy-temp-path=/var/tmp/nginx/proxy –http-fastcgi-temp-path=/var/tmp/nginx/fastcgi –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
#make && make install
#mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi}
4.启动nginx
#/usr/local/nginx/sbin/nginx -t  //检查配置文件的语法
#/usr/local/nginx/sbin/nginx

Nginx的配置/etc/nginx/nginx.conf
 main配置段:全局配置段
  event:定义event模型工作特性
 http {}:定义http协议相关的配置
 
 配置指令:要以分好结尾,语法格式:
  dirctive value1 [value2…]
 支持使用变量
  内置变量
   模块会提供内建变量的定义
  自定义变量
   set var_name value
   
 主配置段的指令:
  用于调试、定位问题
  正常运行必备的配置
  优化性能的配置
  事件相关的配置
I/O模型
 blocking nonblocking mutiplexing event-driven AIO
 阻塞I/O 非阻塞I/O 复用性I/O 事件驱动I/O 异步I/O
 
Nginx: non-blocking event-drive aio
Nginx-1.8的新特性:
 hash load balancing method
 backend SSL certificate verification
 thread pools support
 proxy request buffering
 
主配置段的指令:
 正常运行的必备配置
 1.user USERNANE [GROUPNAME] //指定运行worker进程的用户和组
  user nginx nginx;
 2.pid /path/to/pid_file; //指定nginx守护进程的pid文件
  pid /var/run/nginx/nginx.pid
 3.worker_rlimit_nofile #; //指定所有worker进程所能够打开的最大文件句柄数
 4.worker_rlimit_core size;
 5.
 
 性能优化相关的配置
 1.worker_processes #; //指明worker进程的个数,通常略应该少于cpu物理核心数
 2.worker_cpu_affinity cpumask …;  //避免不了context switch,会提升缓存命中率;将worker进程绑定到指定的cpu上运行
  worker_processes    4;
  worker_cpu_affinity 0001 0010 0100 1000;
 4.timer_resolution interval;  //计时器解析度,降低此值,可减少gettimeofday()系统调用次数;
 5.worker_priority number; //指明worker进程的nice值 -20–19
 
 事件相关的配置
 1.accept_mutex {off|on};
  master调度用户请求至各worker进程时使用的负载均衡锁:on表示能让多个worker轮流地 序列化的响应请求
 2.lock_file file;
  accept_metex用到的锁文件路径
 3.use method;
  use [epoll|rtsig|select|poll] 指明使用的事件模型,建议让Nginx自行选择;
 4.worker_connections #;
  设定单个worker进程所能够处理的最大并发连接数量
  
 用于调试、定位问题:要使用debug级别,编译时要启用–with-debug选项
 1.daemon {on|off} 是否以守护进程方式运行nginx,调试时应该设置为off
 2.master_process {on|off} 是否以master/worker模型来运行Nginx;调试时可以设置为off
 3.error_log file [level];
 
总结:常需要进行调整的参数
 worker_precess worker_connections worker_cpu_affinity worker_priority
 新改动配置生效方式
 #nginx -s stop|reload|quit|reopne
 
Nginx做为web服务器时使用的配置
http{}:由ngx_http_core_module模块所引入
配置框架:
 http {
  upstream {
  
  }
  
  server {
   location URL {
    root “/path/to/somedir”; //指定本地文件系统路径;
    if … {
    
    }//if语句    
   }//类似于http中的<location>,用于定义URL于本地文件系统的映射关系;可以使用多次 
  } //每个server类似于httpd中的一个<VirtualHost>;server可以使用多次;
 }
 注意:与http相关的指令仅能够放置于http server location upstream if上下文;但有些指令仅用于这5中上下
 文中的某种
 
 配置指令:
 1.server {} //定义一个虚拟主机;
        server {
   listen 8080;  //监听的端口
   server_name www.xiangx.com; //主机名称
   root “/web/www/html”; //类似DcoumentRoot
        }
 注意:提供root对应的文件
 #/usr/local/nginx/sbin/nginx -t //检查配置文件的语法
 #/usr/local/nginx/sbin/nginx -s reload  //重载配置文件
 测试访问
 
 2.listen //监听指定的地址和端口
  listen address[:port];
  listen port;
 
 3.server_name NAME […];
  后可以跟多个主机:名称还可以使用正则表达式或通配符;
  (1)先做精确匹配检查;
  (2)左侧通配符匹配检查;
  (3)右侧通配符匹配检查;
  (4)正则表达匹配检查;如~^.*\.xiangx\.com$
  (5)default_server;
  
 4.root path;
  设置资源路径映射:用于指明请求的URL所对应的资源所在的文件系统上的起始路径;
  
 5.location
 location [ = | ~ | ~* | ^~ ] uri { … }
 location @name { … }
 功能:允许根据用户请求的URL来匹配定义的各location,匹配到时,此请求将被响应的location配置块中的匹配处理;
 例如做访问控制等功能
  = :精确匹配检查
  ~ :正则表达式模式匹配检查,区分字符大小写;
  ~* :正则表达式模式匹配检查,不区分字符大小写;
  ^~ :URI前半部分匹配,不检查正则表达式;
  
  匹配的优先级:= –> ^~ –> ~ –> ~* –> 不带任何符号的location
  
 sever {
  listen 80;
  server_name www.xiangx.com;
  location / {
   root “/web/www”;
  }
  
  location /images/ {
   root “/web/images/”;
  }
  
  location ~*\.php$ {
   fcgipass
  }
 }
 
 
 6.alias path;
  用于location匹配段,定义路径别名
  location /images/ {
   root “/vhost/web/”;
  }
  http://www.xiangx.com/images/a.jpg <– /vhost/web/images/a.jpg
  
  location /images/ {
   alias “/www/pictures”;
  }
  http://www.xiangx.com/images/a.jpg <– /www/picture/a.jpg
 注意:root表示指明路径为对应的location “/” URL
    alias表示路径映射,即location指令后定义的URL是相对于alias所指明的路径而言;
 
 7.index file;
  设置默认主页面:
  index index.php index.html;
 
 8.error_page code […] [=code] URI @name
  根据http响应状态码来指明特定的错误页面;
  error_page 404 /404_customed.html;
  
  =code:以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的响应码为其响应码;
  server {
   listen 8080;
   server_name www.xiangx.com;
    location / {
     root “/web/www”;
     error_page 404 /404.html;
    }
   }
 
 9.基于IP的访问控制机制
  allow IP/NETWORK
  deny  IP/NETWORK
 
 10.基于用户的访问的控制
  basic,digest;
 auth_basic “string”   //说明认证原因
 auth_basic_user_file   //指定认证用户的文件列表
  账号密码文件建议使用htpasswd来创建
  server {
   listen 8080;
   server_name www.xiangx.com;
    location / {
     root “/web/www/html”;
     auth_basic “xiangx auth”;
     auth_basic_user_file /etc/nginx/users/.htpasswd;
    }
   }
  指定认证的用户: 
  #htpasswd -c -m /etc/nginx/users/.htpasswd tom

 11.Nginx的https实现
  创建私有CA
  #cd /etc/pki/CA
  #(umask 077;openssl genrsa -out private/cakey.pem
  #openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
  #touch index.txt serial
  #echo 01 > serial
  
  #mkdir /etc/nginx/ssl
  #cd /etc/nginx/ssl
  #(umask 077;openssl genrsa -out nginx.key 1024
  #openssl req -new -key nginx.key -out nginx.csr
  #openssl req -new -key nginx.key -out nginx.csr
 
  server {
   listen       443 ssl;
   server_name  www.ting.com
   ssl_certificate      /etc/nginx/ssl/nginx.crt;
   ssl_certificate_key  /etc/nginx/ssl/nginx.key;
   ssl_session_cache    shared:SSL:1m;
   ssl_session_timeout  5m;
   ssl_ciphers  HIGH:!aNULL:!MD5;
   ssl_prefer_server_ciphers  on;
   location / {
    root   /web/www/html;
    index  index.html index.htm;
   }
  }
 12stu_status {on|off}
  状态页面,仅能用于Location中
  location /status {
   stub_status on;
   allow 192.168.100.0/24;
   deny all;
         }
        
  测试访问:http://192.168.100.2:8080/status
  显示结果:
  Active connections: 4   //当前所有处于打开状态的连接数
  server accepts handled requests 
  44 44 29  //已经接收进来的连接 处理的连接 已经处理过的请求数,在保持连接模式下,请求数量可能会多余连接数量
  Reading: 0 Writing: 1 Waiting: 3
  Reading:正处于接收请求状态的连接数
  Writing:请求已经接收完成,正处于处理请求或发送响应过程的连接数
  Waiting:保持连接模式,且处于活动连接数;
   
 13 rewrite regex replacement flag;
  如:rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
  http://www.xiangx.com/images/a/b/c/1.jpg –> http:www.xiangx.com/imgs/a/b/c/1.jpg
  
  flag
   last:一旦rewrite规则重写完成后,不再被后面其它的rewrite规则进行处理,而是由Uer Agent重新对重写后的URL
    再一次发送请求,并从头开始执行类似的过程;
   break:一旦此rewrite规则重写完成后,不再被后面其它的rewrite规则进行处理,User        Agent重新对重写后的URL重新发起请求,且不再会被当前location内的任何rewrite规则检查;
   redirect:以302响应码,返回新的URL 即临时重定向
   permanent:以301响应码,返回新的URL 即永久重定向
  
   location / {
    root “/web/www/html”;
    rewrite ^/bbs/(.*)$ /forum/$1 break;
   }
   备注:准备forum文件 echo “forum teting” > /web/www/html/forum/index.html
   测试访问:http://192.168.100.2:8080/bbs/
  
 14 if
  语法: if (condition) {…}
  上下文:server location
  condition:
   1.变量名:变量值为空串,或者以“0”开始,则为false,其它均为true;
   2.以变量为操作数均构成比较表达式,可使用= !=类似的比较操作符进行测试
   3.正则表达式模式匹配操作
    ~:区分大小写的模式匹配检查
    ~*:不区分大小写的模式匹配检查
    !~ 和 ~!*:对上面的两种测试取反
   4.测试路径为文件存在性: -f !-f
   5.测试指定路径为目录的可能性:-d !-d
   6.测试文件的存在性:-e !-e
   7.检查文件是否有执行权限:-x !-x
   
  如:
  if ($http_user_agent ~* MSIE) {
   rewrite ^(.*) /msie/$1 break;
  }
  
 15.防止盗链 
  location ~* \.(jpg|gif|png|jpeg)$ {
   valid_referer none blocked www.xiangx.ocm;  //定义合法引用
   if ($invalid_referer) {
    rewrite ^/ http://www.xiangx.com/403.html;
   }
  }
  
 16.定制访问日志格式
  log_format
    log_format  main  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
                      ‘$status $body_bytes_sent “$http_referer” ‘
                      ‘”$http_user_agent” “$http_x_forwarded_for”‘;
    access_log  logs/access.log  main;
 注意:此处可用变量为nginx各模块内建变量;
 
 17.网络连接相关的配置
  1.keepalive_timeout  #; //长连接的超时时长,默认为75s;
  2.keepalive_requests #; //在一个长连接上所能够允许请求的最大资源数;
  3.keepalive_disasble [msie6|safari|none]; //为指定类型的User Agent禁用长连接
  4.tcp_nodelay on|off; //是否对长连接使用TCP_NODELAY选项;将每次请求的资源都单独发送,不进行多个小资源合并发送,减少延迟;
  5.client_header_timeout #;  //读取http请求报文首部的超时时长
  6.client_body_timeout #  //读取http请求报文body部分的超时时长;
  7.send_timeout #;  //发送响应报文的超时时长;
  
 18.fastcgi的相关配置
  LNMP:PHP启用fpm模型
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }

原创文章,作者:xiangx,如若转载,请注明出处:http://www.178linux.com/74505

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code