Nginx配置详解

目录

简介

Nginx是什么?

Nginx全局配置

全局配置之事件类配置

使用Nginx的HTTP模块配置静态Web服务器

HTTP配置项

HTTP客户端配置项

 文件操作配置项

虚拟主机与请求分发

网络连接配置

server配置块

使用Nginx的HTTP的代理模块配置反向代理服务器

Nginx四层代理


简介

        在公司的工作中,接触到阿里云的组网方式和网络架构这一块,其中除了SLB,最常用的还有Nginx Web服务器。其中涉及到Nginx的四层代理、七层代理、静态路由、反向代理等知识。在参阅了相关的学习资料后,今天就对常用的Nginx模块以及配置方法做一个较为详细的总结记录。

Nginx是什么?

        Nginx是俄罗斯的Igor Sysoev在为Rambler Media工作期间,使用C语言开发的具有高可靠性、高性能、高扩展性且支持诸多操作系统等特性的跨平台的Web服务器,使用Nginx服务器,能够减小其上游服务器的压力。因为其出色的性能,其作为Web服务器被广泛应用到了大流量的网站上,如国内的腾讯、网易和阿里等等。

        Nginx中包含了许多的模块,用户在安装的时候可以根据自己具体使用到的模块进行安装,目前使用最多的应该就是HTTP模块,使用HTTP的代理模块属于Nginx的七层应用代理,本文的末尾会补充讲一下Nginx的四层应用代理,以及它们之间的区别。首先,我们就从最常用的HTTP模块讲起,介绍具体使用过程中如何配置使用HTTP模块。

Nginx全局配置

        默认编译安装Nginx后,Nginx的默认安装根目录为/usr/local/nginx,Nginx默认的可执行文件的路径为/usr/local/nginx/sbin/nginx,Nginx默认的配置文件路径为/usr/local/nginx/conf/nginx.conf,用户可以通过参数在编译时自行设置Nginx的这些路径。在Nginx的配置文件中,大概由以下的一些配置项组成,Nginx全局配置、Nginx事件类配置、Nginx模块配置(如HTTP模块),其中模块配置中又包含了虚拟服务器配置块、location配置块、负载均衡配置块等等。这些配置定义了Nginx的工作方式。在Nginx的配置中,可以使用include包含预定义的配置文件,只要保证配置文件格式正确,include可以被包含在HTTP、Server等配置块。

        首先需要介绍的是Nginx的全局配置,具体的配置字段及说明如图

Nginx配置详解_第1张图片

全局配置之事件类配置

其中最后两个配置项应当放在events事件类配置项中,在事件类配置项中还可以配置以下配置项

负载均衡锁:

accept_mutex on(默认)/off;

负载均衡锁文件路径:

lock_file path/file;

使用负载均衡锁后到真正建立连接时间的最大延迟:

accept_mutex_delay 1000ms(默认500ms);

批量建立新连接:

multi_accept on/off(默认);

选择事件模型(对于Linux来说有以下三种,如果未选择的话Nginx会自动使用最适合的事件模型):

use poll/select/epoll;

Nginx配置文件的顶部应该应该先定义全局配置,因此该配置处于Nginx的配置文件顶部。

使用Nginx的HTTP模块配置静态Web服务器

        在Nginx的配置中定义了全局配置之后,就可以开始对Nginx中使用的模块进行配置,本文主要针对HTTP模块的配置做详细讲解。在Nginx中支持使用HTTP模块配置静态Web服务器,所谓静态Web服务器,也就是不使用反向代理,Nginx在接收到请求后不通过上游的服务器处理,而是直接由Nginx处理并返回请求。由于Nginx的功能很强大,涉及到的配置项较多,这里只列出了常用的一些配置项。

HTTP配置项

        使用Nginx的HTTP模块时,server配置块,location配置块都是包含在HTTP配置块中的,首先我们需要定义HTTP的相关配置参数,其实也就是和HTTP请求相关的一些参数,常见的配置项如下

HTTP客户端配置项

        该配置项放在HTTP配置块中,用以定义Nginx如何处理客户端请求

Nginx配置详解_第2张图片

Nginx配置详解_第3张图片

 表中给出了每个配置项对应的含义,个人觉得client_max_body_size这一项的解释有误,该指令定义的应该是运行最大的客户端请求体,在其他资料中已证实了该配置项确实是限制客户端请求体的。

 文件操作配置项

        在用户请求中需要对文件进行一些操作使,该配置项定义了Nginx如何处理文件操作

        Nginx配置详解_第4张图片Nginx配置详解_第5张图片

虚拟主机与请求分发

        在Nginx的配置中,每个server块就定义了一个虚拟主机,为了提高Nginx寻找对应server的能力,Nginx中使用散列表来存储server name,以下是关于Nginx中HTTP模块散列表的一些配置项

Nginx配置详解_第6张图片

网络连接配置

       除了以上配置,Nginx允许定义HTTP请求中的网络连接配置, 配置项如下

Nginx配置详解_第7张图片

server配置块

        在HTTP模块中定义server,即定义虚拟主机对请求进行处理,在server配置块中,主要配置server_name和监听相关的配置,监听使用listen参数配置,具体的配置项如下

Nginx配置详解_第8张图片

在server配置块中,需要对HTTP请求进行路由匹配和处理,路由匹配在server中通过location配置块进行定义,location模块的匹配规则如下

Nginx配置详解_第9张图片

location中的@表示该路由仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求。location还可以使用正则表达式进行匹配,并且可以设置资源路径,也可以根据HTTP返回码重定向页面。

 

使用Nginx的HTTP的代理模块配置反向代理服务器

        上面的配置是针对静态Web服务器的,当我们需要使用反向代理处理请求时,我们在server配置块中的location中就不仅仅是返回静态的请求,而是通过代理将请求代理到上游服务器,location中反向代理的配置项如下

Nginx配置详解_第10张图片

Nginx配置详解_第11张图片        与代理配置项相关的是负载均衡配置块,通过upstream配置块,我们可以定义一组上游服务器,并且通过反向代理将请求代理到upstream定义的服务器组中,Nginx会根据负载均衡的算法代理到不同的上游服务器中。

        与upstream相关的配置项如下

Nginx配置详解_第12张图片

这里找了一份配置文件,方案作为配置项的参考

 
user  testgroup testuser;
 
worker_processes  8;
 
error_log  logs/error.log;
 
#error_log  logs/error.log  notice;
 
#error_log  logs/error.log  info;
 
pid        logs/nginx.pid;
 
 
events {
 
    use epoll;
 
    worker_connections  2048;
 
}
 
 
 
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  65;
 
  # gzip压缩功能设置
 
    gzip on;
 
    gzip_min_length 1k;
 
    gzip_buffers    4 16k;
 
    gzip_http_version 1.0;
 
    gzip_comp_level 6;
 
    gzip_types text/html text/plain text/css text/javascript application/json         
    application/javascript application/x-javascript application/xml;
 
    gzip_vary on;
 
  # http_proxy 设置
 
    client_max_body_size   10m;
 
    client_body_buffer_size   128k;
 
    proxy_connect_timeout   75;
 
    proxy_send_timeout   75;
 
    proxy_read_timeout   75;
 
    proxy_buffer_size   4k;
 
    proxy_buffers   4 32k;
 
    proxy_busy_buffers_size   64k;
 
    proxy_temp_file_write_size  64k;
 
    proxy_temp_path   /usr/local/nginx/proxy_temp 1 2;
 
  # 设定负载均衡后台服务器列表 
 
    upstream  backend  { 
 
              ip_hash; 
 
              server   192.168.10.10:8080 max_fails=2 fail_timeout=30s ;  
 
              server   192.168.10.11:8080 max_fails=2 fail_timeout=30s ;  
 
    }
 
 
 
  # 虚拟主机配置
 
    server {
 
        listen       80;
 
        server_name  itoatest.example.com;
 
        root   /apps/oaapp;
 
        charset utf-8;
 
        access_log  logs/host.access.log  main;
 
        #负载均衡与反向代理
 
        location / {
 
            root   /apps/oaapp;
 
            index  index.jsp index.html index.htm;
 
            proxy_pass        http://backend;  
 
            proxy_redirect off;
 
            # 通过该配置后端可以通过X-Forwarded-For获取用户真实IP
 
            proxy_set_header  Host  $host;
 
            proxy_set_header  X-Real-IP  $remote_addr;  
 
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
 
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
 
 
        }
 
        #静态文件,nginx处理请求
 
        location  ~* /download/ {  
 
            root /app;  
 
        }
 
 
        location /nginx_status {
 
            stub_status on;
 
            access_log off;
 
            allow 192.168.10.0/24;
 
            deny all;
 
        }
 
        location / {   
 
            deny all;   
 
        }
 
        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;
 
        }
 
    }
 
 
}

Nginx四层代理

        上面讲的内容是基于HTTP模块的,自然也是基于七层应用代理的,我们都知道在OSI七层模型中,HTTP是属于应用层的,Nginx的Stream模块,支持Nginx做四层代理,也就是在传输层做代理,我们在HTTP模块之前可以定义Nginx的四层代理,其配置方法较为简单,与HTTP模块的配置方式极为相似,如下是一个简单的示例

stream {
      server {
          listen 18081;
          proxy_pass testserver;
      }
      upstream testserver{
          server 10.0.0.1:80 weight=5;
          server 10.0.0.2:80 weight=5;
      }
}

        四层代理与七层代理的不同之处在于,四层代理不用等待HTTP请求解析和读取完成便可以直接代理到上层服务器,因此四层代理的速度是要快于七层代理的,但是,七层代理中根据HTTP请求的内容,可以做出更加丰富的操作。所以说可以根据实际的需求选择Nginx的代理方式。

        文中的一些内容讲解得不够全面,Nginx的功能强大,写博客的时间有限,因此也做不到面面俱到,关于文中提到的内容,可以推荐给读者两本书,一本是《深入理解Nginx:模块开发与架构解析》,另一本是《精通Nginx(第2版)》。两本都是比较好的Nginx教材,特别推荐第一本。另外声明,文中的图片来自《精通Nginx》一书,很多配置项在第一本书中有更详细的讲解

你可能感兴趣的:(Web服务器,Nginx,nginx)