nginx优化


nginx配置文件
#这里是全局块,可以配置一些全局生效的配置,比如nginx启动用户,nginx的worke_press

events {
#event块,配置worker_connections,也是全局生效
}

http {
#http块,nginx服务器配置中的重要部分,代理,缓存,日志定义等绝大部分功能以及第三方配置都可以放在这个模块中。

server {
#server块和虚拟主机有密切关系,(不明白虚拟主机的概念请自行谷歌),每一个http块可以包含多个server块,在server块中配置虚拟主机需要监听的端口,IP或域名

location {
#每一个server块中可以包含多个location块,从严格意义上讲,location块只是server块的一个指令,它会接收到域名后面跟着的字符串,根据字符串来进行匹配,对特定请求进行处理,重定向,缓存,以及应答控制等功能。
}

}
}
}
user  nginx nginx;			
worker_processes  1;		

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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 {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/nginx-server/html$fastcgi_script_name;
            include        fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

user nginx nginx; ##用于配置运行nginx服务器用户(组)的指令

nobody nobody;``` user指令只能在全局快使用
```worker_processes 1; ``` ##是nginx服务器实现并发处理服务的关键所在收到软件本身,操作系统本身资源的限制 ```worker_processes auto|number;``` 使用后查看``` ps -aux|grep nginx```

root 2091 0.0 0.0 112712 960 pts/0 S+ 10:45 0:00 grep –color=auto nginx
root 2327 0.0 0.0 46364 2092 ? Ss May15 0:00 nginx: master process /home/nginx-server/sbin/nginx
nginx 31279 0.0 0.0 46776 2576 ? S 10:21 0:00 nginx: worker process

配置nginx存放进程pid路径
nginx进程作为系统的守护进程运行,我们需要在某文件中保存当前运行程序的主进程号
```pid filename;```
配置错误日志的存放路径
在全局快、http块、和server块中对可以对nginx服务器的日志进行相关配置。这里首先介绍全局块下日志的存放配置,后两种情况的配置基本相同,只是作用域不同。	使用的指令是error_log
```error_log file|stderr|[debug|info|notice|warn|error|crit|alert|emerg];```
从语法结构看nginx服务器的日志智齿输出到某一固定的文件file或者输出到标准错误输出stderr;日志分级别是可选项,由低到高debug(需要在编译的时候使用 ```--with-debug``` 开启debug开关),设置某一级别后,比这以及别搞得日志也会被记录。比如设置warn级别后,级别为warn以及error、crit|alert|emerg 都会被记录下来
templase
```error_log logs/error.log error;```

配置文件的导入
```include file;```
```include conf.d/*.conf```

设置网络连接的序列化
nginx配置中包含了这样一条指令 accept_mutex,当其设置为开启的时候,将会对多个nginx进程接收连接进行序列化,防止多个进程对连接的争抢。
```accept_mutex on |off;```
其指令默认开启,只能在events块中进行配置

设置是否允许同时接收多个网络连接
```multi_accept on|off;```
每个nginx服务器的worker process都有能力同时接收多个新到达的网络连接,但是这需要在配置文件中进行设置,其指令为multi_accept	
此指令默认为关闭状态,即每一个worker process一次只能接收一个新到达的网络连接, 此指令只能在events块中进行生效。

事件驱动选择
nginx服务器提供了多重是按驱动模型来处理网络信息。配置文件中为我们提供了相关的指令来强制nginx服务器选择哪种时间驱动模型进行消息处理,指令为use,语法结构为
```use method;```
其中method可选择的内容有:``` select 、poll 、kqueue 、 epoll 、 rtsig 、 /dev/null```以及```eventport ```
可以在编译时使用 ```--with-select_module```和```--without-select_module```设置强制编译 select模块到nginx内核。使用 ```--with-poll_module```和```--wothout-poll_module```设置是否强制编译poll模块到nginx内核。
此指令只能在events块中进行配置。

配置最大连接数
指令```worker_connections``` 主要用来设置允许每一个 worker process同事开启的最大连接数。其语法结构为
```worker_connections number;```
此指令的默认设置为512.
这里的number数不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数。另外 number值不能大于操作系统支持打开的最大文件句柄数量。

定义MIME=type
我们知道在常用的浏览器中,可以显示的内容有HTML.XML.GIF及Flash等种类繁多的文本、媒体库等资源,浏览器为了区分这些资源,需要使用MIME Type.换言之,MIME Type是网络资源的媒体类型。nginx服务器作为web服务器,必须能够识别前端请求的资源类型
在默认nginx配置文件中,我们按到在http全局块中有一下两行配置:
	```include mime.types;
	default_type application/octet-stream;```
第一行从外部引用了mime_types文件,我们来看一下他的内容分段
```shell
types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

从mime_types文件的内容分段可以看到,其中定义了一个types结构,结构中包含了浏览器能够识别MIME类型以及对应于相关类型的文件后缀名。由于mime_types是主配置文件应用的第三方文件,一次,types也是nginx配置文件中的一个配置块,我们也可以称之为types块,其用于定义MIME类型
第二行中使用指令default_type配置了用于处理前端请求的MIME类型,其语法结构为
default_type mime-type;
如果不加指令默认为text/plain 此指令还可以在http块 server块或者location块进行配置。

自定义服务目标日志

nginx服务器智齿对服务日志的格式、大小、输出等进行配置,需要使用两个指令,分别为access_log和logformat指令
access_log指令语法为
access_log path[format[buffer=size]]
path 配置服务日志的文件存放的路径和名称
format 可选项自定义服务日志的格式字符串,也可以通过 格式串的名称 使用log_format指令定义好的格式
size 配置临时存放日志的内存缓冲区大小

此指令可以在http块 、server块或者location块进行配置。

logs/access.log combined;``` combined 默认定义的日志格式字符串的名称
```access_log off;``` log_format 参数可以查看上篇文章nginx内置变量 ```log_format name string ,,,;``` teamplase ```shell http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';

配置允许sendfile方式传输文件
sendfile和sendfile_max_chunk以及他们的语法
sendfile on|off;
用于开启或者关闭使用sendfile()传输文件,默认值为off。可以在http块、server块或者location块中进行配置
sendfile_max_chunk size;
其中,size值如果大于0,nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过这个值,如果设置为0,则无限制。此指令可以在http块 server块或者location块中进行配置

配置连接超时时间
用户建立会话连接后,nginx服务器可以保持这些连接打开一段时间,指令keepalive_timeout就是用来设置此时间的,其语法结构
keepalive_timeout timeout[header_timeout];
timeout 服务器端对连接的保持时间。默认值为75s
header_timeout可选项,在应对报文头部的keep-alive域设置超时时间: keep-alive

此指令可以在server块和location块配置
```keepalive_timeout 120s 100s;```
其含义是,在服务端保持连接的时间设置为120s,发给用户端的应答报文头部总kepp-alive域的超时时间设置为100S
此指令可以在http块 server块或者location块中进行配置

单连接请求数上限
nginx服务器端和用户端建立会话连接后,用户端通过此链接发送请求,指令keepalive——requests用于限制用户通过某一连接向nginx服务器发送请求的次数
```keepalive_requests number;```
此指令还可以出现在server块和location块中,默认设置为100

配置网络监听
配置监听使用指令listen,其配置方法主要有三种,我们先分别介绍三种配置的语法结构,然后统一介绍设计的相关变量和标识符
第一种配置监听IP地址
```listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];```
第二种配置监听端口,其语法结构

listen port [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size]
[accept_filter=filter] [bind] [ipv6only=on|off] [ssl];

第三种配置unix Domain Socket	一种在原有Socket框架上发展起来的IPC机制,用于在单个主机上执行客户/服务器通信。

listen unix:path [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred]


```address ```IP地址,如果是IPv6地址 需要使用中括号[]括起来,比如[fe80::1]等
``port	```端口号	如果定义了IP地址没有定义端口号,就是用80端口
```path socket```文件路径,如/var/run/nginx.sock等
```default_server```	标识符	将此虚拟机主机设置为```address:port``` 的默认主机

注意
```setflb=number,```	nginx中使用这个变量为监听socket关联路由表,目前只对FreeBSD起作用 不常用
```backlog=number,```	设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认为-1,其他平台默认为511.
```revbuf=size,	```设置监听socket接收缓存区大小
```sndbuf=size,	```设置监听socket发送缓存区大小
```deferred,```标识符,	将accept()设置为Deferred模式。
```accept_filter=filter	```设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。
bind,标识符		使用独立的bind()处理次address:port 一般情况下,对于端口相同二IP地址不同的多个连接,nginx服务器将只是用一个监听命令,并使用bind()处理端口相同的所有连接。
ssl ,标识符 设置会话连接使用SSL模式进行,茨表示服和nginx服务器提供的https服务有关,

listen :80|:8000;
listen 192.168.1.1:8000;
listen 8000;
listen 192.168.1.10 default_server backlog=1024;

设置192.168.1.10的链接请求默认由此虚拟主机处理
        并且允许最多1024网络连接同事处于挂起状态。
        





Author: Thomas
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Thomas !
  TOC