win环境nginx实战配置详解

项目中经常使用nginx做负载均衡,接口路由、文件、文档的上传及下载、视频的代理播放等等,都离不开nginx的支持,今天我们分享一下其个使用场景。

1、配置文件 nd-nginx.conf

全局配置

复制代码
#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID路径,日志路径等。
#user  nobody;
#user nginx nginx;#启动Nginx工作进程的用户和组
worker_processes  1; #启动工作进程数数量
#worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同
#worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ; 
#将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,
#但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,
#减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

#events设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接,
#使用哪种事件驱动模型处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等。
events {
 #设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数为worker_connections * worker_processes,
 #作为反向代理的时候为(worker_connections * worker_processes)/2
    worker_connections  1024;
}

文件上面全局配置

2、http 模块详解

复制代码
#http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置,
#http块可以包含多个server块,而一个server块中又可以包含多个location块,
#server块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时时间和单个链接的请求上限等。
http {

#通用配置....

# N个server 模块虚拟服务器 


}

3、http模块里面通用的配置

复制代码
    include       mime.types; #导入支持的文件类型,是相对于/apps/nginx/conf的目录,在响应报文中将指定的文件扩展名映射至MIME对应的类型
    default_type  application/octet-stream; #除mime.types中文件类型外,设置其它文件默认类型,访问其它类型时会提示下载不匹配的类型文件

    #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;
	#作为web服务器的时候打开sendfile加快静态文件传输,指定是否使用sendfile系统调用来传输文件,
	#sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,
	#操作效率很高,被称之为零拷贝,硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈。
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;  #长连接超时时间,单位是秒

	#开启gzip压缩,若想关闭gzip压缩,则需要注释掉这句话,或者将on换成off
    #gzip  on;
    #配置允许压缩的页面的最小字节数,页面字节数从header头中的Content-Length中获>取,建议设置成1k,因为如果数据小于1k,他也会压缩成1k,这样会起到反作用。
    #gzip_min_length 1k;
    #4个16k的数据流用于存储gzip的压缩结果数据流
    #gzip_buffers 4 16k;
    #支持的http版本为1.1
    #gzip_http_version 1.1;
    #判断客户端是否支持gzip技术,若不支持则不会进行gzip处理
    #gzip_vary on;

    # 全局跨域配置
	#为 * 表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求,也可以指定一个确定的URL
	add_header 'Access-Control-Allow-Origin' '*' always;
	#可选字段,为true表示允许发送Cookie。同时,发送时,必须设置XMLHttpRequest.withCredentials为true才有效,请求若服务器不允许浏览器发送,删除该字段即可。
    add_header 'Access-Control-Allow-Credentials' 'true';
	#代表允许使用指定的方法请求该地址
    add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, DELETE, PUT, OPTIONS';
	#代表允许在请求该地址的时候带上指定的请求头,例如:Content-Type,Authorization,使用逗号(,)拼接起来放在双引号(")中
	add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, X-Custom-Header, Access-Control-Expose-Headers, Token, Authorization';
	add_header 'Access-Control-Allow-Headers'  '*';
	#代表着在 1728000 秒之内不用请求该地址的时候 不需要再进行预检请求,也就是跨域缓存。
    add_header 'Access-Control-Max-Age' 1728000;

4、server 虚拟服务器详解及通用配置

复制代码
#每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
    server {
		#设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个location模块。
		#比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可以使用一个端口,比如都使用80端口提供web服务
        listen       80; #配置server监听的端口
        server_name  localhost; #本server的名称,当访问此名称的时候nginx会调用当前serevr内部的配置进程匹配。

		#是否在响应报文中的Content-Type显示指定的字符集,默认off不显示
		#charset charset | off;
        #charset koi8-r;#设置编码格式,默认是俄语格式,建议改为utf-8
		#示例
		#charset utf-8;

        #access_log  logs/host.access.log  main;
		
        autoindex on; # 显示目录,默认不开启
        
        autoindex_localtime on;# 显示文件修改时间 # 显示文件大小
        
        #多个 location 配置....
 
  }

5、server 中 多个location 配置

复制代码
        #以http的方式转发mp4请求到指定web服务器。
		#访问 http://127.0.0.1/6d.mp4 就可以播放视频,而视频6d.mp4就在html/dist目录下。
        location ~ /.mp4$ {
		    #root E:\sh\nginx; # 你的文件目录
            mp4;			# 支持mp4
            mp4_buffer_size 10m;#处理mp4初始内存大小
            mp4_max_buffer_size 50m;#处理mp4最大内存大小
        }

        location / {
            root   html/dist;#相当于默认页面的目录名称,默认是安装目录的相对路径,可以使用绝对路径配置。
            index  index.html index.htm;#默认的页面文件名称
			#给OPTIONS 添加 204 的返回,为了处理在发送POST请求时Nginx依然拒绝访问的错误,发送"预检请求"时,需要用到方法 OPTIONS,所以服务器需要允许该方法。
			if ($request_method = 'OPTIONS') {
				return 204;
			}
        }
		#proxy_pass的配置详解在后面
        location /test {
            proxy_pass http://127.0.0.1:9006;
			proxy_redirect off;#关闭重定向
			#proxy_redirect #旧地址 新地址;
			#proxy_redirect default;  #默认配置
			#若客户端发过来的请求header中有HOST这个字段,$http_host和$host表示的就是原始请求host,比如请求的时候HOST的值是http://demo.com,那么反代后还是http://demo.com。
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;#将$remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip
			proxy_set_header X-forwarded-For $proxy_add_x_forwarded_for;#获得用户真实ip
        }

        location /ars {
            proxy_pass http://192.8.3.211:9006;
        }
		#/person/getPersonUrl
        location /kvc {
			add_header 'Access-Control-Allow-Origin' '*' ;
			add_header 'Access-Control-Allow-Credentials' 'true';
			add_header 'Access-Control-Allow-Methods' '*';
			add_header 'Access-Control-Allow-Headers'  '*';
			add_header 'Access-Control-Max-Age' 1728000;
			proxy_pass http://192.8.3.211:1288;
		}
		
		location /about {
   			root /app/html; #必须要在html目录中创建一个名为about的目录才可以访问,否则报错。
		}
		
		location /about { #注意about后不要加/ , 使用alias的时候uri后面如果加了斜杠,则下面的路径配置必须加斜杠,否则403
   			alias /opt/html/about; #当访问about的时候,会显示alias定义的/opt/html/about里面的内容。
		}
		
		#注意:location中使用root指令和alias指令的意义不同
		#root 给定的路径对应于location中的/uri 左侧的/
		#alias 给定的路径对应于location中的/uri 的完整路径

		#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 { #location处理对应的不同错误码的页面定义到/50x.html,这个跟对应其server中定义的目录下。
			root   html;#定义默认页面所在的目录
		}

6、第二个server,单独处理视频播放

复制代码
#serverd第二个服务虚拟服务器
	#访问http://127.0.0.1:8088/6d.mp4 就可以播放视频,而视频6d.mp4就在E:/sh/nginx/nginx目录下。
	server {
        listen 8088;
        server_name 127.0.0.1;
        charset utf-8,gbk;
        #root /usr/local/nginx/html/files; # 你的文件目录
		root E:/sh/nginx/nginx; # 你的文件目录
        # 显示目录,默认不开启
        autoindex on;
        # 显示文件大小
        # 显示文件修改时间
        autoindex_localtime on;
        location ~ /.mp4$ {
            mp4;			# 支持mp4
            mp4_buffer_size 10m;
            mp4_max_buffer_size 50m;
        }
	}

7、第三个server 单独展示图片

复制代码
#作为下载服务器配置
	#官方文档:http://nginx.org/en/docs/http/ngx_http_autoindex_module.html
	#作为上传服务器
	# 定义缓存目录
    proxy_cache_path E:/sh/nginx/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
	server {
        listen 8081;
        location ~* /.(jpg|jpeg|png|gif)$ {
            # 开启缓存功能
            proxy_cache my_cache;
            
            # 指定缓存时间(单位为秒)
            proxy_cache_valid any 30d;
            
            # 如果未命中缓存则从后端服务器获取并进行缓存
            #proxy_pass http://backend-server;
            
            # 其他相关配置...
        }
		location ~* /.(css|js)$ {
			#1h代表一小时
			expires 1h;
			 # 开启缓存功能
            proxy_cache my_cache;
            
            # 指定缓存时间(单位为秒)
            proxy_cache_valid any 30d;
        }
    }

8、整个配置文件展示

复制代码
#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID路径,日志路径等。
#user  nobody;
#user nginx nginx;#启动Nginx工作进程的用户和组
worker_processes  1; #启动工作进程数数量
#worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同
#worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ; 
#将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,
#但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,
#减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

#events设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接,
#使用哪种事件驱动模型处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等。
events {
 #设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数为worker_connections * worker_processes,
 #作为反向代理的时候为(worker_connections * worker_processes)/2
    worker_connections  1024;
}

#http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置,
#http块可以包含多个server块,而一个server块中又可以包含多个location块,
#server块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时时间和单个链接的请求上限等。
http {
    include       mime.types; #导入支持的文件类型,是相对于/apps/nginx/conf的目录,在响应报文中将指定的文件扩展名映射至MIME对应的类型
    default_type  application/octet-stream; #除mime.types中文件类型外,设置其它文件默认类型,访问其它类型时会提示下载不匹配的类型文件

    #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;
	#作为web服务器的时候打开sendfile加快静态文件传输,指定是否使用sendfile系统调用来传输文件,
	#sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,
	#操作效率很高,被称之为零拷贝,硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈。
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;  #长连接超时时间,单位是秒

	#开启gzip压缩,若想关闭gzip压缩,则需要注释掉这句话,或者将on换成off
    #gzip  on;
    #配置允许压缩的页面的最小字节数,页面字节数从header头中的Content-Length中获>取,建议设置成1k,因为如果数据小于1k,他也会压缩成1k,这样会起到反作用。
    #gzip_min_length 1k;
    #4个16k的数据流用于存储gzip的压缩结果数据流
    #gzip_buffers 4 16k;
    #支持的http版本为1.1
    #gzip_http_version 1.1;
    #判断客户端是否支持gzip技术,若不支持则不会进行gzip处理
    #gzip_vary on;

    # 全局跨域配置
	#为 * 表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求,也可以指定一个确定的URL
	add_header 'Access-Control-Allow-Origin' '*' always;
	#可选字段,为true表示允许发送Cookie。同时,发送时,必须设置XMLHttpRequest.withCredentials为true才有效,请求若服务器不允许浏览器发送,删除该字段即可。
    add_header 'Access-Control-Allow-Credentials' 'true';
	#代表允许使用指定的方法请求该地址
    add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, DELETE, PUT, OPTIONS';
	#代表允许在请求该地址的时候带上指定的请求头,例如:Content-Type,Authorization,使用逗号(,)拼接起来放在双引号(")中
	add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, X-Custom-Header, Access-Control-Expose-Headers, Token, Authorization';
	add_header 'Access-Control-Allow-Headers'  '*';
	#代表着在 1728000 秒之内不用请求该地址的时候 不需要再进行预检请求,也就是跨域缓存。
    add_header 'Access-Control-Max-Age' 1728000;
	

	#每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
    server {
		#设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个location模块。
		#比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可以使用一个端口,比如都使用80端口提供web服务
        listen       80; #配置server监听的端口
        server_name  localhost; #本server的名称,当访问此名称的时候nginx会调用当前serevr内部的配置进程匹配。

		#是否在响应报文中的Content-Type显示指定的字符集,默认off不显示
		#charset charset | off;
        #charset koi8-r;#设置编码格式,默认是俄语格式,建议改为utf-8
		#示例
		#charset utf-8;

        #access_log  logs/host.access.log  main;
		
        autoindex on; # 显示目录,默认不开启
        
        autoindex_localtime on;# 显示文件修改时间 # 显示文件大小
		#以http的方式转发mp4请求到指定web服务器。
		#访问 http://127.0.0.1/6d.mp4 就可以播放视频,而视频6d.mp4就在html/dist目录下。
        location ~ /.mp4$ {
		    #root E:\sh\nginx; # 你的文件目录
            mp4;			# 支持mp4
            mp4_buffer_size 10m;#处理mp4初始内存大小
            mp4_max_buffer_size 50m;#处理mp4最大内存大小
        }

        location / {
            root   html/dist;#相当于默认页面的目录名称,默认是安装目录的相对路径,可以使用绝对路径配置。
            index  index.html index.htm;#默认的页面文件名称
			#给OPTIONS 添加 204 的返回,为了处理在发送POST请求时Nginx依然拒绝访问的错误,发送"预检请求"时,需要用到方法 OPTIONS,所以服务器需要允许该方法。
			if ($request_method = 'OPTIONS') {
				return 204;
			}
        }
		#proxy_pass的配置详解区别 https://blog.csdn.net/jsxztshaohaibo/article/details/134578031
        location /test {
            proxy_pass http://127.0.0.1:9016;
			proxy_redirect off;#关闭重定向
			#proxy_redirect #旧地址 新地址;
			#proxy_redirect default;  #默认配置
			#若客户端发过来的请求header中有HOST这个字段,$http_host和$host表示的就是原始请求host,比如请求的时候HOST的值是http://demo.com,那么反代后还是http://demo.com。
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;#将$remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip
			proxy_set_header X-forwarded-For $proxy_add_x_forwarded_for;#获得用户真实ip
        }

        location /artemis {
            proxy_pass http://192.8.3.211:9006;
        }
		#/person/getPersonUrl
        location /kcvc {
			add_header 'Access-Control-Allow-Origin' '*' ;
			add_header 'Access-Control-Allow-Credentials' 'true';
			add_header 'Access-Control-Allow-Methods' '*';
			add_header 'Access-Control-Allow-Headers'  '*';
			add_header 'Access-Control-Max-Age' 1728000;
			proxy_pass http://192.8.3.211:1288;
		}
		
		location /about {
   			root /app/html; #必须要在html目录中创建一个名为about的目录才可以访问,否则报错。
		}
		
		location /about { #注意about后不要加/ , 使用alias的时候uri后面如果加了斜杠,则下面的路径配置必须加斜杠,否则403
   			alias /opt/html/about; #当访问about的时候,会显示alias定义的/opt/html/about里面的内容。
		}
		
		#注意:location中使用root指令和alias指令的意义不同
		#root 给定的路径对应于location中的/uri 左侧的/
		#alias 给定的路径对应于location中的/uri 的完整路径

		#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 { #location处理对应的不同错误码的页面定义到/50x.html,这个跟对应其server中定义的目录下。
			root   html;#定义默认页面所在的目录
		}
    }
	#serverd第二个服务虚拟服务器
	#访问http://127.0.0.1:8088/6d.mp4 就可以播放视频,而视频6d.mp4就在E:/sh/nginx/nginx目录下。
	server {
        listen 8088;
        server_name 127.0.0.1;
        charset utf-8,gbk;
        #root /usr/local/nginx/html/files; # 你的文件目录
		root E:/sh/nginx/nginx; # 你的文件目录
        # 显示目录,默认不开启
        autoindex on;
        # 显示文件大小
        # 显示文件修改时间
        autoindex_localtime on;
        location ~ /.mp4$ {
            mp4;			# 支持mp4
            mp4_buffer_size 10m;
            mp4_max_buffer_size 50m;
        }
	}
	#作为下载服务器配置
	#官方文档:http://nginx.org/en/docs/http/ngx_http_autoindex_module.html
	#作为上传服务器
	# 定义缓存目录
    proxy_cache_path E:/sh/nginx/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
	server {
        listen 8081;
        location ~* /.(jpg|jpeg|png|gif)$ {
            # 开启缓存功能
            proxy_cache my_cache;
            
            # 指定缓存时间(单位为秒)
            proxy_cache_valid any 30d;
            
            # 如果未命中缓存则从后端服务器获取并进行缓存
            #proxy_pass http://backend-server;
            
            # 其他相关配置...
        }
		location ~* /.(css|js)$ {
			#1h代表一小时
			expires 1h;
			 # 开启缓存功能
            proxy_cache my_cache;
            
            # 指定缓存时间(单位为秒)
            proxy_cache_valid any 30d;
        }
    }
}

9、参考proxy_pass的配置详解区别

参考代理uri区别文章

到此,单体服务的多种使用场景从不同角度展示出来了,分享告一段落,后面会持续更新,敬请期待!

相关推荐
睡不醒的猪儿9 小时前
Nginx 服务优化与防盗链配置方案
运维·nginx
大佐不会说日语~10 小时前
使用 Cloudflare平台 + Docker + Nginx 完成网站 HTTPS 部署实战记录
nginx·docker·https·部署·cloudflare
Knight_AL10 小时前
使用 Nginx 为内网 Java 服务实现 HTTPS
java·nginx·https
坚持学习前端日记11 小时前
Nginx 搭建文件服务器
运维·服务器·nginx
徐同保12 小时前
nginx接口超时,增加接口超时时间
运维·nginx
Benny的老巢1 天前
Mac上用XAMPP搭建局域网可访问的开发环境,让局域网内其他设备通过域名访问
nginx·macos·apache·xampp·php开发环境
岚天start1 天前
Docker部署NGINX实现服务四层转发方案
服务器·nginx·docker
微凉的衣柜1 天前
Windows Server 使用 Nginx 反向代理实现域名访问内网 Gradio 应用
运维·windows·nginx
上去我就QWER1 天前
什么是反向代理?
后端·nginx
小白冲鸭1 天前
苍穹外卖-前端环境搭建-nginx双击后网页打不开
运维·前端·nginx