Nginx技术深度剖析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx技术深度剖析相关的知识,希望对你有一定的参考价值。

(1)nginx核心模块:

Nginx核心模块负责Nginx的全局应用,主要对应用主配置文件的Main区块和Events区块区域,这里有很多Nginx必须的全局参数配置。

(2)标准的HTTP功能模块集合:

这些模块虽然不是必须的,但是是都很常用啊。因此会被Nginx自动编译安装到Nginx软件中。不建议擅自改动。除非明确知道要干什么,由什么额外的影响。

在生产环境中,配置调优主要就是根据这些模块进行相应的更改来实现的。通过官方文档可以查看。


企业中常用的Nginx http功能模块:

--------------------------------------------------------------------------------------------

ngx_http_core_module            | 包括一些核心的http参数配置,对应Nginx的配置为http区块

--------------------------------------------------------------------------------------------

ngx_http_access_module          | 访问控制模块,用来控制网站用户对Nginx的访问

--------------------------------------------------------------------------------------------

ngx_http_gzip_module            | 压缩模块,对Nginx返回的数据压缩,属于性能优化模块

--------------------------------------------------------------------------------------------

ngx_http_gzip_module            | Fast CGI模块,动态应用相关的模块,例如php

--------------------------------------------------------------------------------------------

ngx_http_proxy_module           | proxy代理模块

--------------------------------------------------------------------------------------------

ngx_http_upstream_module        | 负载均衡模块,可以对实现网站的负载均衡功能及节点的健康检查

--------------------------------------------------------------------------------------------

ngx_http_rewrite_module         | URL地址重写模块

--------------------------------------------------------------------------------------------

ngx_http_limit_conn_module      | 限制用户并发连接数及请求模块

--------------------------------------------------------------------------------------------

ngx_http_limit_req_module       | 根据定义的key限制Nginx请求过程的速率

--------------------------------------------------------------------------------------------

ngx_http_log_module             | 访问日志模块,指定的格式记录Nginx客户访问日志等信息

--------------------------------------------------------------------------------------------

ngx_http_auth_basic_module      | Web认证模块,设置Web用户通过账号、密码访问Nginx

--------------------------------------------------------------------------------------------

ngx_http_ssl_module             | SSL模块,用于加密的http连接,例如https

--------------------------------------------------------------------------------------------

ngx_http_stub_status_module     | 记录Nginx基本访问状态信息等的模块

--------------------------------------------------------------------------------------------


Nginx目录结构说明:

.

├── client_body_temp

├── conf                                     #Nginx默认所有配置文件目录,极其重要

│   ├── fastcgi.conf                         #fastcgi相关参数的配置文件

│   ├── fastcgi.conf.default                 #fastcgi.conf文件的原始配置文件备份

│   ├── fastcgi_params                       #fastcgi的参数文件

│   ├── fastcgi_params.default               #fastcgi的参数文件的备份文件

│   ├── koi-utf

│   ├── koi-win

│   ├── mime.types                           #媒体类型

│   ├── mime.types.default                   #媒体类型默认配置备份

│   ├── nginx.conf                           #Nginx的主配置文件

│   ├── nginx.conf.default                   #Nginx的主配置文件的默认配置文件

│   ├── scgi_params                          #scgi相关参数文件,一般用不到

│   ├── scgi_params.default                  #scgi相关参数文件的备份

│   ├── uwsgi_params                         #uwsgi相关参数文件,一般用不到

│   ├── uwsgi_params.default                 #uwsgi相关参数文件的备份文件

│   └── win-utf

├── fastcgi_temp                             #fastcgi临时数据目录

├── html                                     #编译安装时Nginx的站点目录,Apache默认是htdocs

│   ├── 50x.html                             #错误页面,优雅的显示错误

│   └── index.html                           #默认使用的首页文件,一般会是这个,不是必须。

├── logs                                     #Nginx默认的日志路径,包括错误日志及访问日志

│   ├── access.log                           #Nginx的访问日志文件,使用tail -f access.log命令实时观看网站用户的访问情况。

│   ├── error.log                            #Nginx的错误日志文件,Nginx故障信息会报错到该文件。

│   └── nginx.pid                            #Nginx的pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件 。

├── proxy_temp                               #临时目录

├── sbin                                     

│   └── nginx

├── scgi_temp                                #临时目录

└── uwsgi_temp                               #临时目录


Nginx.conf主配置文件:

/application/nginx/conf/nginx.conf:

Nginx的配置文件使用井号(#)注释没有用的配置语句。

整个文件都是以区块的形式组织起来的;

Main区位于最上层,在Main区下面可以有Events区、HTTP区等层级;

在HTTP区中包含一个或多个server区,每个server区中又有一个或多个location区。

#user  nobody;

worker_processes  1;                         #Nginx的work进程数量

#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;                #每个worker进程支持的最大连接数

}

http {

    include       mime.types;                #Nginx支持的媒体类型库文件

    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;                    #提供服务的端口,默认是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  /scripts$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;

    #    }

    #}

}


Nginx的其他配置文件:

如果是配合动态服务(例如PHP服务),Nginx软件还会用到扩展的FastCGI相关配置文件,这个配置是通过再nginx.conf主配置文件中嵌入include命令实现的,不过默认是注释状态。

/application/nginx/conf/fastcgi.conf:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

fastcgi_param  QUERY_STRING       $query_string;

fastcgi_param  REQUEST_METHOD     $request_method;

fastcgi_param  CONTENT_TYPE       $content_type;

fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

fastcgi_param  REQUEST_URI        $request_uri;

fastcgi_param  DOCUMENT_URI       $document_uri;

fastcgi_param  DOCUMENT_ROOT      $document_root;

fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  REQUEST_SCHEME     $scheme;

fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;

fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;

fastcgi_param  REMOTE_PORT        $remote_port;

fastcgi_param  SERVER_ADDR        $server_addr;

fastcgi_param  SERVER_PORT        $server_port;

fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect

fastcgi_param  REDIRECT_STATUS    200;


/application/nginx/conf/fastcgi_params:


fastcgi_param  QUERY_STRING       $query_string;

fastcgi_param  REQUEST_METHOD     $request_method;

fastcgi_param  CONTENT_TYPE       $content_type;

fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

fastcgi_param  REQUEST_URI        $request_uri;

fastcgi_param  DOCUMENT_URI       $document_uri;

fastcgi_param  DOCUMENT_ROOT      $document_root;

fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  REQUEST_SCHEME     $scheme;

fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;

fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;

fastcgi_param  REMOTE_PORT        $remote_port;

fastcgi_param  SERVER_ADDR        $server_addr;

fastcgi_param  SERVER_PORT        $server_port;

fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect

fastcgi_param  REDIRECT_STATUS    200;

本文出自 “帅帅的小哥哥” 博客,请务必保留此出处http://xvjunjie.blog.51cto.com/12360960/1955109

以上是关于Nginx技术深度剖析的主要内容,如果未能解决你的问题,请参考以下文章

万字长文深度剖析 RocketMQ 设计原理

深度剖析移动电商的技术架构

干货分享:深度学习框架技术剖析

深度剖析Spring Boot自动装配机制实现原理

车险行业图像识别技术深度剖析

AJAX技术分享深度剖析AJAX全记录