nginx配置文件结构

main		全局设置

events{		工作模式连接配置
	...
}
http{		http配置
	...
	upstream xxx{	负载均衡配置
		...
	}
	server{		主机设置
		...
		location xxx{	URL匹配
			...
		}
	}
}

main

# worker进程运行用户和组
user root [root];

# 指定Nginx开启的子进程数,多核CPU建议设置和CPU数量一样的进程worker_processes auto;

# 用来定义全局错误日志文件,通常放在var中,leveldebuginfonoticewarnerrorcrit
error_log /var/log/nginx/error.log info;

# 指定进程id存储文件位置
pid /run/nginx.pid;

# 一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
# 如果worker_rlimit_nofile的值小于worker_connections的值,会报如下错误:
# worker_connections exceed open file resource limit: xxx
worker_rlimit_nofile 65535;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

# 守护进程默认on
#容器环境下最好配置off,不然以守护进程启动则会异常退出
daemon off;

events

# 指定工作模式和以及连接上限
events {
    # use       指定nginx工作模式
    # [epoll]   高效工作模式linux
    # [kqueue]  高效工作模式bsd
    # [poll]    标准模式
    # [select]  标准模式
    use epoll;
    
    # worker_connections    定义nginx每个进程最大连接数
    # 正向代理              连接数 * 进程# 反向代理              连接数 * 进程数 / 4
    # linux系统限制最多能同时打开65535个文件,默认上限就是65535,可解除 ulimit -n 65535
    # 单个进程最大连接数最大连接数=连接数*进程数)
    worker_connections 65535;
}

http

核心模块,主要负责http服务器相关配置,包含serverupstream子模块,常见配置如下

http {

    # 日志格式,配置escape=json使能显示中文
    log_format  main escape=json  '$remote_addr - "$http_referer" - $remote_user [$time_local] - "$request" "$http_user_agent" - '
                      '$status - $request_time $upstream_response_time - $request_length $body_bytes_sent - '
                      '"$query_string" - "$request_body"';

    # 日志文件地址
    access_log  /var/log/nginx/access.log  main;

    # 每秒5请求
    # limit_req_zone $binary_remote_addr zone=addr:10m rate=5r/s;
    
    # 设置文件的mime类型mime.types是文件扩展名文件类型映射include             /etc/nginx/mime.types;
    
    # 默认响应类型二进制default_type        application/octet-stream;

    charset utf-8; #默认编码    

    # 包含其它配置文件,分开规划解耦
    # include xxxconfig; 
    include /etc/nginx/conf.d/*.conf;

    # 设置高效文件传输模式
    sendfile            on;

    #指令必须在sendfile打开的状态下才会生效,主要是用来提升网络包的传输'效率',防止网络堵塞
    tcp_nopush          on;    

    # 设置客户端连接活跃超时,也就是连接超时时间单位是秒
    keepalive_timeout   65;
  
    #指令必须在keep-alive连接开启的情况下才生效,来提高网络传输'实时性',也是为了防止网络堵塞
    tcp_nodelay         on;
    
	# 开启gzip压缩输出
    # gzip              on;

	# 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 128k;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    
    #upstream的负载均衡weight权重可以根据机器配置定义权重weigth参数表示权值,权值越高被分配到的几率越大。
    upstream myServer {
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;
    }

    # server用来指定虚拟主机
    server {
		
    }
    
    # server用来指定虚拟主机
    server {
		
    }

日志配置

当配置 Nginx 日志格式时,可以使用以下占位符来记录不同信息这里是列举的大部分 Nginx 日志占位符及其解释

gzip配置

http {
    #开启gzip压缩输出
    gzip on; 
          
    #最小压缩文件大小
    gzip_min_length 1k; 
    
    #压缩缓冲区
    gzip_buffers 4 16k; 
    
    #压缩版本默认1.1前端如果是squid2.5使用1.0)开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
    gzip_http_version 1.0;
    
    #推荐6压缩级别(级别越高,压的越小,浪费CPU计算资源)
    gzip_comp_level 2;
    
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warngzip_types text/plain text/javascript  text/css application/javascript application/x-javascript application/xml application/x-httpd-php image/jpeg image/gif image/png;

    gzip_vary on;   # 是否传输gzip压缩标志
    
    # 禁用用户代理为 Internet Explorer 16版本的请求进行压缩。
    gzip_disable "MSIE [1-6].";
    
    #开启限制IP连接数的时候需要使用
    #limit_zone crawler $binary_remote_addr 10m; 
}

缓存配置

web服务种有一些静态资源响应很慢,这时可以配置缓存,将一些文件缓存内存中。

需要配置 proxy_cache_path proxy_cache 就可以开启内容缓存,前者用来设置缓存路径和配置,后者用来启用缓存一个简单的配置如下

http {
    ...
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    server {
        # 当前块全部开启缓存
        proxy_cache mycache;
        location / {
            proxy_pass http://localhost:8000;
        }
    }
}

配置proxy_cache_path

在http 块中加入如下配置:

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
}

配置proxy_cache

server {
    ...
    location / {
        proxy_cache my_cache;
        # proxy_cache_key "$host$request_uri$cookie_user";
        proxy_cache_min_uses 3;
        proxy_cache_methods GET HEAD POST;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404      1m;
        # proxy_cache_valid any 5m;
        proxy_cache_bypass $http_pragma;
        proxy_cache_revalidate on;
        proxy_pass http://localhost:8000;
    }
}

Nginx 缓存相关进程

缓存中还涉及两个额外的NGINX进程:

在以下示例中,迭代持续数300 毫秒或直到 200 个项目被加载进去:

proxy_cache_path /var/cache/nginx keys_zone=one:10m loader_threshold=300 loader_files=200;

清除缓存

官网https://docs.nginx.com/nginx/adminguide/content-cache/content-caching/

需要提前加一个配置,用于标识使用 HTTP PURGE 方法的请求并删除匹配的 URL 对应的缓存。

1.在 http {} 上下文创建变量,例如 $purge_method, 他依赖于 $request_method 变量

http {
    ...
    map $request_method $is_purge {
        PURGE 1;
        default 0;
    }
}

2.在 location {} 块中,已经配置缓存的前提下,引入 proxy_cache_purge 参数来指定清除缓存请求的条件。例如在上一步指定的 $request_method

server {
    listen      80;
    server_name www.example.com;

    location / {
        proxy_pass  https://localhost:8000;
        proxy_cache mycache;
		...
        proxy_cache_purge $purge_method;
    }
}

3.配置完并使之生效之后,就可以发送一条 purge 请求来让缓存失效了,例如:

curl -X PURGE -D – "https://www.example.com/*"

在该示例中,将清除具有公共 URL 部分(由星号通配符指定)的资源。但这些缓存条目不会从缓存中完全删除
它们会保留在磁盘上,直到它们被视为不活动(由proxy_cache_path 中的 inactive参数决定)的时候才完全删除,或缓存清除器(由 proxy_cache_path 中的 purge 决定),或客户端尝试访问它们的时候。

FastCGI配置

http {
	# 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 128k;
}

upstream 块(在http块下,可配置多个

轮询配置

  1. 在http节点下,加入upstream节点

    upstream myServer{ 
          server 10.0.6.108:7080; 
          server 10.0.0.85:8980; 
    }
    
  2. server节点下的location节点中的proxy_pass配置为:http:// + upstream名称,即

    location / { 
                root  html; 
                index  index.html index.htm; 
                proxy_pass http://myServer; 
    }
    
  3. 如今负载均衡初步完毕了。upstream依照轮询(默认)方式进行负载,每一个请求按时间顺序逐一分配不同的后端服务器。假设后端服务down掉。能自己主动剔除。尽管这样的方式简便、成本低廉。但缺点是:可靠性低和负载分配均衡

权重配置

weight(权重)指定轮询几率,weight和访问比率成正比,用于后端服务性能不均的情况。例如以下所看到的。10.0.0.88的访问比率要比10.0.0.77的访问比率高一倍。

upstream linuxidc{ 
      server 10.0.0.77 weight=5; 
      server 10.0.0.88 weight=10; 
}

ip_hash配置

ip_hash(访问ip),每一个请求按访问ip的hash结果分配。这样每一个访客固定访问一个后端服务器,能够解决session问题

upstream favresin{ 
     ip_hash; 
     server 10.0.0.10:8080; 
     server 10.0.0.11:8080; 
}

fair(第三方)配置

这是为更加智能的负载均衡算法fail算法可以依据页面大小和加载时间长短智能地进行负载均衡,即根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持 fair,使用需要下载配置Nginx的 upstream_fair模块。

 upstream favresin{      
      fair; 
      server 10.0.0.10:8080; 
      server 10.0.0.11:8080; 
}

url_hash第三方)配置

url_hash第三方),按访问urlhash结果来分配请求,使每一个url定向到同一个后端服务器。后端服务器为缓存时比较有效

注意:在upstream中加入hash语句。server语句中不能写入weight等其他的參数hash_method是使用的hash算法

 upstream resinserver{ 
      server 10.0.0.10:7777; 
      server 10.0.0.11:8888; 
      hash $request_uri; 
      hash_method crc32; 
}

upstream配置状态参数

upstream还能够为每一个设备设置状态值,这些状态值的含义分别例如以下:

upstream bakend{ #定义负载均衡设备的Ip及设备状态 
      ip_hash; 
      server 10.0.0.11:9090 down; 
      server 10.0.0.11:8080 weight=2; 
      server 10.0.0.11:6060 max_fails=2 fail_timeout=2; 
      server 10.0.0.11:7070 backup; 
}

server块(在http块下,可配置多个

基础配置

 # server用来指定虚拟主机
    server {
        # 指定虚拟主机监听端口
        listen      80 default_server;
        listen      [::]:80 default_server;
        # 指定网页的默认编码格式
        charset     utf-8;
        # 域名可以有多个,用空格隔开
        # server_name www.baidu.com www.souhu.com;
        # 日志格式设定
        # log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';
        # 指定虚拟主机的访问日志存放路径
        # access_log   xxx main;
        # 指定虚拟主机的错误日志存放路径
        # error_log   xxx main;
        # 指定这个虚拟主机根目录
        # root  xxx;
        # 指定默认首页
        # index xxx;
        # 解决跨域问题,允许跨域访问的源地址信息,可以配置多个(多个逗号分隔),也可以使用*代表所有源
        add_header Access-Control-Allow-Origin *;
        # add_header Access-Control-Allow-Headers X-Requested-With;
        # 允许跨域访问的请求方式,值可以为 GET POST PUT DELETE...,可以全部设置,也可以根据需要设置,多个用逗号分隔
        add_header Access-Control-Allow-Methods *;
        # 针对跨域资源共享的设置,设置预检请求的响应头
        add_header Access-Control-Allow-Headers X-Requested-With;
        # Load configuration files for the default server block.
        # include /etc/nginx/default.d/*.conf;

        # 核心中的核心,主要配置都在这
        # 主要功能:定位url解析url支持正则匹配,还能支持条件实现动静分离
        # 语法
        # location [modifier] uri{
        #     ...
        # }
        # modifier 修饰符
        # = 使用精确匹配并且终止搜索
        # ~ 区分大小写正则表达式
        # ~* 不区分大小写正则表达式
        # ^~ 最佳匹配,不是正则匹配,通常用匹配目录

        # ================下面为常用代理配置示例================
        
        # distvue打包后的h5文件夹
        location / {
          root /dist;
        }

        #设定查看Nginx状态的地址
        location /status{
        stub_status on;
        access_log on;
        # 设置认证详情看后面的ngx_http_auth_basic_module模块
        auth_basic "your description";
        auth_basic_user_file /etc/nginx/auth;
        #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }

        # 反向代理转发java服务
        # ex:http:127.0.0.1:80/api/test/test1 -> http:base-auth:8080/test/test1
        #'/api/'后面的路径直接拼接到http://base-auth:8080/后面
        location /api/ {
          proxy_pass http://base-auth:8080/;
        }

        # ex:http:127.0.0.1:80/api/test/test1 -> http:base-auth:8080/test/test1
        # '^~ /api/'表示匹配前缀是api的请求,会把'/api/'后面的路径直接拼接到http://base-auth:8080/后面
        # location ^~ /api/ {
        #   proxy_pass http://base-auth:8080/;
        # }

    }

auth_basic 身份验证配置

ngx_http_auth_basic_module模块允许通过使用“HTTP基本认证”协议验证用户名密码来限制对资源的访问。

访问还可以根据地址、子请求的结果或JWT进行限制。同时通过地址密码限制访问由满足指令控制

生成密码openssl passwd <your_password>
命令将输出一段对应的 Hash 值。
也可以使用更为复杂的 Hash 规则进行生成,如使用 apr1 算法openssl passwd -apr1 <your_password>
在明文密码较长的情况下,需要使用后者。

任意合适的位置生成相应的用户名密码描述文件。文件的格式为:

# Comments
user1:password1
user2:password2:comment
user3:password3

例如,启用用户 admin,该用户的明文密码123456, 经过 Hash 处理之后的密码为 $apr1$dbjnVHtt$VuH8VTGpuo3vJdw3PXoGC0,则描述文件中的内容为:

admin:$apr1$dbjnVHtt$VuH8VTGpuo3vJdw3PXoGC0

对应站点配置文件中,加入如下类似的内容:

location / {
	auth_basic "your description";
    auth_basic_user_file <your_conf_file_path>;
}

其中,your_conf_file_path 填入你创建说明文件的绝对路径,同时,在已经要求身份认证的父目录下,可以对特定的子目录取消身份验证要求:

loaction <subroute_match_rules> {
	auth_basic off;
}

一个监控认证示例

stub_status on;是一个用于启用 Nginx 的 Stub Status 模块的指令。Stub Status 模块提供了一种简单方式获取有关 Nginx 服务器当前状态的信息。

在 Nginx 配置中添加 stub_status on; 指令时,将启用 Stub Status 模块,并使其对外可用。

location /status {
            stub_status on;
            access_log on;
            auth_basic "nginx status";
            auth_basic_user_file /etc/nginx/auth;
        }

Stub Status 模块会将状态信息以文本格式返回给客户端,通过访问 Nginx 的 Stub Status 页面,可以获取到以下信息:

Active connections: 13 
server accepts handled requests
 24 24 12 
Reading: 0 Writing: 1 Waiting: 12 

location块(在server块下,可配置多个)

核心中的核心,以后的主要配置都在这

主要功能:定位url,解析url支持正则匹配,还能支持条件实现动静分离

语法
	location [modifier]  uri{
		...
	}

modifier 修饰=	使用精确匹配并且终止搜索
	~	区分大小写正则表达式
	~*	不区分大小写的正则表达式
	^~	最佳匹配,不是正则匹配,通常用来匹配目录
	
常用指令
	alias	别名,定义location的其他名字,在文件系统能够找到,如果location指定了正则表达式alias将会引用正则表达式中的捕获alias替代lication中匹配的部分,没有匹配的部分将会在文件系统中搜索
    #"/" 启用反向代理
    location / {
    
      proxy_pass http://127.0.0.1:8088;
      
      # 使用http1.1
      proxy_http_version 1.1;
     
      # 设置代理服务器的请求头 Host 字段为当前请求的主机名。
      proxy_set_header Host $host;
      
      # 设置请求头信息。X-Real-IP 头会将客户端真实 IP 地址传递给后端服务器,X-Forwarded-For 头会将客户端真实 IP 地址添加到请求头中,以便后端服务器获取。
      proxy_set_header X-Real-IP $remote_addr;
      
      #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     
      #允许客户端请求的最大单文件字节数
      client_max_body_size 10m; 
      
      #缓冲区代理缓冲用户端请求的最大字节数
      client_body_buffer_size 128k; 

      #  禁用代理服务器对后端服务器返回重定向进行修改
      proxy_redirect off;
      
      proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
      
      proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
      
      proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
      
      proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
      
    }

密码

一个常用的nginx配置文件

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log info;
pid        /var/run/nginx.pid;


events {
    use epoll;
    worker_connections  65535;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    
    log_format  main escape=json  '$remote_addr - "$http_referer" - $remote_user [$time_local] - "$request" "$http_user_agent" - '
                      '$status - $request_time $upstream_response_time - $request_length $body_bytes_sent - '
                      '"$query_string" - "$request_body"';

    access_log  /var/log/nginx/access.log  main;

    charset utf-8;

    sendfile        on;
    tcp_nopush      on;

    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip               on;
    gzip_min_length    1k;
    gzip_comp_level     6;
    gzip_types         text/plain text/javascript  text/css application/javascript application/x-javascript application/xml application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary          on;
    gzip_disable "MSIE [1-6].";

    upstream document_api{ 
        server api:8080; 
    }

    server {
        listen      80 default_server;
        charset     utf-8;
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods *;
        add_header Access-Control-Allow-Headers X-Requested-With;

        location / {
            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_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_http_version 1.1;
            client_max_body_size  300M;
            proxy_pass http://document_api/;
        }

        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file /etc/nginx/auth;
        }
    }
}

原文地址:https://blog.csdn.net/weixin_43702146/article/details/126782297

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_40762.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注