码农日记

薄洪涛的个人博客

nginx配置详解入门第一篇

我们从这张图开始分析nginx配置(借用网图)

clipboard.png

1. 全局块配置
这个全局块配置会影响ngxin的全局,一般包括以下配置
user  www;
worker_processes  4; 
worker_cpu_affinity 0001 0010 0100 1000
#error_log  logs/error.log;
#pid        logs/nginx.pid;
master_process on|off
user www 这里指定nginx是以www用户运行的

woker_process auto 这里主要是nginx处理并发处理的关键配置,这么说可能不太明显,举个例子

clipboard1.png

可以看到,我们设置了auto,nginx就会自动产生适合的进程数量来处理并发,我们也可以把auto换成自己指定的数字,不过不太建议;这里当worker数和cpu的数量相等时获得最佳性能,因为每一个worder都会工作在独立的cpu核心上,完全消除了cpu调度

master_process 是否启用nginx的进程池机制,即是否产生worker进程

worker_cpu_affinity 指定某个woker进程绑定到某个核心上,更充分利用cpu资源,减少cpu切换,提升cache命中率

error_log 这个没啥好说的,就是设定全局的日志文件的存放目录,不过error_log 可以制定日志的级别,格式位error_log 路径 level ,level分debug|info|notice|warn|error|crit|alert|emerg,高于指定级别的日志会记录下来,默认位error

pid  Nginx进程是作为系统守护进程在运行,需要在某文件中保存当前运行程序的主进程号,Nginx支持该保存文件路径的自定义

2.event块

nginx采用事件驱动,event就是用来配置nginx的事件机制,这里配置很少;

events {
  use epoll; //配置使用事件的处理方式,选择项包括:select、poll、kqueue、epoll、rtsig等,默认为epoll,不必配置
  worker_connections number;//每个worker进程的最大连接数的配置
  multi_accept on | off     //是否允许同时接收多个网络连接
  accept_mutex on | off;    //是否启用进程间的负载均衡,可让进程工作更均匀,但使用锁成本较高影响效率,默认off
}
3.http块
http {
    include       mime.types;
    default_type  application/octet-stream;
    #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;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    server {
      xxx
    }

include xx 后面跟的是文件名字,就是说允许网络资源的媒体类型,可以执行cat mimi.types,可以看到 这个文件是一个types结构,包含了各种浏览器能够识别的mime类型及对应的文件的后缀,如下图;

clipboard2.png

access_log 也没啥好说的,就是日志路径呗
sendfile on|off 这个是 是否允许使用sendfile传输文件,默认关闭就可以
keepalive_timeout  秒  这个就是服务器对连接的保持时间,利于客户端复用HTTP长连接,提高服务器性能,如希望服务器发送完数据后主动断连,设置位0
gzip on|off 这个是nginx对响应数据进行在线实时压缩
4.location块
指令格式为:
location [ = | ~ | ~* | ^~ ] uri {...}
这里的uri分为标准uri和正则uri,两者的唯一区别是uri中是否包含正则表达式
uri前面的方括号中的内容是可选项,解释如下:

“=”:用于标准uri前,要求请求字符串与uri严格匹配,一旦匹配成功则停止

“~”:用于正则uri前,并且区分大小写

“~*”:用于正则uri前,但不区分大小写

“^~”:用于标准uri前,要求Nginx找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配

其中应该注意的location / ,根据nginx的前缀匹配原则,会处理其他location处理不了的请求

5. server块
这一块用到的最频繁,但也是最简单的
server {
    charset utf-8;
    client_max_body_size 128M;

    listen 要监听的端口;
    server_name 域名;
    root        站点目录;
    index       index.php或者index.html 就是入口;
    access_log     日志文件路径;
    error_log     日志文件路径;
    server_roken on|build|off   HTTP响应头中的server字段,on会显示nginx版本,off会关闭
    # 出现请求了不存在的文件或者错误时,跳转到index.php
    location / {
        # Redirect everything that isn't a real file to index.php
        try_files $uri $uri/ /index.php?$args;
    }
    # 支持php模块(遇到.php就用php模块去处理)
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params;
    }
    # 拒绝这些请求
    location ~ /\.(ht|svn|git) {
        deny all;
    }
}
就这些主要的配置了,其他的一些特殊处理,就需要用的时候再去查找,比如post请求转get,获取请求的参数等

6.TCP/UDP服务

stream{
   upstream{
      //配置上游服务器
   }
   server{
    listen 666 ;//监听TCP 666端口
   }
   server{
    listen 555 udp;//监听UDP 555 端口
   }

}

这里定义TCP/UDP服务器要使用server命令,listen制定监听的端口号,TCP/UDP协议里面没有Host ,Url概念,所以server块里面不能使用server_name,location等指令

7.反向代理

先解释下什么叫反向代理

在计算机网络中,反向代理是代理服务器的一种。服务器根据客户端的请求,从其关联的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器簇的存在

upstream backend{   # upstream的名字
    keepalived 32   # 最大连接数,连接池
    zone shared_upstream_storage 64k    # 允许集群信息在多个进程之间共享
    server 127.0.0.1:80                 # 上游服务器
    或
    server ... weight=3;                # 指定多台上游服务器
    或
    server ... backup                   # 备份用的上游服务器

}

其中weight 表示访问的权重,比如我一台服务器设置1,一台设置为3 那么分发到这两台服务器的请求比例就为1:3

8.负载均衡

nginx支持以下策略

  1. round robin  默认算法,带权重的轮询

  2. hash 散列或者一致性散列算法生成指定范围的key

  3. ip_hash  使用ip地址的散列

  4. least_conn 选择负载最轻的服务器

  5. random 带权重的随机算法

这里个人推荐4,5两种,使用random使用two随机选择2个服务器,然后使用least_conn得到负载最小的一个,可避免羊群效应(存在多个节点时)

upstream{
    random two;
    server 127.0.0.1:80   #第一台服务器
    server ... weight=3   #第二台服务器
}

注意,有时候,同一个客户端的请求要转发到同一台服务器(各节点之间未做session共享),目前的nginx不支持,但是可以用其他第三方模块实现此功能

使用upstream 配置了上游集群和负载均衡之后,我们就可以在location或者serverz中用proxy_pass把客户端的请求转发到后端了,实现反向代理功能,如下面的额第九条

9.代理转发

location /abc/ {
    proxy_set_header Host $host;      #转发请求的原始头
    proxy_pass  http://127.0.0.1:8080; # url遇到abc 转发请求到8080端口
    或
    proxy_pass http://backend;        #转发upstream块定义的服务器集群 
}


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权所有 | 转载请标明出处