windows下Nginx配置及负载均衡使用

Posted 嘉禾嘉宁papa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows下Nginx配置及负载均衡使用相关的知识,希望对你有一定的参考价值。

一、简介

  nginx(engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上Nginx的并发能力在同类型的网页服务器中表现较好,许多的大厂都在用。
  今天我们就来讲一下windows下Nginx的安装配置及简单负载均衡的使用。

二、环境准备

2.1、下载

  Nginx下载地址: http://nginx.org/en/download.html,本文中下载第二个windows的稳定版本。如图:

2.2、Nginx目录

  这里我解压到本地C:\\myProgram\\Nginx-1.20.1\\后的目录结构如下:

  进入到配置文件目录C:\\myProgram\\Nginx-1.20.1\\conf,我们新建一个conf.d的目录,用于存放自定义的配置文件等。

2.3、常用命令

  这里我们列出一些常用的命令,后续可以直接使用:

命令含义
nginx -h查看帮助信息
nginx -v 或者 nginx -V查看Nginx的版本号,v只是简单显示版本信息,V不但显示版本信息,还显示配置参数信息
nginx -s reopen打开日志文件
nginx -t验证(nginx.conf)配置文件是否有语法错误
nginx -s reload配置文件修改重装载命令
nginx -c 指定配置文件的路径指定配置文件启动,默认是conf/nginx.conf
start nginx启动Nginx
nginx -s quit正常停止或关闭Nginx
nginx -s stop快速停止或关闭Nginx

注意:
  window版本启动方式建议是进入到安装的目录,比如我这里的C:\\myProgram\\Nginx-1.20.1\\conf,通过cmd命令,先执行nginx -t检查配置文件是否配置正确,再执行start nginx,如图:

如果是已经启动了,修改了配置文件则只需要执行nginx -t,再执行nginx -s reload即可。启动成功后,访问下:http://localhost:80或者http://localhost,出现如下图及表示成功了:

三、配置

  之前我们看过目录结构,一般nginx.conf类上于全局的配置,我们可以在自定义的目录conf.d创建我们的配置文件,一般按照域名加端口的方式命名,如localhost_80、localhost_443等,负载均衡的都放到conf.d目录,命名为upstream.conf,当然你也可以不同方式命名。对于nginx配置最好分类,如果配置多了就很难维护了。

3.1、配置nginx.conf

#Nginx的全局配置,也就是main,包含Events和HTTP

#指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行(windows会有警告信息)
#user nobody nobody;
#指定了Nginx要开启的进程数,每个Nginx进程平均耗费10M~12M内存
worker_processes 2;
#定义全局错误日志文件,一定要设置warn级别以上,日志输出级别有:[debug|info|notice|warn|error|crit]
error_log logs/error.log notice;
#指定进程pid的存储文件位置
pid logs/nginx.pid;
#Nginxworker最大打开文件数
worker_rlimit_nofile 65535;

#events事件指令是设定Nginx的工作模式及连接数上限
events{
	#指定Nginx的工作模式,Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll
	#use epoll;
	#单个进程最大连接数(最大连接数=连接数*进程数)
	worker_connections 65536;
}


#设定http服务器
http{
	#实现对配置文件所包含的文件的设定
	include mime.types;
	#默认文件类型:二进制流
	default_type application/octet-stream;
	#服务域名的最大hash表大小
	server_names_hash_max_size 512;     
	#服务域名的hash表大小
	server_names_hash_bucket_size 128;
	#指定Nginx日志的输出格式
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
	    '$status $body_bytes_sent  $request_body "$http_referer" '
	    '"$http_user_agent" "$http_x_forwarded_for"'
	    '"responsetime":$request_time'
	    '-"$upstream_cache_status"'
		' Alian $http_[W-Os] $http_[W-Brand] $http_[W-Model] $http_[W-IMEI] $http_[W-App-Version] $http_[W-Token] $http_[W-Partner-Id] $http_[W-Operator-Id] $http_[W-Window-Id]';

	log_format logstash '{"@timestamp":"$time_iso8601",'
		'"slbip":"$remote_addr",'
		'"clientip":"$http_x_forwarded_for",'
		'"serverip":"$server_addr",'
		'"size":$body_bytes_sent,'
		'"responsetime":$request_time,'
		'"domain":"$host",'
		'"method":"$request_method",'
		'"requesturi":"$request_uri",'
		'"url":"$uri",'
		'"appversion":"$HTTP_APP_VERSION",'
		'"referer":"$http_referer",'
		'"agent":"$http_user_agent",'
		'"status":"$status",'
		'"W-Brand":"$http_[W-Brand]",'
		'"W-Model":"$http_[w-model]",'
		'"W-Token":"$http_[w-token]",'
		'"W-Token":"$http_[W-Token]",'
		 '"devicecode":"$HTTP_HA"}';

	#允许客户端请求的最大的单个文件字节数
	client_max_body_size 20m;
	#指定来自客户端请求头的headerbuffer大小
	client_header_buffer_size 32K;
	#指定客户端请求中较大的消息头的缓存最大数量和大小
	large_client_header_buffers 4 32k;
	#用于开启高效文件传输模式
	sendfile on;
	#数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,从而提高I/O性能,也可以有助于解决网络堵塞,当然会有一点点延迟(使用sendfile函数时,tcp_nopush才起作用,和tcp_nodelay互斥)
	tcp_nopush on;
	#发送小块数据时,立即发送数据,响应快,客户端受益(和tcp_nopush互斥)
	tcp_nodelay off;
	#设置客户端连接保持活动的超时时间,单位是秒,超过则关闭连接
	keepalive_timeout 60;
	#自动创建索引,比如目录浏览下载功能,默认关闭
	autoindex off;
	#设置客户端请求头读取超时时间
	client_header_timeout 10;
	#设置客户端请求主体读取超时时间,默认值是60
	client_body_timeout 30;
	#指定响应客户端的超时时间
	send_timeout 30;

	#设定Nginx服务器和后端FastCGI服务器连接的超时时间
	fastcgi_connect_timeout 60;
	#设定Nginx允许FastCGI服务端返回数据的超时时间
	fastcgi_send_timeout 60;
	#设定Nginx从FastCGI服务端读取响应信息的超时时间
	fastcgi_read_timeout 60;
	#设定用来读取从FastCGI服务端收到的第一部分响应信息的缓冲区大小
	fastcgi_buffer_size 64k;
	#设定用来读取从FastCGI服务端收到的响应信息的缓冲区大小以及缓冲区数量
	fastcgi_buffers 4 64k;
	#设定系统很忙时可以使用的fastcgi_buffers大小,推荐大小为fastcgi_buffers *2
	fastcgi_busy_buffers_size 128k;
	#fastcti临时文件的大小,可设置128-256K
	fastcgi_temp_file_write_size 128k;

	#配置Nginx的HttpGzip模块(是否安装了HttpGzip模块,优化网站)
	#开启GZIP压缩,实时压缩输出数据流
	#gzip on;
	#设置允许压缩的页面最小字节数,默认0,不管页面多大都进行压缩,建议大于1K
	#gzip_min_length 1k;
	#申请4个单位为16K的内存作为压缩结果流缓存
	#gzip_buffers 4 16k;
	#设置识别HTTP协议版本,默认是1.1
	#gzip_http_version 1.1;
	#指定GZIP压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源
	#gzip_comp_level 3;
	#指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的
	#gzip_types text/plain application/x-javascript text/css application/xml;
	#让前端的缓存服务器缓存经过GZIP压缩的页面
	#gzip_vary on;

	#包含子配置文件,此处是包含conf.d目录下所有的.conf文件
	include conf.d/*.conf;
	include fastcgi.conf;
}

3.2、自定义配置localhost_80.conf

server{
    listen 80 ;
    #server_name 10.130.3.16;
    server_name localhost;
	charset utf-8;
    add_header X-Cache $upstream_cache_status;
    #站点根目录(自定义的,不一定是这个)
	root html;
	location / {
		root   html;
		index  index.html index.htm;
    }

    location ~ ^/NLB/ {
        proxy_redirect off;
		#端口
        proxy_set_header Host $host;
		#远程地址
        proxy_set_header X-Real-IP $remote_addr;
		#程序可获取远程ip地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		#此处会用的upstream.conf,此文件在nginx.conf已经引入了
        proxy_pass http://load-balance;
    }

	#所有静态文件由nginx直接读取不经过tomcat或resin($和{中间有一个空格)
	location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
		expires 30d;
	}
	
	#($和{中间有一个空格)
	location ~ .*.(js|css)?$ {
		expires 15d;
	}
	
	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root html;
	}
	
	location ~ ^.*\\.svn\\/{
        deny all;
    }

	#设定查看Nginx状态的地址
	location /NginxStatus {
		stub_status off;
		access_log logs/NginxStatus.log;
		auth_basic "NginxStatus";
		auth_basic_user_file confpasswd;
		#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
	}
	
	#可以绝对路径,如果是相对路径就是相对执行启动的目录(nginx.exe)
    access_log logs/localhost_access.log;
}

3.3、自定义负载均衡配置upstream.conf

upstream load-balance {
	#预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器
    server 127.0.0.1:8082 backup;
	#当前的server暂时不参与负载均衡
    server 127.0.0.1:8083 down;
	server 127.0.0.1:8084;
    server 127.0.0.1:8085;
}

事实上我们还可以配置权重信息weight,值越大轮询到的可能性就更大,max_fails允许请求失败的次数,默认为1,fail_timeout在经历了max_fails次失败后,暂停服务的时间,两者一般一起使用,如下:

upstream load-balance {
	#预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器
    server 127.0.0.1:8082 backup;
	#当前的server暂时不参与负载均衡
    server 127.0.0.1:8083 down;
	server 127.0.0.1:8084 weight=10;
    server 127.0.0.1:8085 weight=1 max_fails=2 fail_timeout=30s;
}

四、测试及运行结果

4.1 测试项目

application.yml

server:
  port: 8082
  servlet:
    context-path: /NLB
package com.alian.loadbalance.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class LoadBalanceController {

    @Value("${server.port}")
    private int serverPort;

    @RequestMapping("loadBalance")
    public String loadBalance(){
        log.info("服务【{}】的处理返回",serverPort);
        return "服务端口:"+serverPort;
    }

}

4.2 在idea运行多实例服务

如果要使应用高可用,就需要服务部署多个,这里以idea为例,看本机怎么测试。因为配置文件里我们端口是8082,我们的应用只要端口不一样即可,所以我们每次启动的时候就更改端口,我这里启动的4个,具体说明如下:

服务NLB端口说明
8082热备份
8083下线状态
8084正常运行
8085正常运行

通过idea运行旁边的Edit configurations右上角勾上Allow parallel run,记得每次都要更改端口,再运行哦,具体启动如下图:

4.3 正常请求

连续请求两次:http://localhost/NLB/loadBalance得到结果:


不管两次还是多次,结果都是轮询返回的,这是基于nginx默认的轮询规则。

4.4 其他测试

关闭端为80848085的实例。再次请求http://localhost/NLB/loadBalance,发现我们的热备服务器起作用了,得到结果为:

4.5 静态资源请求

我们在C:\\myProgram\\Nginx-1.20.1\\html下放一个图片AlianBlog.png,因为localhost_80.conf已经配置了根目录就是html,所有我们直接请求http://localhost/AlianBlog.png,结果如下:

以上是关于windows下Nginx配置及负载均衡使用的主要内容,如果未能解决你的问题,请参考以下文章

window下nginx负载均衡简单配置-----权重的实现

Linux 下Nginx 的安装及负载均衡的简单配置

Nginx负载均衡简单配置

nginx入门window下实现简单的负载均衡

windows平台下利用Nginx做负载均衡

nginx负载均衡原理及配置