nginx配置详解

程序员卷不动了 2023-02-13 PM 296℃ 0条
1 、nginx配置文件构成

一个nginx配置文件通常包含三个模块:

  • 全局块:比如进程数,定义日志路径;
  • events块:设置处理轮询事件模型,每个工作进程最大连接数以及http层的keep-alive超时时间
  • http块:路由匹配,静态文件服务器,反向代理,负载均衡等

式例配置

# 全局块
 user www-data;
 worker_processes  2;  ## 默认1,一般建议设成CPU核数1-2倍
 error_log  logs/error.log; ## 错误日志路径
 pid  logs/nginx.pid; ## 进程id
 
 # Events块
 events {
   # 使用epoll的I/O 模型处理轮询事件。
   # 可以不设置,nginx会根据操作系统选择合适的模型
   use epoll;
   
   # 工作进程的最大连接数量, 默认1024个
   worker_connections  2048;
   
   # http层面的keep-alive超时时间
   keepalive_timeout 60;
   
   # 客户端请求头部的缓冲区大小
   client_header_buffer_size 2k;
 }
 
 # http块
 http { 
 
   include mime.types;  # 导入文件扩展名与文件类型映射表
   default_type application/octet-stream;  # 默认文件类型
   
   # 日志格式及access日志路径
   log_format   main '$remote_addr - $remote_user [$time_local]  $status '
     '"$request" $body_bytes_sent "$http_referer" '
     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log   logs/access.log  main;
   
   # 允许sendfile方式传输文件,默认为off。
   sendfile     on;
   tcp_nopush   on; # sendfile开启时才开启。
 
   # http server块
   # 简单反向代理
   server {
     listen       80;
     server_name  host.com www.host.com;
     access_log   logs/host.access.log  main;
    
     # 转发动态请求到web应用服务器
     location / {
       proxy_pass      http://127.0.0.1:8000;
       deny 192.24.40.8;  # 拒绝的ip
       allow 192.24.40.6; # 允许的ip   
     }
     
     # 错误页面
     error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
         }
   }
 
   # 负载均衡
   upstream backend_server {
     server 192.168.0.1:8000 weight=5; # weight越高,权重越大
     server 192.168.0.2:8000 weight=1;
     server 192.168.0.3:8000;
     server 192.168.0.4:8001 backup; # 热备
   }
 
   server {
     listen          80;
     server_name     big.server.com;
     access_log      logs/big.server.access.log main;
     
     charset utf-8;
     client_max_body_size 10M; # 限制用户上传文件大小,默认1M
 
     location / {
       # 使用proxy_pass转发请求到通过upstream定义的一组应用服务器
       proxy_pass      http://backend_server;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_host;
       proxy_redirect off;
       proxy_set_header X-Real-IP  $remote_addr;
     }
   }
 }
2、全局模块

全局模块比较简单,参数如下:

###### user

启动nginx的用户,一般配置成www,不需要root权限,否则存在安全隐患

worker_processes

工作进程数量,nginx的模式是master-worker模式,master进程负责接受和分配任务,worker进程负责处理master分配的任务,一般worker进程数为当前cpu核心数,如果设置过多,操作系统的进程调度切换中有损耗

error_log

错误日志路径logs/error.log

pid

进程id,存放进程id的文件目录logs/nginx.pid

3、events模块

events模块中包含了nginx所有处理连接的设置,常用配置如下

events {
    use epoll;
    accept_mutex on;
    multi_accept on;
    worker_connections 20000;
    client_header_buffer_size 4k;
    open_file_cache max=2000 inactive=60s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 1;
}

详解如下

###### use

 `use`指令用来指定使用连接的处理方法,通常不需要指定,`nginx`会默认使用最有效的方式,常用的有`epoll`,`poll`,`select`等
accept_mutex

​ 设置网络连接序列化,防止惊群现象发生,默认开启

multi_accept

​ 设置是否允许同时接受多个网络连接

worker_connections

​ 设置工作进程的最大连接数,理论上nginx服务器的最大连接数=worker_connections * worker_processes

client_header_buffer_size

​ 客户端请求头部的缓冲区大小,这个可以根据你的系统分页来设置,一般请求头的大小不会超过1K

4、http模块

http模块分为三个内容

  • http模块:配置http的相关参数,包含多个server模块
  • server模块:一个虚拟主机,需配置域名和端口,处理对应主机域名的http请求,可包含多个location模块
  • location模块:处理对应的具体路径请求
http

常见http配置

http{
    include mime.types;
    default_type application/octet-stream;
    keepalive_timeout: 65;
}
  • include:用来包含另一个文件,mime.types
  • default_type:默认的文件类型
  • keepalive_timeout:指定每个tcp连接最多可以保持多长时间,默认是75秒,客户端发送多个请求,每个请求都要建立独立的连接传输数据,httpkeepalive模式,告诉服务器,处理完一个请求后保持这个tcp的打开状态,若收到客户端的其他请求,服务端就会利用这个未被关闭的连接
server

配置一个虚拟主机,常见配置为

server {
        listen       80;
        server_name  localhost;
        charset koi8-r;
        access_log  logs/host.access.log  main;
 
        # 配置请求地址
        location / {
            #...
        }
         
        # 配置请求地址
        location /status/ {
            #...
        }
 
        error_page  500 502 503 504  /50x.html;
    }
  • listen:监听端口
  • server_name:域名配置
  • access_log:日志文件
  • location:处理适配的请求
location

用来匹配不同的url请求,进而对请求做不同的处理和响应

location [= | ~ | ~* | ^~ | /]{
    proxy_pass http://127.0.0.1:8080
}
  • =:用于精准匹配,请求的字符串与其精准匹配,成功立即处理
  • ~:区分大小写的正则匹配,比如 `location ^~/test$

    • /test:匹配成功
    • /Test:匹配失败
    • /test/:匹配失败
  • ~*:表示不区分大小写的正则匹配,例如location ~* ^/test$

    • /test:匹配成功
    • /Test:匹配成功
    • /test/:匹配失败
  • /a:普通前缀匹配优先级
  • /:没有任何匹配成功的都会匹配到这里处理

proxy_pass代理转发,如果proxy_pass后面的url加了/,表示绝对根路径,如果proxy_pass后面的url没有/表示相对路径;

请求示例:http://127.0.0.1/proxy/code.html

  • location /proxy/{
        proxy_pass:http://127.0.0.1:8080/;
        # 代理到http://127.0.0.1:8080/code.html
    }
  • location /proxy/{
        proxy_pass:http://127.0.0.1:8080/;
        # 代理到http://127.0.0.1:8080/proxy/code.html
    }
  • location /proxy/{
        proxy_pass:http://127.0.0.1:8080/a/;
        # 代理到proxy_pass:http://127.0.0.1:8080/a/code.html
    }
  • location /proxy/{
        proxy_pass:http://127.0.0.1:8080/a;
        #代理到proxy_pass:http://127.0.0.1:8080/aproxy/code.html
    }
upstream

定义一组服务器,做负载均衡

upstream backend_server {
     server 192.168.0.1:8000 weight=5; # weight越高,权重越大
     server 192.168.0.2:8000 weight=1;
     server 192.168.0.3:8000;
     server 192.168.0.4:8001 backup; # 热备
   }

默认情况下,nginx是按照加权轮询的方式,将请求分发到各个服务器,weight越大,承担任务越多

upstream backend_server {
    ip_hash;
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
 }

根据iphash结果分配,这个每个访客固定访问一个后端服务器,可以解决session的问题

# URL Hash
 upstream backend_server {
    hash $request_uri;
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
 }

按照访问的urlhash结果来分配请求,使得每个url定向到同一个后端,后端服务器缓存时比较有效

 # Fair
 upstream backend_server {
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
    fair;
 }

按照后端服务器的响应时间来分配请求,响应时间短的优先分配,需要编译upstram-fair这个库

标签: nginx, proxy_pass

非特殊说明,本博所有文章均为博主原创。

评论啦~