Nginx配置文件详解

一、概述

1.1 服务器文件分布

  • /etc/nginx/
    # nginx可以代理多个网站,每个网站分配一个虚拟主机,
    # 此文件夹内可配置每个域名对应的虚拟主机,
    # 内部*.conf文件均会包含进nginx.conf文件内
    drwxr-xr-x 1 root root conf.d
    # 使用快速通用网关接口 配置参数:见0.2节
    -rw-r--r-- 1 root root fastcgi_params
    # 使用简单通用网管接口规范 配置参数:见0.2节
    -rw-r--r-- 1 root root scgi_params
    # 使用Web服务网关接口规范 配置参数:见0.2节
    -rw-r--r-- 1 root root uwsgi_params
    # nginx解析文件类型: 内容如 text/css  css;等
    -rw-r--r-- 1 root root mime.types
    # nginx服务器的模块存放位置
    lrwxrwxrwx 1 root root modules -> /usr/lib/nginx/modules
    # nginx主配置文件,内有include语句包含第一个文件夹内所有*.conf文件
    -rw-r--r-- 1 root root nginx.conf
    
  • /var/log/nginx/*.log:所有Nginx日志文件
  • /usr/share/nginx/html/*.html:配置文件在此文件夹中找index.html文件返回前端(*.conf配置)

1.2 网关接口规范

  1. CGI(Common Gateway Interface,通用网关接口)
    CGI 是一种通用网关接口规范,该规范详细描述了 Web 服务器和请求处理程序(脚本解析器)在获取及返回数据过程中传输数据的标准,如 HTTP 协议的参数名称等。大多数 Web 程序以脚本形式接收并处理请求,然后返回相应数据,如脚本程序 PHP、JSP、Python 等。

  2. FastCGI(Fast Common Gateway Interface,快速通用网关接口)
    FastCGI 是 CGI 的增强版本,其将请求处理程序独立于 Web 服务器之外,并通过减少系统为创建进程而产生的系统开销,使 Web 服务器可以处理更多的 Web 请求。FastCGI 与 CGI 的区别在于,FastCGI 不像 CGI 那样对 Web 服务器的每个请求均建立一个进程进行请求处理,而是由 FastCGI 服务进程接收 Web 服务器的请求后,由自己的进程自行创建线程完成请求处理。

  3. SCGI(Simple Common Gateway Interface,简单通用网关接口)
    SCGI 是 CGI 的替代版本,它与 FastCGI 类似,同样是将请求处理程序独立于 Web 服务器之外,但更容易实现,性能比 FastCGI 要弱一些。

  4. WSGI(Web Server Gateway Interface,Web 服务网关接口)
    WSGI 是为 Python 语言中定义的 Web 服务器与 Python 应用程序或框架间的通用通信接口,可以使 Python 应用程序或框架与支持这一协议的不同Web服务器进行通信。常见的 Python Web 框架都实现了该协议的封装。
    参照博客

二、nginx.conf文件

2.1 通用配置

  • 文件内容
    ###################通用配置###################
    # 定义Nginx运行的用户名
    user nginx;
    # nginx进程数,不大于CPU核数,此处自动判断
    worker_processes auto;
    # 全局错误日志定义类型,记录严重性≥以下选定的选项
    # [ debug | info | notice | warn | error(默认) | crit | alert | emerg ]
    error_log /usr/local/nginx/logs/error.log info;
    # 进程pid文件
    pid /usr/local/nginx/logs/nginx.pid;
    # 一个nginx的worker进程可以打开的最多文件数目
    # 默认ulimit -a中限值,此项覆盖上个命令,选此值即可
    worker_rlimit_nofile 65535;
    
    # 参考事件模型:针对不同系统有不同的Nginx模板
    events
    {
    	# 见2.2节:event模块
    }
      
    # http服务器设置区
    http
    {   
        # http全局配置区:见2.3.1节 
        # 负载均衡:见2.3.2节
        
        # 虚拟主机配置区:此块可以有多个,通过内部server_name区分
        server
        {   
        	# 见2.3.3节      
        }
        # 此处也为http全局配置区
    }	
    

2.2 event模块

  • 模块内容
    events
    {
        # 参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 
        # epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,默认
        use epoll;
    
        # 单个Nginx的worker进程最大连接数,不超过2.1的worker_rlimit_nofile项 
        worker_connections 65535;
    
    	# 收到一个新连接通知后接受尽可能多的连接,否则一个工作进程只能同时接受一个新的连接
    	multi_accept on; 	   
    }
    

2.3 http模块

2.3.1 http全局设置

  • 通用配置
    http
    {
    	# include 引入包含文件,将其他配置文件插入此处,
        # mime.types:文件扩展名与文件类型映射表,如:application/json  json等
        # post请求头中、响应头中的Content-Type项,在http中用于标识传输数据的类型
        # 查Mime 类型映射表获取详细映射    
        include mime.types;
    
        # 默认文件类型:二进制流数据,不在上述映射表中即以此标识数据流
        default_type application/octet-stream;
    
        #默认编码
        #charset utf-8;
    
        # 服务器名字的hash表大小,配置多个server虚拟主机必须配置,
        # 否则nginx 启动不了,而且nginx -t命令错误
        server_names_hash_bucket_size 512;
        #客户端请求头部的缓冲区大小,默认即可
        client_header_buffer_size 32k;	
        #客户请求头缓冲超若上一条,用这一条救急
        large_client_header_buffers 4 32k;	
        #设定请求体大小,常用来限制上传文件大小
        client_max_body_size 50m;
    
        # 文件上传:普通应用,必须设为on,指令指定nginx是否调用sendfile函数
        # (zero copy)来输出文件,如果用来进行下载等应用磁盘IO重负载应用,可
        # 设置为off,以平衡磁盘与网络IO处理速度
        sendfile on;
    
        # 开启目录列表访问,适合下载服务器,默认关闭
        # 功能类似镜像网站,如 http://mirrors.aliyun.com/centos/7/
        autoindex on;
    
        # 针对sendfile开启时才启用此设置,
        # 数据包会累计到一定大小之后才会发送
        tcp_nopush on;
        # 针对处于keep-alive状态的TCP连接才启用此设置,
        # 数据包不缓存,直接发送
        tcp_nodelay on;
    
        # 连接超时时间,单位是秒
        keepalive_timeout 60;
    
        #FastCGI相关参数是为了改善网站的性能,
        #   减少资源占用,提高访问速度
        # 	下面参数看字面意思都能理解
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_intercept_errors on;
    
        # gzip模块设置
        #开启gzip压缩输出
        gzip on; 
        # 响应头的"Content-Length"大于1k时才压缩
        gzip_min_length 1k;    
        # 压缩缓冲区
        gzip_buffers 4 16k;    
        # 压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
        gzip_http_version 1.1;    
        #压缩等级:4~6
        gzip_comp_level 4;    
        # 压缩类型:对应mime.types文件的映射表
        gzip_types text/plain application/x-javascript text/css application/xml;    
        # 若请求头包含常规Accept协商字段之外的请求头字段,那么响应头中必须包含 Vary 字段
        # 例如 User-Agent, Cookie这些
        gzip_vary on;
    
        # limit_zone限制客户端连接的模块
        limit_conn_zone $binary_remote_addr zone=perip:10m;
        limit_conn_zone $server_name zone=perserver:10m;
    
    	# nginx隐藏版本号,防止针对软件版本的漏洞攻击
    	server_tokens = off
        ......
    }
    

2.3.2 负载均衡

  • 配置文件注释
    http
    {
    	# 全局配置区 
    	......
    	# 负载均衡区:可定义多个负载均衡
    	# 1、轮询
    	# weight是权重,权值越高被分配到的几率越大。
        upstream server_pool_1 {     
           server 192.168.1.2:80 weight=3;
           server 192.168.1.3:80 weight=2;
           server 192.168.1.4:80 weight=3;
    	}
        # 2、ip_hash
        # 每个请求按访问ip的hash结果分配,这样每个访客固定访问
        # 一个后端服务器,可以解决session的问题
        upstream server_pool_2 {
            ip_hash;
            server 192.168.1.11:80;
            server 192.168.1.12:80;
        }
        # 3、fair(第三方)
        # 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
        upstream server_pool_3 {
            server 192.168.1.21:80;;
            server 192.168.1.22:80;;
            fair;
        }
    
        # 定义负载均衡设备的Ip及设备状态
        upstream server_pool_4 {
            ip_hash;
            # 当前的server暂时不参与负载
            server 127.0.0.1:9090 down;
            server 127.0.0.1:8080 weight=2;
            server 127.0.0.1:6060;
            # 当其它所有非backup机器忙的时候,才请求此机器
            server 127.0.0.1:7070 backup;
        }
        # 在需要使用负载均衡的server中增加 proxy_pass http://server_pool_1/;
        ......
    }
    

2.3.3 虚拟主机

1 虚拟主机配置
  • 配置文件注释
    http
    {
    	# 全局配置区 
    	......
    	# 负载均衡区 
    	......
    	# 虚拟主机:同一台主机上可以有多个虚拟主机,虚拟主机之间是完全独立的,
    	# 每台虚拟主机都可以作为一个独立的网站,
    	# 可以具有独立的域名,具有完整的Intenet服务器功能
        server
        {
        	# Nginx通过:域名:端口 匹配对应的虚拟主机,
        	# 并通过location匹配对应的路由,
            # 虚拟主机监听端口:一个端口可以多个虚拟主机监听
            listen 80;
    
            # 虚拟主机域名:没域名写IP地址,
            # 可以有多个,用空格隔开,可以使用正则表达式
            server_name doubi.com 192.168.1.111;
            # 进入默认根目录寻找以下文件
            index index.html index.htm index.php;
            # 默认根目录,若location中有root或alias,则拼接在此后面
            root /www/wwwroot/doubi.com;
             
            # 图片缓存时间设置,location见下节
            location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
            {
                expires 10d;
                error_log /dev/null;
            	access_log /dev/null;
            }
             
            # JS和CSS缓存时间设置,location见下节
            location ~ .*.(js|css)?$
            {
                expires 1h;
                error_log /dev/null;
            	access_log /dev/null;
            }
            #################反向代理################
    		# 访问http://doubi.com/api/地址时,会转发到
    		# http://127.0.0.1:6666/,6666接口收到的客户
    		# ip始终为127.0.0.1,反向代理见文末
    		location /api/
    	    {
    	        proxy_pass http://127.0.0.1:6666/;
    	        proxy_connect_timeout 10;
    	    }
    	    # 此处反向代理到上面负载均衡server_pool_1中
    		location /api2/
    	    {
    	        proxy_pass http://server_pool_1/;
    	    }
            #################反向代理结束##############
            
            #################日志格式设定##############
            # $remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
            # $remote_user:用来记录客户端用户名称;
            # $time_local: 用来记录访问时间与时区;
            # $request: 用来记录请求的url与http协议;
            # $status: 用来记录请求状态;成功是200,
            # $body_bytes_sent :记录发送给客户端文件主体内容大小;
            # $http_referer:用来记录从那个页面链接访问过来的;
            # $http_user_agent:记录客户浏览器的相关信息;
            # 通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,
            # 通过$remote_add拿到的IP地址是反向代理服务器的iP地址。
            # 反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,
            # 用以记录原有客户端的IP地址和原来客户端的请求的服务器地址
            log_format main '$remote_addr - $remote_user [$time_local] "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" $http_x_forwarded_for';	         
            #定义本虚拟主机的访问日志,main为上一条的日志格式名
            access_log  /www/wwwlogs/doubi.com.log main;
        	error_log  /www/wwwlogs/doubi.com.error.log main;    
    	}
    	# 可以再接着写
    	server
        {
        	......
        }  	
    }
    
2 location路由匹配
  • 格式

    server
    {
    	......
    	location [=|~|^~] /uri/ {
    		# 匹配到路由后的操作
    	}
    	......
    }
    
  • 路径优先级

    优先级匹配写法匹配意义
    1= /a/精准匹配符=,路由起始/a/ 即匹配
    2 ^~ /a/非正则匹配符^~,路由起始/a/ 即匹,注意空格位置
    3~ .*\.m$正则匹配符~,路由不一定为起始匹配后缀名为.m的路由,如/a/1.m,注意空格;写法:~* 正则表达式,不区分大小写的正则匹配;默认非从头开始匹配,详见正则写法
    4/static/普通匹配,路由起始为/static/的;/匹配任意路由,优先级最低

  • 单一类型命中

    • 命中的路由包含1:最高优先级原则
      location = /a/ { return 401; }
      # http://localhost/a/b/,路由起始匹配即返回,不再匹配2~4
      
    • 命中多个1或2或4:最长命中原则
      location = /a/   { return 401; }
      location = /a/b/ { return 402; }
      # http://localhost/a/,    返回401
      # http://localhost/a/b/,  返回402
      # http://localhost/a/b/c/,返回402
      
    • 命中多个3:书写优先原则
      location ~ /a/ { return 401; }
      location ~ /b/ { return 402; }
      # http://localhost/a/b/,返回401
      
      location ~ /b/ { return 402; }
      location ~ /a/ { return 401; }
      # http://localhost/a/b/,返回402
      
  • 复合类型命中(排列组合)

    • 同时命中2和3:返回2,此处3被屏蔽
      location ^~ /a/  { return 401; }
      location ~ /a/b/ { return 402; }
      # http://localhost/a/b/,返回401
      # http://localhost/c/a/b/,返回402,注意第一个未被命中,非起始路由
      
    • 同时命中2和4:最长命中原则,2和3和4 等价于2和4,因为此处3被屏蔽
      location ^~ /a/  { return 401; }
      location ~ /a/b/ { return 402; }
      location /a/b/c/ { return 403; }
      # http://localhost/a/b/c/d/,返回403,跟书写顺序无关
      
    • 同时命中3和4:返回3
      location ~ /a/b/ { return 402; }
      location /a/b/c/ { return 403; }
      # http://localhost/a/b/c/d/,返回402,跟书写顺序无关
      
3 反向代理、root、alias、index
  • 反向代理
    # 访问 http://域名/api/a/ 时,nginx会将请求转发到
    # http://127.0.0.1:6666/a/,6666接口收到的客户
    # ip始终为127.0.0.1,
    location /api/
    {
        proxy_pass http://127.0.0.1:6666/;
        # 将客户端真实IP也转发给后端
        proxy_set_header  X-Real-IP  $remote_addr;
    }
     # 此处反向代理到负载均衡server_pool_1中
    location /api2/
    {
        proxy_pass http://server_pool_1/;
        # 将客户端真实IP也转发给后端
        proxy_set_header  X-Real-IP  $remote_addr;
    }
    # 联合uwsgi服务器
    location /api3/ {
        include uwsgi_params;
        # 此处会将路由完整追加到*:2048后
        uwsgi_pass 192.168.1.217:2048;
        # 以下语句用于传递客户端真实IP:Django用request.META['X-Real-IP']
        uwsgi_param X-Real-IP $remote_addr; 
        uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for; 
        uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto; 
    }
    
  • root与alias
    location /img/ {
    	alias /var/;
    }
    # 路由别名:请求/img/1.jpg时,Nginx会获得/var/1.jpg
    # 只可在location中使用,若serve{}全局配置有root,会与此处拼接
    
    location /img/ {
    	root /var;
    }
    # 根目录拼接:请求/img/1.jpg时,Nginx会获得/var/img/1.jpg
    # 即将/var拼接到/img/前,若serve{}全局配置有root,会与此处拼接
    
  • index指令
    location /other/ {
        root    /www/wwwroot/;
        # 路由/other/会将/www/wwwroot/index.html文件返回前端
        # 多个选择,用空格分隔
        index   index.html index.php;
    }
    
4 动静分离
  • 功能:使一个子域名下的资源为只读,且可作为前端引用,如:图片、js、css
  • 文件准备
    • 新建:/data/image/1.png
    • 新建:/data/www/index.html,内容<h1>这是静态页面主页<h1>
    • 新建:/etc/nginx/conf.d/nginx.conf
      server {
          listen 80;
          server_name  192.168.3.5;
          # 路由为/data/image/
          location /image/ {
              root   /data;
              # 在浏览器路由为/image/时会显示列表,见下图
              autoindex on;
          }
          # 跟上一个效果相同
          location /src/ {
          	alias /data/image/;
          	autoindex on;
          }
          # 路由/data/www/index.html
          location / {
              root /data/www;
              index index.html;
          }
      }
      

  • 显示/image/路由,或/src/路由
    在这里插入图片描述
  • 显示/image/1.png,或/src/1.png
    在这里插入图片描述
  • 显示192.168.3.5/
    在这里插入图片描述
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值