nginx配置详解和示例

jupiter
2024-05-19 / 0 评论 / 62 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年05月19日,已超过216天没有更新,若内容或图片失效,请留言反馈。

1.nginx默认配置文件

Nginx默认的配置文件是在安装目录下的 conf目录下,后续对 Nginx的使用基本上都是对此配置文件进行相应的修改,修改过nginx.conf配置文件,记得要重启Nginx服务(☆☆☆☆☆)

默认的配置文件内容(其中#开头的都是被注释了的内容):

#user  nobody;
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  /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;
    #    }
    #}

}

2.nginx配置文件配置详解

nginx配置文件主要分为如下三部分

2.1 全局块

全局块是默认配置文件从开始到events块之间的内容。主要设置nginx整体运行的配置指令,这些指令的作用域是全局,配置案例解析

#定义Nginx运行的用户和用户组
user www www;
 
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
 
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;
 
#进程pid文件
pid /usr/local/nginx/logs/nginx.pid;
 
#指定进程可以打开的最大描述符:数目
#工作模式与连接数上限
#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
#现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
#这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
worker_rlimit_nofile 65535;

2.2 events块

events块的指令主要影响nginx服务器和用户的网络连接,对性能影响较大。配置案例:

events
{
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
    #是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
    #补充说明:
    #与apache相类,nginx针对不同的操作系统,有不同的事件模型
    #A)标准事件模型
    #Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
    #B)高效事件模型
    #Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
    #Epoll:使用于Linux内核2.6版本及以后的系统。
    #/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
    #Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
    use epoll;
 
    #单个进程最大连接数(最大连接数=连接数*进程数)
    #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
    worker_connections 65535;
 
    #keepalive超时时间。
    keepalive_timeout 60;
 
    #客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
    #分页大小可以用命令getconf PAGESIZE 取得。
    #[root@web001 ~]# getconf PAGESIZE
    #4096
    #但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。
    client_header_buffer_size 4k;
 
    #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
    open_file_cache max=65535 inactive=60s;
 
    #这个是指多长时间检查一次缓存的有效信息。
    #语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.
    open_file_cache_valid 80s;
 
    #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
    #语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location  这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.
    open_file_cache_min_uses 1;
    
    #语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件时记录cache错误.
    open_file_cache_errors on;
}

常用到的配置案例:

events {            # events块开始
    worker_connections  1024;  #每个工作进程的最大连接数量(根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。)
    use epoll;    # 使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
    accept_mutex on;   #开启网络连接的序列化(防止多个进程对连接的争抢)
    multi_accept  on;  #允许同时接收多个网络连接(默认关闭),工作进程都有能力同时接收多个新到达的网络连接
} 

2.3 http块

这部分是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。下面的反向代理、动静分离、负载均衡都是在这部分中配置

  • http 全局块:http 全局块配置的指令包括:文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
  • server 块:这块和虚拟主机有密切关系,从用户角度看,虚拟主机和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
  • 每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。
  • 每个server块也分为全局server块,以及可以同时包含多个locaton块。

2.3.1 http块全局配置

配置案例:

#文件扩展名与文件类型映射表
include mime.types;

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

#默认编码
#charset utf-8;

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

#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
#sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
sendfile on;

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

# 负载均衡服务器组配置
upstream backend {  
    server 127.0.0.1:8081 max_fails=2 fail_timeout=10s;  
    server 127.0.0.1:8082 max_fails=2 fail_timeout=10s;  

    # 可选的其他参数  
    # least_conn;  # 使用最少连接的服务器  
    # ip_hash;     # 根据客户端IP进行哈希,确保来自同一IP的请求总是发送到同一台服务器  
    # keepalive 32; # 每个worker进程保持的最大空闲连接数  
}

2.3.2 http块下的server块

  • server块 必须包含在http之下。server是一切的开始,代表一个代理的出现,里边两大配置项:listen监听接口和server_name监听的地址,里边还包括了location和其它配置项,当存在server的时候,nginx获取到的请求都会去匹配这些server(匹配其中的listen和server_name)。

    • server也可单独拆分为一个文件 在nginx下http块下引用即可
  • location是nginx的精华,nginx就是通过拦截到的请求去对配置好的location块进行请求代理的。

    • alias&root:将请求代理到本地的指令,也就是如果可以把请求发送到你的 硬盘里去获取资源,这个指令可以代理前端的静态资源
    • proxy_pass:对请求进行转发重定向的
    • rewrite:用来重写请求路径

配置案例:

server {
        listen       80;
        server_name  localhost;
        
        location / {
            root   html/dist;
            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;
        }

        # 反向代理+负载均衡配置
        location /api/ {
            rewrite ^/api/(.*)$ /$1 break;
            proxy_pass   http://backend;
            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_set_header REMOTE-HOST $remote_addr;
            proxy_set_header Upgrade $http_upgrade;
            proxy_http_version 1.1;
        }
        location /upload/ {
            proxy_pass   http://backend;
        }

        # 请求日志按天/按小时/按分钟/按秒分割
        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})")
        {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
            set $minutes $5;
            set $seconds $6;
        }
        access_log ./logs/nginx-access_$year-$month-$day.log;
        # 错误日志配置
        error_log ./logs/nginx-access-error.log;
    }

3.nginx 反向代理配置

通过server>location>proxy_pass属性生效:

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass  http://127.0.0.1:8080
        
        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_set_header REMOTE-HOST $remote_addr;
            proxy_set_header Upgrade $http_upgrade;
            proxy_http_version 1.1;
    }
}

还可以针对单个子路径进行反向代理配置

server {
    listen       9001;
    server_name  localhost;

    location ~ /edu/ {
        proxy_pass  http://127.0.0.1:8080
    }

    location ~ /vod/ {
        proxy_pass  http://127.0.0.1:8081
    }
}

4.nginx负责均衡配置

通过http块下的upstream属性进行配置实现

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    upstream backend {  
        server 127.0.0.1:8081 max_fails=2 fail_timeout=10s;  
        server 127.0.0.1:8082 max_fails=2 fail_timeout=10s;  
        # 可选的其他参数  
        # least_conn;  # 使用最少连接的服务器  
        # ip_hash;     # 根据客户端IP进行哈希,确保来自同一IP的请求总是发送到同一台服务器  
        # keepalive 32; # 每个worker进程保持的最大空闲连接数  
    }

    server {
        listen       80;
        server_name  localhost;
        
        location / {
            root   html/dist;
            index  index.html index.htm;
        }

        location /api/ {
            rewrite ^/api/(.*)$ /$1 break;
            proxy_pass   http://backend;
            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_set_header REMOTE-HOST $remote_addr;
            proxy_set_header Upgrade $http_upgrade;
            proxy_http_version 1.1;
        }

        location /upload/ {
            proxy_pass   http://backend;
        }
    }
}

5.nginx 负载均衡分配服务器策略

5.1 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

upstream myserver {
    server 127.0.0.1:8081;  
    server 127.0.0.1:8082;
}
server {
    listen       80;
    server_name  127.0.0.1;
    location / {
        root   html;
        proxy_pass   http://myserver;
        index  index.html index.htm;
    }
}

5.2 weight

weight 代表权重, 默认为 1,权重越高被分配的客户端越多

upstream myserver {
    server 127.0.0.1:8081 weight=10;  
    server 127.0.0.1:8082 weight=10;
}
server {
    listen       80;
    server_name  127.0.0.1;
    location / {
        root   html;
        proxy_pass   http://myserver;
        index  index.html index.htm;
    }
}

5.3 ip_hash

ip_hash 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器

upstream myserver {
    server 127.0.0.1:8081;  
    server 127.0.0.1:8082;
    ip_hash;
}
server {
    listen       80;
    server_name  127.0.0.1;
    location / {
        root   html;
        proxy_pass   http://myserver;
        index  index.html index.htm;
    }
}

5.4 fair(第三方)

fair(第三方),按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream myserver {
    server 127.0.0.1:8081;  
    server 127.0.0.1:8082;
     fair;
}
server {
    listen       80;
    server_name  127.0.0.1;
    location / {
        root   html;
        proxy_pass   http://myserver;
        index  index.html index.htm;
    }
}

6.nginx日志分割配置

server {
    listen       80;
    server_name  127.0.0.1;
    location / {
        root   html;
        index  index.html index.htm;
    }

    # 请求日志按天/按小时/按分钟/按秒分割
    if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})")
    {
        set $year $1;
        set $month $2;
        set $day $3;
        set $hour $4;
        set $minutes $5;
        set $seconds $6;
    }
    access_log ./logs/nginx-access_$year-$month-$day.log;
    # 错误日志配置
    error_log ./logs/nginx-access-error.log;
}

参考资料

  1. Nginx反向代理配置去除前缀-百度开发者中心 (baidu.com)
  2. Nginx 负载均衡演示之 upstream 参数 & location 参数 - 知乎 (zhihu.com)
  3. Nginx--upstream健康检查 - 心恩惠动 - 博客园 (cnblogs.com)
  4. nginx日志切割/分割,按天生成&定期删除日志_nginx 日志按天切割-CSDN博客
  5. nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全-CSDN博客
  6. Nginx——访问日志、错误日志、日志文件切割_nginx错误日志文件太大了怎么办-CSDN博客
  7. 一文理清nginx中的location配置(系列一) - 知乎 (zhihu.com)
  8. 全网最全最完整Nginx 配置文件nginx.conf中文详解-CSDN博客
  9. nginx 配置相关详解_nginx 配置详解-CSDN博客
  10. Nginx配置——反向代理_nginx反向代理-CSDN博客
0

评论 (0)

打卡
取消