记录Nginx安装,负载均衡,反向代理,虚拟主机

nginx的由来

俄罗斯的工程师 Igor Sysoev,他在为 Rambler Media 工作期间,使用 C 语言开发了 Nginx。Nginx 作为 Web 服务器一直为 Rambler Media 提供出色而又稳定的服务。然后呢,Igor Sysoev 将 Nginx 代码开源,并且赋予自由软件许可证。

Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器。

Nginx 的优势
  • 轻量级:安装文件小,运行时 CPU 内存使用率低;
  • 性能强:支持多核,处理静态文件效率高,内核采用的 poll 模型最大可以支持 50K 并发连接;
  • 支持热部署,同时启动速度快,可以在不间断服务的情况下对软件和配置进行升级;
  • 负载均衡,支持容错和健康检查;
  • 代理功能强大,支持无缓存的反向代理,同时支持 IMAP/POP3/SMTP 的代理。

Nginx 的劣势

  • 相比 Apache 模块要少一些,常用模块都有,支持 LUA 语言扩展功能
  • 对动态请求支持不如 Apache
  • Windows 版本功能有限,受限于 Windows 的特性,支持最好的还是 Unix/Linux 系统
 ------------------------------------------------------------------------

当 web 应用发展到一定程度时,单台服务器不足以支撑业务的正常运行,为增大吞吐量往往会使用多台服务器一起提供服务,如何充分利用多台服务器的资源,就需要一个‘调度员’,这个调度员要求能高效的接收并分发请求,知道后端的服务器健康状态,要能方便的扩展和移除,这就是 Nginx 又一常见应用架构,此架构充分利用了 Nginx 的反向代理和负载均衡的优势,Nginx 本身不提供 web 服务,而是在前端接受 Web 请求并分发到后端服务器处理,后端服务器可以是 Apache、Tomcat、IIS 等。

代理:

正向代理

反向代理

区别:正向代理代理的时客户端Client,反向代理是代理的服务端Server

有个不错的图片来自知乎

 

 

反向代理:

反向代理犹如你访问baidu.com,我查询的答案后端可能是成千上万的服务器,但具体的是哪台,我不知道,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。

负载均衡解释:

Nginx 反向代理服务器接收到的请求数量,就是我们说的负载量。请求数量按照一定的规则进行分发,到不同的服务器处理的规则,就是一种均衡规则。

-------------------------

安装

1.环境:Linux,centos7.6
2.安装依赖:
yum install gcc gcc-c++ zlib openssl openssl-devel automake pcre pcre-devel make
3.解压,编译,安装:
进入解压后的目录
./configure  --prefix=/usr/local/nginx --with-http_ssl_module
make && makeinstall
nginx
缓存proxy_cache
访问的内容在一段时间内不会发生变化,为了减轻上游服务器的压力,可用nginx把上游服务返回的内容缓存一段时间,比如1d,
  • proxy_cache_path 设置缓存文件写在那个目录,命名方式等
先在include下设置proxy_cache_path,再在需要做缓存的url路径下(localtion)填写相关信息
nginx配置文件语法高亮
源码安装的目录/usr/local/src/nginx-1.16.1/contrib/vim/
[root@king vim]# ls
ftdetect ftplugin indent syntax
[root@oradb vim]# cp -r ./* /usr/share/vim/vimfiles/
这时可以进入配置文件  就会有语法显示
将这四个文件复制到/usr/share/vim/vim74/,打开nginx.conf 就看见语法高亮
nginx负载均衡

示例:

http {
    include       mime.types;
    default_type  application/octet-stream;
    upstream webhost {          #可以在此位置引用upstream,并指定调度算法
        server 172.16.0.129 ;
        server 172.16.0.130 ;
        }
...
...
  server {
...
... location
/ {
#在location中填写格式如此的proxy_pass
proxy_pass http://webhost;
index index.html index.htm; }

 ////————||||————\\\\\

=======================================================
upstream模块在include下面,不然配置文件报错
http
{
##upstream的负载均衡,五种调度算法##
#调度算法1:轮询.每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响
upstream webhost {
server 192.168.0.5:6666 ;
server 192.168.0.7:6666 ;
}
#调度算法2:weight(权重).可以根据机器配置定义权重.权重越高被分配到的几率越大
upstream webhost {
server 192.168.0.5:6666 weight=2;
server 192.168.0.7:6666 weight=3;
}
#调度算法3:ip_hash. 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题
upstream webhost {
ip_hash;
server 192.168.0.5:6666 ;
server 192.168.0.7:6666 ;
}
#调度算法4:url_hash(需安装第三方插件).此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率.Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包
upstream webhost {
server 192.168.0.5:6666 ;
server 192.168.0.7:6666 ;
hash $request_uri;
}
#调度算法5:fair(需安装第三方插件).这是比上面两个更加智能的负载均衡算法.此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配.Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块
#
#虚拟主机的配置(采用调度算法3:ip_hash)
server
{
listen 80;
server_name mongo.demo.com;
#对 "/" 启用反向代理
location / {
proxy_pass http://webhost;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
===================================================================

浏览目录基本配置   autoindex

location /zip
{
    root /home/map/www/; #指定目录所在路径
    autoindex on; #开启目录浏览
    autoindex_format html; #以html风格将目录展示在浏览器中
    autoindex_exact_size off; #切换为 off 后,以可读的方式显示文件大小,单位为 KB、MB 或者 GB
    autoindex_localtime on; #以服务器的文件时间作为显示的时间
charset utf-8,gbk; #展示中文文件名
}
--------------------------------
对于路径
location /down {
        root /soft/package/src/
        ...
}
真实路径 /soft/package/src/down
----------------------------------------
location / {
        root /soft/package/src/
        ...
}
真实路径 /soft/package/src/

---------------------------------------

连接频率限制 limit_conn_module
请求频率限制 limit_req_module

如何使用:
添加在配置文件全局段,http之下,server之前

可添加如下代码,

limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s; #http段配置请求限制, rate限制速率,限制⼀秒钟最多⼀一个IP请求

在需要使用的location段可以添加zone,

 添加

limit_req zone=req_zone;  
压力测试
下载http-tolls
yum install -y httpd-tools

bing按照如下执行

]# ab -n 50 -c 20 http://127.0.0.1/access  #访问的目录或文件随location变化

查看下错误日志,

2020/05/20 14:45:14 [error] 36307#0: *505 limiting requests, excess: 0.994 by zone "reqver: localhost, request: "GET /access HTTP/1.0", host: "127.0.0.1"

虚拟机只能实现请求的限制,并发检测需使用公有云,,应该,,,,,

------------------------------------------

IP访问限制

deny

allow

#配置拒绝某⼀一个IP, 其他全部允许
location / {
root html;
index index.html;
deny 192.168.56.1;
allow all;
}
#只允许某⼀一个⽹网段访问,其它全部拒绝
location / {
root html;
index index.php index.html index.htm;
allow 192.168.56.0/24;
deny all;
}

 

-------------------------------
用户登录认证
依赖文件方式
~]# yum install httpd-tools
~]# htpasswd -c /usr/local/nginx/auth_conf zhiqiang  #将用户名密码写入指定目录的文件可在http,server,location下添加如下信息

auth_basic
"Auth access Blog Input your Passwd!"; auth_basic_user_file /usr/local/nginx/auth_conf; 
再次登录location会提示输入用户名密码
-----------------------------------
虚拟主机
实验:
)环境 www.baidu.com /web/www/baidu www.sina.com /web/www/sina
修改配置文件

服务端操作:

添加include在nginx.conf

include /usr/local/nginx/conf/conf.d/*.conf;

创建conf/conf.d目录,并编写baidu.conf sina.conf

#baidu.conf

server {
listen 172.16.0.194:80;
server_name www.baidu.com baidu.com;
location / {
root /web/www/baidu;
index index.html;
}
}

#sina.conf

server {
listen 172.16.0.194:80;
server_name www.sina.com sina.com;
location / {
root /web/www/sina;
index index.html;
}
}

#创建未补充的/web/www/baidu;sina目录,并写入index.html

mkdir -p /web/www/{baidu,sina}

cd /web/www/baidu;echo baidu>index.html

cd /web/www/sina;echo sina>index.html

客户端操作:

1.修改hosts文件

[root@master conf]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
#添加
172.16.0.130 www.baidu.com  //服务端IP
172.16.0.130 www.sina.com

2.下载工具

]# yum install elinks -y

3.请求

 

 

 -------------------------------

		3)创建网页的根目录及首页文件
			[root@node1 conf.d]# mkdir -p /web/www/{baidu,sina,default}
			[root@node1 conf.d]# cd /web/www/baidu/
			[root@node1 baidu]# echo baidu > index.html
			[root@node1 baidu]# echo sina > ../sina/index.html
			[root@node1 baidu]# echo default > ../default/index.html
		4)检查语法
			[root@node1 baidu]# nginx -t
		5)重新加载
			[root@node1 baidu]# nginx -s reload			
		6)客户端测试    —— 172.16.0.169
			[root@node2 ~]# vim /etc/hosts
					127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
					::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
					172.16.0.168 www.baidu.com
					172.16.0.168 www.sina.com 
			[root@node2 ~]# yum install elinks -y
			[root@node2 ~]# elinks --dump www.baidu.com
			   baidu
			[root@node2 ~]# elinks --dump www.sina.com
			   sina
种 WEB 服务器的比较
server  Apache  Nginx       Lighttpd 
Proxy 代理  非常好  非常好  一般 
Rewriter  好  非常好  一般 
Fcgi  不好  好  非常好 
热部署  不支持  支持  不支持 
系统压力比较  很大  很小  比较小 
稳定性  好  非常好  不好 
安全性  好  一般  一般 
技术支持  非常好  很少  一般 
静态文件处理  一般  非常好  好 
Vhosts 虚拟主机  支持  不支持  支持 
反向代理  一般  非常好  一般 
Session sticky  支持  不支持  不支持 
nginx特点:
1)快,在正常情况下,单机请求会得到更快的响应,在高峰期(如有数以万计的并发请求),Nginx可以比其他Web服务器更快地响应请求。
 
2)高扩展性。
 
3)高可靠性。高可靠性是我们选择Nginx的最基本条件,因为Nginx的可靠性是大家有目共睹的,很多家高流量网站都在核心服务器上大规模使用Nginx。Nginx的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性;另外,官方提供的常用模块都非常稳定,每个worker进程相对独立,master进程在1个worker进程出错时可以快速“拉起”新的worker子进程提供服务。
 
4)低内存消耗。一般情况下,10000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础。
 
5)单机支持10万以上并发。这是一个非常重要的特性!随着互联网的迅猛发展和互联网用户数量的成倍增长,各大公司、网站都需要应付海量并发请求,一个能够在峰值期顶住10万以上并发请求的Server,无疑会得到大家的青睐。理论上,Nginx支持的并发连接上限取决于内存,10万远未封顶。当然,能够及时地处理更多的并发请求,是与业务特点紧密相关的,本书第8~11章将会详细说明如何实现这个特点。
 
6)热部署。master管理进程与worker工作进程的分离设计,使得Nginx能够提供热部署功能,即可以在24小时不间断服务的前提下,升级Nginx的可执行文件。当然,它也支持不停止服务就更新配置项、更换日志文件等功能。
---------------------------------------------
日志切割
nginx -s reopen 之前先备份日志
mv access.log access.log.$(date "+%Y-%m-%d-%H-%M-%S")
nginx -s reopen
就会出现新的access.log
--------------------------------------------
平滑升级
nginx进程
  • worker进程的数量与服务器上的CPU核心数相等
  • master进程负责管理work进程
  • Nginx是支持单进程(master进程)提供服务的
多个worker进程处理互联网请求不但可以提高服务的健壮性(一个worker进程出错后,其他worker进程仍然可以正常提供服务),最重要的是,这样可以充分利用现在常见的SMP多核架构,从而实现微观上真正的多核并发处理。因此,用一个进程(master进程)来处理互联网请求肯定是不合适的。另外,为什么要把worker进程数量设置得与CPU核心数量一致呢?这正是Nginx与Apache服务器的不同之处。在Apache上每个进程在一个时刻只处理 一个请求,因此,如果希望Web服务器拥有并发处理的请求数更多,就要把Apache的进程或线程数设置得更多,通常会达到一台服务器拥有几百个工作进程,这样大量的进程间切换将带来无谓的系统资源消耗。而Nginx则不然,一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入睡眠状态,因此,当Nginx上的进程数与CPU核心数相等时(最好每一个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的。
-------------------------------
keepalived
 
#!/bin/bash A='ps -C nginx -no-header |wc -l' if [ $A -eq 0]; then systemctl restart nginx sleep 2 if ['ps -C nginx --no-header | wc -l' -eq 0 ];then killall keepalived
master
 
#全局配置
global_defs {
   notification_email {   #指定keepalived在发生切换时需要发送email到的对象,一行一个
}
  notification_email_from Alexandre.Cassen@firewall.loc   #指定发件人
smtp_server 192.168.124.23  #指定smtp服务器地址
smtp_connect_timeout 30    #指定smtp连接超时时间
router_id LVS_DEVEL #运行keepalived机器的一个标识
 
}
vrrp_instance VI_1 {
state MASTER     #指定A节点为主节点 备分机上设置为BACKUP即可
interface enp0s3   #设置实例绑定的网卡
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组(
同一实例下virtual_router_id必须相同)
priority 100     #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1      #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证信息,两个节点必须一致
auth_type PASS  #主从服务器验证方式
auth_pass 1111
}
virtual_ipaddress { #指定虚拟IP, 两个节点设置必须一样
192.168.124.111/24 #如果两个nginx的ip分别是192.168.232.201,,...205,则此处的虚拟i
p跟它俩同一个网段即可,24子网掩码(255.255.255.0),可以多个虚拟IP,换行即可
}
}
 
 
backup
 
global_defs {
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.124.111/24
}
}
 
 
 
posted @ 2020-03-06 14:49  5444de  阅读(139)  评论(0编辑  收藏  举报