Nginx 服务器配置和详解

技术分享 Story 88浏览 0评论

目录
  • Nginx 服务器配置和详解
    • Nginx 模板配置
    • Nginx 模块说明
      • 核心模块
        • 主模块
        • event 模块
      • http 模块
        • upstream 模块
        • server 模块
        • location 模块

Nginx 服务器配置和详解

Nginx 扮演 web 开发的服务端入口控制的角色,相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率。这需要开发人员对其配置有一定程度的了解,主要用到的是负载均衡和反向代理这两项功能。

Nginx 模板配置

user  www www;

worker_processes  2;

pid /var/run/nginx.pid;

#[ debug | info | notice | warn | error | crit ]

error_log  /var/log/nginx.error_log  info;

events {
    worker_connections   2000;

    # use [ kqueue | epoll | /dev/poll | select | poll ];
    use kqueue;
}

http {

    include       conf/mime.types;
    default_type  application/octet-stream;


    log_format main      \'$remote_addr - $remote_user [$time_local] \'
                         \'"$request" $status $bytes_sent \'
                         \'"$http_referer" "$http_user_agent" \'
                         \'"$gzip_ratio"\';

    log_format download  \'$remote_addr - $remote_user [$time_local] \'
                         \'"$request" $status $bytes_sent \'
                         \'"$http_referer" "$http_user_agent" \'
                         \'"$http_range" "$sent_http_content_range"\';

    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;

    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    gzip on;
    gzip_min_length  1100;
    gzip_buffers     4 8k;
    gzip_types       text/plain;

    output_buffers   1 32k;
    postpone_output  1460;

    sendfile         on;
    tcp_nopush       on;
    tcp_nodelay      on;
    send_lowat       12000;

    keepalive_timeout  75 20;

    #lingering_time     30;
    #lingering_timeout  10;
    #reset_timedout_connection  on;


    server {
        listen        one.example.com;
        server_name   one.example.com  www.one.example.com;

        access_log   /var/log/nginx.access_log  main;

        location / {
            proxy_pass         http://127.0.0.1/;
            proxy_redirect     off;

            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            #proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            client_body_temp_path      /var/nginx/client_body_temp;

            proxy_connect_timeout      70;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_send_lowat           12000;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;

            proxy_temp_path            /var/nginx/proxy_temp;

            charset  koi8-r;
        }

        error_page  404  /404.html;

        location = /404.html {
            root  /spool/www;
        }

        location /old_stuff/ {
            rewrite   ^/old_stuff/(.*)$  /new_stuff/$1  permanent;
        }

        location /download/ {

            valid_referers  none  blocked  server_names  *.example.com;

            if ($invalid_referer) {
                #rewrite   ^/   http://www.example.com/;
                return   403;
            }

            #rewrite_log  on;

            # rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3
            rewrite ^/(download/.*)/mp3/(.*)\..*$
                    /$1/mp3/$2.mp3                   break;

            root         /spool/www;
            #autoindex    on;
            access_log   /var/log/nginx-download.access_log  download;
        }

        location ~* \.(jpg|jpeg|gif)$ {
            root         /spool/www;
            access_log   off;
            expires      30d;
        }
    }
}

上述模板来自于 Nginx 官方示例

Nginx 模块说明

核心模块

控制整个 Nginx 的基本功能和程序配置

主模块

user www www;
worker_processes 2;

error_log /var/log/nginx-error.log info;
...
  • user user [group]:定义运行 Nginx 的用户和其所在组,该项默认 ser nobody nobody 可以使用默认配置。在 linux 系统上,一切皆文件,每个文件都有其访问权限,如果访问了权限外的文件,客户端会接受到服务端 403 错误。不设置 group 则组名与用户名一致。
  • worker_processes number | auto:工作进程数,一般与 cpu 核心数保持一致,可以设置为 auto,Nginx 可以自动调整为最佳个数。
  • error_log file [level]:日志存放目录,level 日志输出等级
  • pid file :进程 id 存储位置
  • worker_cpu_affinity:工作进程与 cpu 绑定
worker_processes    4;
\\1表示对应cpu核心工作
worker_cpu_affinity 0001 0010 0100 1000;
  • worker_rlimit_nofile number:一个工作进程可打开的最大文件数,设置该值后 worker_connections 不能超过该值,理论上这个值是最多打开文件数(ulimit -n)与 Nginx 工作进程相除。

event 模块

events {
    use kqueue;
    worker_connections 2048;
}
...
  • use method:事件模型,Linux 系统下设置有效,默认会找出最适合系统的事件模型,常用 use epoll
  • worker_connections number:设置最大并发连接数,该值不仅仅是与客户端连接。通过 worker_connectionsworker_proceses 可以计算出 max_clients = worker_processes * worker_connections,作为反向代理,max_clients = worker_processes * worker_connections/4
  • multi_accept on | off:关闭时一个进程只接受一个连接,开启时尽可能接受连接,连接放进监听队列

http 模块

配置 http 服务相关

  • include:定义文件扩展名,该文件包含类型映射表
  • default_type :默认解析类型
  • limit_req_zone key zone=name:size rate=rate:如limit_req_zone $binary_remote_addr zone=limit:10m rate=1r/s;,10m 缓存,每秒仅允许统一 ip 访问一次 超出频率或者缓存超出则返回 503
  • sendfile on | off:开启后 Nginx 使用零拷贝的方式输出文件,一般设置为 on,对于磁盘 IO 重负债应用时可以设置 off
  • tcp_nopush on | off:激活 tcp_nopush 参数可以允许把 http response header 和文件的开始放在一个文件里发布或者发送一个满包的文件,传输大量数据有利,只有 sendfile 起效是才有作用
  • tcp_nodelay on | off:启用后会禁用 Nagle 算法,尽快发送数据,Nginx 只会针对 keep-alive 状态的起作用,该选项看似与tcp_nopush矛盾,但同时启用产生的效果是先填满包在尽快发送
  • keepalive_timeout:连接超时时间

upstream 模块

upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    #server 192.168.1.116  backup;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

该模块主要完成负载均衡功能

  • server address [parameters]
  • weight:代表权重,权重越高被分配的记录越大
  • max_conns:限制最大活动连接数,默认为 0,表示没有限制
  • fail_timeout=time:与服务器通信失败时长,默认 10 s
  • max_fails:设置在 fail_timeout 内连接到主机的失败次数,超过该次数则认为该主机不可用

server 模块

server {
    server_name ~^(www\.)?(.+)$;

    location / {
        root /sites/$2;
    }
}
  • listen:可设置为只是监听 ip 地址,或者端口,也可以是两者都有,也可以是主机名称
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
  • server_name name ...:主机名称,可以使用通配符,多个主机空格隔开

location 模块

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

该模块完成对请求分类处理

  • = 开头表示精确匹配

  • 单个 / 表示通用匹配任何请求都能匹配到

  • ^~ 表示匹配 url 路径

  • ~ 表示区分大小写的正则匹配

  • ~* 表示不区分大小写的正则匹配

  • !~ 表示区分大小写的正则不匹配

  • !~* 表示不区分大小写的正则不匹配

  • proxy_pass URL:代理服务器地址

  • proxy_set_header field value:代理请求头设置,Nginx 可以重新定义或附加请求表头

//主机名称
proxy_set_header Host  $host;
//真实请求 ip,如果不存在该字段,则该$proxy_add_x_forwarded_for变量等于该$remote_addr变量。
proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
proxy_set_header  X-Real-IP  $remote_addr;  

转载请注明:成长的对话 » Nginx 服务器配置和详解