一 nginx简述html
Nginx是一款轻量级的网页服务器、反向代理服务器。相较于Apache、lighttpd具备占有内存少,稳定性高等优点。**它最常的用途是提供反向代理服务。**
- 负载均衡 -
二 安装nginx步骤(建议下述安装过程全程root)nginx
0 概数c++
在Centos下,yum源不提供nginx的安装,能够经过切换yum源的方法获取安装。也能够经过直接下载安装包的方法,**如下命令均需root权限执行**:
首先安装必要的库(nginx 中gzip模块须要 zlib 库,rewrite模块须要 pcre 库,ssl 功能须要openssl库)。选定**/usr/local**为安装目录,如下具体版本号根据实际改变。
1 安装gcc gcc-c++web
# yum install -y gcc gcc-c++
2 安装PCRE库正则表达式
# cd /usr/local/ # wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz # tar -zxvf pcre-8.33.tar.gz # cd pcre-8.33 # ./configure # make && make install
3 安装SSL库算法
# cd /usr/local/ # wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1j.tar.gz # tar -zxvf openssl-1.0.1j.tar.gz # cd openssl-1.0.1j # ./config # make && make install
4 安装zlib库数据库
# cd /usr/local/ # wget http://zlib.net/zlib-1.2.11.tar.gz # tar -zxvf zlib-1.2.11.tar.gz # cd zlib-1.2.11 # ./configure # make && make install
5 安装nginx(本安装为1.8.0版本)缓存
# cd /usr/local/ # wget http://nginx.org/download/nginx-1.8.0.tar.gz # tar -zxvf nginx-1.8.0.tar.gz # cd nginx-1.8.0 # ./configure --user=nobody --group=nobody --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-http_sub_module --with-http_ssl_module --with-pcre=/usr/local/pcre-8.33 --with-zlib=/usr/local/zlib-1.2.11 (注: --with-http_ssl_module:这个不加后面在nginx.conf配置ssl:on后,启动会报nginx: [emerg] unknown directive "ssl" in /opt/nginx/conf/nginx.conf 异常) # make && make install
三 nginx操做命令服务器
1 启动nginx服务网络
# /usr/local/nginx/sbin/nginx
2 重启nginx服务
# /usr/local/nginx/sbin/nginx –s reload
3 中止nginx服务
# /usr/local/nginx/sbin/nginx –s stop
4 强制关闭nginx服务
# pkill nginx
四 nginx正反向代理基本配置
#nginx配置 #user nobody; worker_processes 1; #服务器并发处理服务关键配置 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; #最大链接数为 1024. } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; keepalive_timeout 65; #gzip on; #http头压缩 #正向代理配置 server { listen 8080; # 代理监听端口 resolver 223.5.5.5; #代理DNS配置 #charset koi8-r; access_log /home/lich/logs/fproxy.access.log; #accesslog输出路径 error_log /home/lich/logs/fproxy.error.log; #errorlog输出路径 location / { proxy_pass $scheme://$host$request_uri; # 配置正向代理参数 proxy_set_header Host $http_host; # 解决若是URL中带"."后Nginx 503错误 proxy_buffers 256 4k; # 配置缓存大小 proxy_max_temp_file_size 0; # 关闭磁盘缓存读写减小I/O proxy_connect_timeout 30; # 代理链接超时时间 # 配置代理服务器HTTP状态缓存时间 proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; } } #反向代理配置 server { listen 80; server_name test.fw.com; #代理转发域名配置 access_log /home/lich/logs/rproxy.access.log; error_log /home/lich/logs/rproxy.error.log; location / { proxy_pass http://10.60.221.22:8001; #代理到后段实际应用服务器地址 index index.html index.htm index.jsp; } #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 { root html; } } }
五 nginx配置参数介绍
1 listen
1.1 配置监听的ip地址
listen address[:port] [default_server][setfib=number][backlog=number][rcvbuf=size][sndbuf=size][deferred][accept_filter=filter][bind][ssl];
1.2 配置监听端口
listen port[default_server] [setfib=number][backlog=number][rcvbuf=size][sndbuf=size][accept_filter=filter][deferred][bind][ipv6only=on|off][ssl];
1.3 配置Unix Domain Socket
listen unix:path [default_server][backlog=number][rcvbuf=size][sndbuf=size][accept_filter=filter][deferred][bind][ssl];
1.4 监听配置用法
listen *:80 | *:8080 #监听全部80端口和8080端口 listen IP_address:port #监听指定的地址和端口号 listen IP_address #监听指定ip地址全部端口 listen port #监听该端口的全部IP链接
1.5 参数解释
- address:IP地址,若是是 IPV6地址,须要使用中括号[] 括起来,好比[fe80::1]等。 - port:端口号,若是只定义了IP地址,没有定义端口号,那么就使用80端口。 - path:socket文件路径,如 var/run/nginx.sock等。 - default_server:标识符,将此虚拟主机设置为 address:port 的默认主机。(在 nginx-0.8.21以前使用的是default指令) - setfib=number:Nginx-0.8.44 中使用这个变量监听 socket 关联路由表,目前只对 FreeBSD 起做用,不经常使用。 - backlog=number:设置监听函数listen()最多容许多少网络链接同时处于挂起状态,在 FreeBSD 中默认为 -1,其余平台默认为511. - rcvbuf=size:设置监听socket接收缓存区大小。 - sndbuf=size:设置监听socket发送缓存区大小。 - deferred:标识符,将accept()设置为Deferred模式。 - accept_filter=filter:设置监听端口对全部请求进行过滤,被过滤的内容不能被接收和处理,本指令只在 FreeBSD 和 NetBSD 5.0+ 平台下有效。filter 能够设置为 dataready 或 httpready 。 - bind:标识符,使用独立的bind() 处理此address:port,通常状况下,对于端口相同而IP地址不一样的多个链接,Nginx 服务器将只使用一个监听指令,并使用 bind() 处理端口相同的全部链接。 - ssl:标识符,设置会话链接使用 SSL模式进行,此标识符和Nginx服务器提供的 HTTPS 服务有关。
2 server_name
该指令用于虚拟主机的配置。一般分为如下两种
2.1 基于名称的虚拟主机配置
- 语法格式以下: # server_name name ...; - 对于name 来讲,能够只有一个名称,也能够有多个名称,中间用空格隔开。而每一个名字由两段或者三段组成,每段之间用“.”隔开。 # server_name 123.com www.123.com - 可使用通配符“*”,但通配符只能用在由三段字符组成的首段或者尾端,或者由两端字符组成的尾端。 # server_name *.123.com www.123.* - 还可使用正则表达式,用“~”做为正则表达式字符串的开始标记。 # server_name ~^www\d+\.123\.com$; #该表达式“~”表示匹配正则表达式,以www开头(“^”表示开头),紧跟着一个0~9之间的数字,在紧跟“.123.co”,最后跟着“m”($表示结尾)以上匹配的顺序优先级以下: ①、准确匹配 server_name ②、通配符在开始时匹配 server_name 成功 ③、通配符在结尾时匹配 server_name 成功 ④、正则表达式匹配 server_name 成功
2.2 基于IP地址的虚拟主机配置
#语法结构和基于域名匹配同样,并且不须要考虑通配符和正则表达式的问题。 server_name 192.168.1.1
3 location
# 该指令用于匹配 URL
location [ = | ~ | ~* | ^~] uri { } = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,若是匹配成功,就中止继续向下搜索并当即处理该请求。 ~ :用于表示 uri 包含正则表达式,而且区分大小写。 ~* :用于表示 uri 包含正则表达式,而且不区分大小写。 ^~ :用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,当即使用此 location 处理请求,而再也不使用 location 块中的正则 uri 和请求字符串作匹配。 注意:若是 uri 包含正则表达式,则必需要有 ~ 或者 ~* 标识。
4 proxy_pass
# 该指令用于设置被代理服务器的地址。能够是主机名称、IP地址加端口号的形式
proxy_pass URL; # URL 为被代理服务器的地址,能够包含传输协议、主机名称或IP地址加端口号,URI等。 proxy_pass http://www.123.com/uri;
5 index
# 该指令用于设置网站的默认首页。
index filename ...; # 后面的文件名称能够有多个,中间用空格隔开。 index index.html index.jsp; ps:一般该指令有两个做用:第一个是用户在请求访问网站时,请求地址能够不写首页名称;第二个是能够对一个请求,根据请求内容而设置不一样的首页。
六 ngxin负载均衡
1 轮询算法负载均衡
upstream OrdinaryPolling { server 192.168.1.100:8081; server 192.168.1.100:8082; } server { listen 80; server_name test.fw.com; access_log /home/lich/logs/rproxy_slb.access.log; error_log /home/lich/logs/rproxy_slb.error.log; location / { proxy_pass http://OrdinaryPolling; index index.html index.htm index.jsp; # deny ip # allow ip } }
2 基于比例加权轮询负载均衡
upstream OrdinaryPolling { server 10.60.220.60:8081 weight=2; server 10.60.220.60:8082 weight=5; } server { listen 80; server_name test.fw.com; access_log /home/lich/logs/rproxy_slb.access.log; error_log /home/lich/logs/rproxy_slb.error.log; location / { proxy_pass http://OrdinaryPolling; # index index.html index.htm index.jsp; # deny ip # allow ip } }
3 基于IP路由负载均衡
场景解释:咱们知道一个请求在通过一个服务器处理时,服务器会保存相关的会话信息,好比session,可是该请求若是第一个服务器没处理完,经过nginx轮询到第二个服务器上,那么这个服务器是没有会话信息的。
最典型的一个例子:用户第一次进入一个系统是须要进行登陆身份验证的,首先将请求跳转到web1应用服务器进行处理,登陆信息是保存在web1应用服务器上的,这时候须要进行别的操做,那么可能会将请求轮询到web2应用服务器上,那么因为 web2没有保存会话信息,web2服务器会觉得该用户没有登陆,而后继续登陆一次,若是有多个服务器,每次第一次访问都要进行登陆,这显然是很影响用户体验的。
这里产生的一个问题也就是集群环境下的 session 共享,如何解决这个问题? 一般由两种方法: 1、第一种方法是选择一个中间件,将登陆信息保存在一个中间件上,这个中间件能够为 Redis 这样的数据库。那么第一次登陆,咱们将session 信息保存在 Redis 中,跳转到第二个服务器时,咱们能够先去Redis上查询是否有登陆信息,若是有,就能直接进行登陆以后的操做了,而不用进行重复登陆。 2、第二种方法是根据客户端的IP地址划分,每次都将同一个 IP 地址发送的请求都分发到同一个 Tomcat 服务器,那么也不会存在 session 共享的问题。
而 nginx 的基于 IP 路由负载的机制就是上诉第二种形式。大概配置以下:
upstream OrdinaryPolling { server 10.60.220.60:8081 weight=2; server 10.60.220.60:8082 weight=5; ip_hash; } server { listen 80; server_name test.fw.com; access_log /home/lich/logs/rproxy_slb.access.log; error_log /home/lich/logs/rproxy_slb.error.log; location / { proxy_pass http://OrdinaryPolling; # index index.html index.htm index.jsp; # deny ip # allow ip } }
注意:咱们在 upstream 指令块中增长了 ip_hash 指令。该指令就是告诉 nginx 服务器,同一个 IP 地址客户端发送的请求都将分发到同一个 Tomcat 服务器进行处理。
4 基于服务器响应时间负载均衡
根据服务器处理请求的时间来进行负载,处理请求越快,也就是响应时间越短的优先分配。
upstream OrdinaryPolling { server 10.60.220.60:8081 weight=2; server 10.60.220.60:8082 weight=5; fair; } server { listen 80; server_name test.fw.com; access_log /home/lich/logs/rproxy_slb.access.log; error_log /home/lich/logs/rproxy_slb.error.log; location / { proxy_pass http://OrdinaryPolling; # index index.html index.htm index.jsp; # deny ip # allow ip } }
5 对不一样域名实现负载均衡
待补充