cxl
Published on 2025-03-16 / 837 Visits
46
0

Nginx 配置项

核心配置文件结构

Nginx 的核心配置文件通常位于/etc/nginx/nginx.conf。这个文件包含了全局配置和多个服务器块(server block)。全局配置部分设置了 Nginx 运行的基本参数,如工作进程数、错误日志路径等。而服务器块则针对不同的虚拟主机或服务进行单独配置,一个配置文件中可以存在多个服务器块,每个服务器块负责处理特定域名或 IP 地址的请求。

	http {
		# 全局配置
		user nginx;								# nginx用户启动
		worker_processes auto;					# 工作进程数,自动根据CPU核心数调整Worker进程数量
		error_log /var/log/nginx/error.log;		# 错误日志路径
		pid /var/run/nginx.pid;					# 进程ID地址

		# 开启压缩机制
	    gzip on;
	    # 指定会被压缩的文件类型(也可自己配置其他类型)
	    gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
	    # 设置压缩级别,越高资源消耗越大,但压缩效果越好
	    gzip_comp_level 5;
	    # 在头部中添加Vary: Accept-Encoding(建议开启)
	    gzip_vary on;
	    # 处理压缩请求的缓冲区数量和大小
	    gzip_buffers 16 8k;
	    # 对于不支持压缩功能的客户端请求不开启压缩机制
	    gzip_disable "MSIE [1-6]\."; # 低版本的IE浏览器不支持压缩
	    # 设置压缩响应所支持的HTTP最低版本
	    gzip_http_version 1.1;
	    # 设置触发压缩的最小阈值
	    gzip_min_length 2k;
	    # 关闭对后端服务器的响应结果进行压缩
	    gzip_proxied off;

		sendfile on; # 开启零拷贝机制

		# 负载均衡
		upstream api_server{
           ip_hash;  # 同个IP或客户端每次请求都匹配两个服务端
		   # 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2
		   server 192.168.1.100:8080 weight=100 max_fails=2 fail_timeout=30s; 
		   server 192.168.1.101:8080 weight=200 max_fails=2 fail_timeout=30s;
		}	
		
		# 服务器块示例,一般单独文件出来,好维护
		server {
		    listen       80;	# 监听的端口
		    server_name  chenxianlin.com;  # 解析的域名,如果是其它域名则不会匹配下面规则,可以设置多个,使用逗号隔开,如 chenxianlin.com,www.chenxianlin.com
			# 将请求改写为HTTPS,即直接走https配置的规则
		    # rewrite ^(.*)$ https://chenxianlin.com;		

			# 匹配根路径, 即 chenxianlin.com
		    location / {
		        root   /usr/share/nginx/html;	# 匹配后访问的目录
		        index  index.html index.htm;	# 匹配后访问对应目录下的文件
		    }
		}

		
		server {
			# 监听HTTPS默认的443端口
		    listen 443;
		    # 配置自己项目的域名
		    server_name chenxianlin.com;
		    # 打开SSL加密传输
		    ssl on;
		    # 输入域名后,首页文件所在的目录
		    root html;
		    # 配置首页的文件名
		    index index.html index.htm index.jsp index.ftl;
		    # 配置自己下载的数字证书
		    ssl_certificate  certificate/cxl.pem;
		    # 配置自己下载的服务器私钥
		    ssl_certificate_key certificate/cxl.key;
		    # 停止通信时,加密会话的有效期,在该时间段内不需要重新交换密钥
		    ssl_session_timeout 5m;
		    # TLS握手时,服务器采用的密码套件
		    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
		    # 服务器支持的TLS版本
		    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
		    # 开启由服务器决定采用的密码套件
		    ssl_prefer_server_ciphers on;

			# 匹配根路径, 即 chenxianlin.com
		    location / {
		        root   /usr/share/nginx/html;	# 匹配后访问的目录
		        index  index.html index.htm;	# 匹配后访问对应目录下的文件
		    }
		}


		# 屏蔽该文件中的所有IP,全局设置
		# include /usr/local/nginx/IP/BlocksIP.conf; 

		# 引入目录下的配置
		include conf.d/*.conf;
	}

server里的各种配置

	location /api/ {
		# 反向代理
	    proxy_pass http://127.0.0.1:8080;	# 将api开头的url请求转发到 127.0.0.1:8080 这个地址
		# 使用负载均衡
		# proxy_pass http://api_server;
	    proxy_set_header Host $host;		# 设置请求头 host,以便在转发后下游能正常获取到该值
	    proxy_set_header X-Real-IP $remote_addr;	# 设置请求头 X-Real-IP,客户端的真实IP
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	# 设置请求头 X-Forwarded-For,包含客户端的 IP 地址以及所有经过的代理服务器的 IP 地址
	    proxy_set_header X-Forwarded-Proto $scheme;		# 这是一个自定义的 HTTP 头字段,用于标识客户端到 Nginx 服务器之间的通信协议(如 http 或 https)

		
		# client_max_body_size 100m; # 设置请求体允许的最大体积,即客户端上传的文件或数据
		# client_header_timeout 60s;   # 等待客户端发送一个请求头的超时时间
		# client_body_timeout 30s; 	 # 设置读取请求体的超时时间
		# proxy_read_timeout 30s;    # 设置请求被后端服务器读取时,Nginx等待的最长时间
		# proxy_send_timeout 30s; 	 # 设置后端向Nginx返回响应时的超时时间

		# 设置对 websocket 的支持
		proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
	
		
		# 允许跨域的请求,可以自定义变量$http_origin,*表示所有
	    add_header 'Access-Control-Allow-Origin' *;
	    # 允许携带cookie请求
	    add_header 'Access-Control-Allow-Credentials' 'true';
	    # 允许跨域请求的方法:GET,POST,OPTIONS,PUT
	    add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT';
	    # 允许请求时携带的头部信息,*表示所有
	    add_header 'Access-Control-Allow-Headers' *;
	    # 允许发送按段获取资源的请求
	    add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
	    # 一定要有!!!否则Post请求无法进行跨域!
	    # 在发送Post跨域请求前,会以Options方式发送预检请求,服务器接受时才会正式请求
	    if ($request_method = 'OPTIONS') {
	        add_header 'Access-Control-Max-Age' 1728000;
	        add_header 'Content-Type' 'text/plain; charset=utf-8';
	        add_header 'Content-Length' 0;
	        # 对于Options方式的请求返回204,表示接受跨域请求
	        return 204;
	    }
	
		# 黑白名单
		allow xxx.xxx.xxx.xxx; # 允许指定的IP访问,可以用于实现白名单。
		deny xxx.xxx.xxx.xxx; # 禁止指定的IP访问,可以用于实现黑名单。
		deny xxx.xxx.xxx.xxx; # 禁止指定的IP访问,可以用于实现黑名单。
		# include conf/whitelist.conf	# 使用文件形式控制黑白名单, conf里的内容跟这里的一样,都是 allow xxx.xxx.xxx.xxx; 这种格式
	
		
		
	}

	# 在动静分离的location中开启防盗链机制,Nginx的防盗链机制实现,跟一个头部字段:Referer有关,该字段主要描述了当前请求是从哪儿发出的,那么在Nginx中就可获取该值,然后判断是否为本站的资源引用请求,如果不是则不允许访问。
	# Nginx中通过配置项为valid_referers来实现,语法如下:
	# - valid_referers none | blocked | server_names | string ...;
	# - none:表示接受没有Referer字段的HTTP请求访问。
	# - blocked:表示允许 http://或 https//以外的请求访问。
	# - server_names:资源的白名单,这里可以指定允许访问的域名。
	# - string:可自定义字符串,支配通配符、正则表达式写法。
	location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){
	    # 最后面的值在上线前可配置为允许的域名地址
	    valid_referers blocked 192.168.1.129;
	    if ($invalid_referer) {
	        # 可以配置成返回一张禁止盗取的图片
	        # rewrite   ^/ http://xx.xx.com/NO.jpg;
	        # 也可直接返回403
	        return   403;
	    }
	    
	    root   /soft/nginx/static_resources;
	    expires 7d;
	}


Comment