nginx配置文件详解

本文详细解析了nginx的配置文件结构,包括服务器块、location指令、反向代理、负载均衡等核心配置,帮助读者掌握nginx的高级用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

########### 每个指令必须有分号结束。#################
# 运行用户
user www-data;

# 启动进程,通常设置成和cpu的数量相等
worker_processes  6;

# 全局错误日志定义类型,日志级别 [debug | info | notice | warn | error | crit(默认)]
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

# 进程pid文件
pid        /var/run/nginx.pid;

# 工作模式及连接数上限
events {
    #设置网路连接序列化,防止惊群现象发生,默认为on
    accept_mutex on;  
    
    # 仅用于linux2.6以上内核,可以大大提高nginx的性能
    #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    use   epoll;

    # 单个后台worker process进程的最大并发链接数
    worker_connections  1024;

    # 客户端请求头部的缓冲区大小
    client_header_buffer_size 4k;

    # keepalive 超时时间
    keepalive_timeout 60;

    #设置一个进程是否同时接受多个网络连接,默认为off
    # multi_accept on;
}

# 代理 tcp 端口 nginx 版本大于1.9默认是支持 TCP 代理的
# 这个示例我们将本地的1389端口转发到192.168.1.8的389端口上
stream {
    upstream ldap {
        hash $remote_addr consistent;
        server 192.168.1.8:389;
    }
    server {
        listen 1389;
        proxy_connect_timeout 5s;
        proxy_timeout 5s;
        proxy_pass ldap;
    }
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    # 文件扩展名与文件类型映射表义
    include       /etc/nginx/mime.types;

    # 默认文件类型
    default_type  application/octet-stream;

    # 默认编码
    charset utf-8;

    # 服务器名字的hash表大小
    server_names_hash_bucket_size 128;

    # 客户端请求头部的缓冲区大小
    client_header_buffer_size 32k;

    # 客户请求头缓冲大小
    large_client_header_buffers 4 64k;

    # 设定通过nginx上传文件的大小
    client_max_body_size 8m;

    # 开启目录列表访问,合适下载服务器,默认关闭。
    autoindex on;

    # sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
    # 必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度
    sendfile        on;
    
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    # 此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
    #tcp_nopush     on;

    # 连接超时时间(单秒为秒)
    keepalive_timeout  65;


    # gzip模块设置
    gzip on;               #开启gzip压缩输出
    gzip_min_length 1k;    #最小压缩文件大小
    gzip_buffers 4 16k;    #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2;     #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

    # 开启限制IP连接数的时候需要使用
    #limit_zone crawler $binary_remote_addr 10m;

    # 负载均衡配置
    #默认情况下,使用加权轮训方法在服务器之间分配请求。在上面的例子中,每7个请求将按如下方式分配:5个请求分配给192.168.110.102:8081并且
    #向第二和第三服务器中的每一个发送一个请求。如果在与服务器通信的过程中出现错误,请求将被传递到下一个服务器
    #依此类推,直到所有正常工作的服务器都被尝试过。如果无法从任何服务器获得成功的响应,客户端将收到与最后一个服务器通信的结果。
    upstream mysvr {
        # https://www.cnblogs.com/xuey/p/7439695.html
    }






    #nginx负载均衡的5种策略
    #轮训(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。轮训其实为weight=1
    upstream backend {
        server 192.168.110.102:8081;
        server 192.168.110.102:8082;
    }

    #weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
    upstream backend {
        server 192.168.110.102:8081 weight=3;
        server 192.168.110.102:8082 weight=7;
    }

    #ip_hash 在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
    #我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。
    #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
    upstream backend {
        ip_hash;
        server 192.168.110.102:8081;
        server 192.168.110.102:8082;
    }

    #fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    upstream backend {
        server 192.168.110.102:8081;
        server 192.168.110.102:8082;
        fair;
    }

    #url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到同一个(对应的)后端服务器,后端服务器为缓存时比较有效。
    upstream backend {
        server 192.168.110.102:8081;
        server 192.168.110.102:8082;
        hash $request_uri;
        hash_method crc32;
    }

    #其他指令
    #最大连接数:max_conns=number max_conns属性是用来限制同时连接到upstream负载上的单个服务器的最大连接数,作用是可以对单个服务器进行限流,防止服务器超负荷运转. 默认值为0,则表示没有限制
    upstream backend {
        server 192.168.110.102:8081 max_conns=2;
    }
    #最大失败次数(默认1次):max_fails=number
    #失败时间(默认10s):fail_timeout=time 在失败时间内请求某一server失败达到最大失败次数后,则认为该server已经挂了或者宕机了,随后的失败时间之内不会有新的请求到达刚刚挂掉的节点上,而是会请求到正常运作的server
    #失败时间后会再有新请求尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复
    upstream backend {
        server 192.168.110.102:8081 max_fails=2 fail_timeout=15s;
        server 192.168.110.102:8082;
        server 192.168.110.102:8083;
    }
    #down 将服务器标记为永久不可用
    upstream backend {
        server 192.168.110.102:8081 down; # 将服务器标记为永久不可用
    }
    #keepalive connections 长连接数是为了解决在高延迟网络上建立tcp连接的延迟问题,适当的配置长连接数,能够增加吞吐量及响应速度。
    #这 connections 参数设置每个工作进程的缓存中保留的到上游服务器的最大空闲keepalive连接数。当超过这个数量时,最近最少使用的连接将被关闭。
    #应该特别注意的是 keepalive 指令不限制nginx工作进程可以打开的上游服务器连接的总数。这connections参数应该设置为一个足够小的数字,以便上游服务器也能处理新的传入连接。
    upstream backend {
        server 192.168.110.102:8081;
        keepalive 16; # 这个配置值应尽量保持小一些
    }
    server {
        ...
        location /http/ {
            proxy_pass http://backend;
            proxy_http_version 1.1; # 对于HTTP来说proxy_http_version指令应设置为1.1
            proxy_set_header Connection ""; # 清除“连接”头字段
            ...
        }
    }
    #backup:其它所有的非backup机器down或者忙的时候,请求backup机器
    upstream upstream {
        server 192.168.110.102:8081 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
    }






    #错误页,这里可以统一定义,也可在 server 中分别定义
    error_page 404 http://www.myhost.com/404.html; 
 
   # http 虚拟主机的配置
    server {
        #单连接请求上限次数
        keepalive_requests 120;

        # 监听端口
        listen 80;

        # 域名可以有多个,用空格隔开
        server_name www.jd.com jd.com;

        # 默认入口文件名称
        index index.html index.htm index.php;
        # 网站根目录
        root /data/www/jd;

        # 图片缓存时间设置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)${
            expires 10d;
        }

        #JS和CSS缓存时间设置
        location ~ .*.(js|css)?${
            expires 1h;
        }
        
        # 日志 star ----- 可以放 http 中统一定义,也可 server 块中单独(分别)定义
        
        #access_log off; #取消服务日志
        # 日志格式设定
        #$remote_addr与 $http_x_forwarded_for用以记录客户端的ip地址;
        #$remote_user:用来记录客户端用户名称;
        #$time_local:用来记录访问时间与时区;
        #$request:用来记录请求的url与http协议;
        #$status:用来记录请求状态;成功是200,
        #$body_bytes_sent :记录发送给客户端文件主体内容大小;
        #$http_referer:用来记录从那个页面链接访问过来的;
        #$http_user_agent :记录客户端浏览器的相关信息;
        #自定义日志格式
        #$remote_addr:客户端地址 $remote_user:客户端用户名称 $time_local:访问时间和时区 $request:请求的URI和HTTP协议 $http_host:请求地址,即浏览器中你输入的地址(IP或域名) $status:HTTP请求状态 $upstream_status:upstream状态 $body_bytes_sent:发送给客户端文件内容大小 $http_referer:url跳转来源 $http_user_agent:用户终端浏览器等信息 $ssl_protocol:SSL协议版本 $ssl_cipher:交换数据中的算法 $upstream_addr:后台upstream的地址,即真正提供服务的主机地址;当ngnix做负载均衡时,可以查看后台提供真实服务的设备 $request_time:整个请求的总时间 $upstream_response_time:请求过程中,upstream响应时间
        log_format main '[$upstream_addr] - $remote_addr - $remote_user [$time_local] - [$request_time] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

        # 定义本虚拟主机的访问日志
        access_log  /usr/local/nginx/logs/myhost.access.log  main;
        
        # 日志 end ------------------------------------ 

        # 对具体路由进行反向代理
        location /connect-controller {
            # 代理转发 https://www.cnblogs.com/vicky-li/p/10411104.html
            proxy_pass http://127.0.0.1:88;
            proxy_redirect off; // 修改代理服务器返回的响应头的 location 头域 跟 refresh 头域值,off 禁止 所有 proxy_redirect 指令
            
            #只要用户在浏览器中访问的域名绑定了 VIP, VIP 下面有RS;则就用$host;host是访问URL中的域名和端口 www.taobao.com:80
            proxy_set_header Host $host;
            
            #把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
            proxy_set_header X-Real-IP $remote_addr; 

            #在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源(真实)IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        

            # 允许客户端请求的最大单文件字节数
            client_max_body_size 10m;

            # 缓冲区代理缓冲用户端请求的最大字节数,
            #如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,
            #无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
            client_body_buffer_size 128k;

            # 表示使nginx阻止HTTP应答代码为400或者更高的应答。
            proxy_intercept_errors on;

            # nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_connect_timeout 90;

            # 后端服务器数据回传时间(代理发送超时)
            # 后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
            proxy_send_timeout 90;

            # 连接成功后,后端服务器响应的超时时间
            # 连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
            proxy_read_timeout 90;

            # 设置代理服务器(nginx)保存用户头信息的缓冲区大小
            # 设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffer_size 4k;
            proxy_buffer_size 4k;

            #proxy_buffers缓冲区,网页平均在32k以下的设置
            #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
            proxy_buffers 4 32k;

            # 高负荷下缓冲大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;

            # 设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
            # 设定缓存文件夹大小,大于这个值,将从upstream服务器传
            proxy_temp_file_write_size 64k;
        }

        # 动静分离反向代理配置(多路由指向不同的服务端或界面)
        location ~ .(jsp|jspx|do)?$ {
            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_pass http://127.0.0.1:8080;
        }
        
        # 请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
        location  ~*^.+$ {      
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
        
    #将请求转成https,路由重写,可以写在location块中
    rewrite ^(.*)$ https://$host$1 permanent;
    
    # 指定虚拟主机的配置文件,方便管理
    include /etc/nginx/conf.d/*.conf;  
        
    }
    
    # https 连接
    server {
        # https 端口
        listen       443;
        # 网站域名
        server_name  myhoust.com  www.myhost.com;
        
        # 开启ssl,证书地址
        ssl                  on;
        ssl_certificate      cert.pem;
        ssl_certificate_key  cert.key;

        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;

        location / {
            #文件夹
            root /usr/local/service/ROOT;
            #主页文件
            index index.html;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值