Linux-Nginx

发布时间 2023-08-09 17:04:53作者: Boldcc
typora-copy-images-to: img

Nginx


  • 安装
  • AB复制

介绍

中文版文档: http://tengine.taobao.org/nginx_docs/cn/docs/     tengine
nginx.org
C10K

Nginx 的历史 
    Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的.Igor Sysoev在建立的项目时,使用基于BSD许可.自Nginx 发布以来,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名.在俄罗斯许多大网站都已经使用它, 且一直表现不凡.俄罗斯大约有20%左右的虚拟主机是由nignx服务或代理的.Google在线安全博客中统计Nginx服务或代理了大约所有Internet虚拟主机的4%.而Netcraft的统计显示,Nginx服务的主机在过去的一年里以四倍的速度增长并且在这几年里,它的排名还在不断上升

为什么要用Nginx
    Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 .它支持内核EPoll模型,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数.Nginx具有很高的稳定性,其它HTTP服务器当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应只能重启服务器.例如当前Apache一旦上到200个以上进程,web响应速度就明显非常缓慢了.而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低.Nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对Nginx来说基本上是毫无用处的.就稳定性而言,nginx比lighttpd更胜一筹.Nginx支持热部署,它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动.你还能够在不间断服务的情况下,对软件版本进行进行升级.Nginx采用master-slave模型,能够充分利用SMP的优势,且能够减少工作进程在磁盘I/O的阻塞延迟.
    Nginx代码质量非常高,代码很规范,手法成熟, 模块扩展也很容易.
    Nginx采用了一些os提供的最新特性如对sendfile (Linux2.2+),acceptfilter(FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,从而大大提高了性能.当然,nginx还很年轻,多多少少存在一些问题,比如:Nginx是俄罗斯人创建,目前文档方面还不是很完善.因为文档大多是俄语,所以文档方面这也是个障碍.尽管Nignx的模块比较多,但它们还不够完善.对脚本的支持力度不够.
    

获取Nginx
    Nginx的官方网站: http://nginx.org/en/download.html
Nginx官网提供了三个类型的版本
    Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版
    Stable version:最新稳定版,生产环境上建议使用的版本
    Legacy versions:老版本的稳定版

安装

Nginx安装:
1. 停止原有web服务器:
2. 添加普通用户账号来运行nginx:
    # useradd -M -s /sbin/nologin nginx
3.	解压并安装Nginx:
	# wget https://nginx.org/download/nginx-1.22.0.tar.gz
    # tar xf nginx-1.22.0.tar.gz
    # cd nginx-1.22.0
    # ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module  --with-http_ssl_module   --sbin-path=/usr/sbin/
    
若预编译出现报错,一般都是缺少一些软件包
        yum install gcc pcre-devel openssl-devel -y
   
   # make && make install
 ----------------------------------------------------------------------------------
    --prefix=/usr/local/nginx                 #指定安装路径
    --with-http_stub_status_module     #启用service status页,默认不启用
    --with-http_ssl_module                    #启用ssl模块,以支持https请求
    --sbin-path=/usr/sbin/                     #指定二进制命令的路径
       
     

    
4.	启动:
		# nginx 
--------------------------------------------------------
    nginx命令常用选项:
        -v      查看版本号
        -V      查看版本号及编译选项
        -s      给主进程发送信号.可接 stop 停止 | quit 退出 | reopen 重启| reload 重新加载配置    
        -t      测试配置是否正确
        -c      指定配置文件,默认为 conf/nginx.conf
5.	查看启动状态:
  # netstat -tanp|grep 80
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5535/nginx 

6.	测试主页是否可以访问
    

配置文件

nginx主配置文件主要有以下几大块
    1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
    2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。epoll
    3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
    4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
    5、location块:配置请求的路由,以及各种页面的处理情况。

[root@clone1 nginx]# vim /usr/local/nginx/conf/nginx.conf
    #user  nobody;                 #nginx用户及组,如果用户和组名一样可只写一个    
    worker_processes  1;       #定义了nginx对外提供web服务时的worker进程数。
                       #最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘 数量及负载模式。
          #不能确定的时候,将其设置为可用的CPU核心数将是一个好的开始(设置为“auto”将尝试自动检测它)
    #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;       #每个进程的最大连接数,根据需要调整大小
    }
    http {
        include       mime.types;             #文件扩展名与文件类型映射表
        default_type  application/octet-stream;
        server_tokens off;                       #隐藏软件版本号

        #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;                                                                       #定义日志文件
        sendfile        on;                          #开启高效文件传输模式
        #tcp_nopush     on;
    #keepalive_timeout  0;
        keepalive_timeout  65;              #连接超时时间
        #gzip  on;
        server {
            listen       80;
            server_name  localhost;
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
            location / {
                root   html;
                index  index.html index.htm;
          }
            #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;
            }
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    }


自定义日志

自己定义日志:在日志部分写入
    log_format cust '$remote_addr : $time_local : $http_user_agent';
    access_log logs/access.log cust;          #cust:自定义的日志名称
测试自定义日志: # curl 192.168.1.254
#cat access.log
访问的Ip:访问的时间:访问的客户端的类型


$remote_addr		              记录客户端的ip
$remote_user		              记录远程客户端的名字
$time_local		                  记录访问时间
$request		                  记录请求的URL
$status			                  记录请求状态
$body_bytes_sent	              记录发送给客户端的文件的内容的大小
$http_referer		              记录从哪个页面链接访问过来的
$http_user_agent	              记录客户端浏览器的信息
$http_x_forwarded_for	          记录客户端的ip

更多内嵌变量详见:
 http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#variables

访问控制/用户认证

访问控制:
有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问.
那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些不速之客.
我们在服务课程中学习过apache的访问控制,对于Nginx来说同样可以实现,并且整个过程和Apache 非常的相似.
用户认证:
    location / {
                root   html; 
                index  index.html index.htm;
                auth_basic "haha";           #服务器描述信息
                auth_basic_user_file  /usr/local/nginx/passwd.db;     #存放用户名和密码的文件
            }

    [root@web html]# htpasswd -c /usr/local/nginx/passwd.db user1
    New password: 
    Re-type new password: 
    Adding password for user user1

访问控制:      deny/allow顺序:从上到下
    location / {
                root   html;
                index  index.html index.htm;
                allow   192.168.10.0/24;           #单独允许192.168.10网段访问
                deny    all;
            }
            
apache:            
            order allow,deny
            allow from 192.168.10.0/24
            deny from all
 
限速:
使用limit_rate指令
Syntax:   limit_rate rate;
Default:  limit_rate 0;
Context: http, server, location, if in location

虚拟主机

1、配置子配置文件
# vim /usr/local/nginx/conf/nginx.conf
include /usr/local/nginx/conf.d/*.conf;            //在http {}   块里面添加

# mkdir /usr/local/nginx/conf.d/

虚拟主机类型
基于端口
基于域名
基于IP


案例:
1、编写基于域名的虚拟主机
当访问 www.baidu.com    ->   This is Baidu
      www.163.com      ->   This is 163
      www.qf.com	   ->   This is Qf

# vim conf.d/baidu.conf
server {
        listen  80;
        server_name     www.baidu.com;
        location / {
        root    html/baidu;
        index   index.html;
        }
}

# mkdir html/baidu

# vim html/baidu/index.html  //添加访问测试内容
This is Baidu

# nginx -s reload 

# vim /etc/hosts      //添加本地域名解析记录
10.3.148.201	www.baidu.com

2、编写基于端口的虚拟主机
当访问		10.3.148.201:81		->		This is port 81
		  10.3.148.201:82     ->      This is port 82
		  
# vim conf.d/81.conf
server {
        listen  81;
        server_name  localhost;
        location / {
        root    html/81;
        index   index.html;
        }
}

# mkdir html/81

# vim html/81/index.html  //添加访问测试内容
This is port 81

# nginx -s reload 

# netstat -tnlp    //查看81端口是否被监听

反向代理

nginx的反向代理与负载均衡*****

代理(Proxy)也称网络代理。它是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这
个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络
代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。代理通常分为正向代
理、反向代理及透明代理。

代理服务器的类型:
    1、正向代理服务器(标准代理服务器)
        目的:内网的服务器通过代理服务器,然后能够访问外网的服务器
        原理:内网用户将请求发给代理服务器,代理服务器根据用户需求,向真正的web服务器发出请求,然后获取到网页内容之后,在本地缓存然后发给用户。
        缺点:需要用户对浏览器进行设置
    2、透明代理服务器
        目的和原理与正向代理服务器一致,但一般布署在网关上,用户不需要再对浏览器进行设置
        需要结合iptables
    3、反向代理服务器(反向加速服务器)
        目的:外网客户端通过代理服务器,能够访问内网服务器的资源
        原理:外网客户端访问正常的域名或者IP,其实访问的是代理服务器,代理服务器帮助客户端请求页面,在代理服务器上缓存,然后再发送给客户端。

反向代理:
该功能由ngx_http_proxy_module模块提供
    location / {
            proxy_pass  http://www.jd.com;
    }
        
   验证:在浏览器上访问Nginx的IP地址会自动跳转jd首页

负载均衡

负载均衡:
该功能由ngx_http_upstream_module+ngx_http_proxy_module模块提供
调度算法:
轮循       静态
加权轮循    静态
least_conn: 根据其权重值,将请求发送到活跃连接数最少的那台服务器, 动态
ip_hash: 把同一客户端的请求调度到同一台真实服务器上.

1. 轮循 - 后端每台服务器的权重相同
    upstream  webs {       
        server 192.168.10.12;
        server 192.168.10.13;
    }
    server {
        ...
        location / {
            proxy_pass  http://webs;
        }
        ...
    }

2.加权轮循: 在每台服务器上加入权值,权值越高的服务器分配到的请求越多

     upstream  webs {
        server 192.168.10.12 weight=1;
        server 192.168.10.13 weight=2;
    }  
       
--------------------------------------------------------------------------------------------
[root@nginx conf]# vim /usr/local/lnmp/nginx/conf/nginx.conf
    
    upstream qfedu {
         server 192.168.10.11 weight=1 max_fails=2 fail_timeout=30s;
         server 192.168.10.12 weight=2;
         server 192.168.10.13 backup;            #backup:备份,其他服务器全部宕机后启用  
    }

-------------------------------------------------------------------------------------------
3. ip_hash: 让同一客户端在一定时间内访问到同一台服务器
   IPv4地址的前三个字节或者IPv6的整个地址,会被用来作为一个散列key。 这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器。
    upstream qfedu {
        ip_hash;
        server 172.16.0.10;
        server 172.16.5.100;
        server 172.16.16.100;
    }

客户端测试:
	同一客户端访问一直得到同一个页面.

LNMP架构 - 上线WordPress

1、安装php服务
# yum install php php-mysql php-fpm -y
# systemctl start php-fpm
# # netstat -tnlp | grep 9000
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      115012/php-fpm: master

2、编写lnmp架构的虚拟主机配置文件
# vim /usr/local/nginx/conf.d/lnmp.conf
server {
        listen  83;
        server_name     localhost;
        location / {
            root        html/wordpress;
            index       index.html index.php;
        }
        location ~ \.php$ {
            root           html/wordpress;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
}


3、下载WordPress源码包
# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
# tar xf latest-zh_CN.tar.gz            //解压出一个wordpres目录
# mv wordpress/* html/wordpress/
mv:是否覆盖"html/wordpress/index.php"? y             //因为上面写了测试页面index.php  按y确认覆盖

【注意:新版本的wordpres源码包需要php版本7.1以上,yum源自带版本是5.4.16】
解决方案:
1、更换php版本
# wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# wget --no-check-certificate  https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# rpm -Uvh epel-release-latest-7.noarch.rpm remi-release-7.rpm
【会增加很多php版本的yum源】
# rpm -qa | grep php | xargs -I {} rpm -e --nodeps {}        //卸载老版本
# yum install php73-php php73-php-mysql php73-php-fpm -y
# systemctl start php73-php-fpm

2、更换更老的wordpres源码包版本wordpress-4.5.3-zh_CN.tar.gz

3、准备数据库
# yum install mariadb-server -y
# systemctl start mariadb
# mysql -uroot
MariaDB [(none)]> create database wordpress;      //创建所需要的数据库
Query OK, 1 row affected (0.00 sec)

4、抱歉,我不能写入wp-config.php文件
# vim html/wordpress/wp-config.php    //添加页面上的内容

image-20220527165653558

首先,需要修改/etc/sysctl.conf来更改内核参
数。例如,最常用的配置:
fs.file-max=999999
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_keepalive_time=600
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_max_tw_buckets=5000
net.ipv4.ip_local_port_range=1024 61000
net.ipv4.tcp_rmem=4096 32768 262142
net.ipv4.tcp_wmem=4096 32768 262142
net.core.netdev_max_backlog=8096
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=2097152
net.core.wmem_max=2097152
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn.backlog=1024
然后执行sysctl-p命令,使上述修改生效。
上面的参数意义解释如下:
❑file-max:这个参数表示进程(比如一个
worker进程)可以同时打开的最大句柄数,这个参
数直接限制最大并发连接数,需根据实际情况配
置。
❑tcp_tw_reuse:这个参数设置为1,表示允许
将TIME-WAIT状态的socket重新用于新的TCP连
接,这对于服务器来说很有意义,因为服务器上总
会有大量TIME-WAIT状态的连接。
❑tcp_keepalive_time:这个参数表示当
keepalive启用时,TCP发送keepalive消息的频度。
默认是2小时,若将其设置得小一些,可以更快地
清理无效的连接。
❑tcp_fin_timeout:这个参数表示当服务器主
动关闭连接时,socket保持在FIN-WAIT-2状态的
最大时间。
❑tcp_max_tw_buckets:这个参数表示操作系
统允许TIME_WAIT套接字数量的最大值,如果超过
这个数字,TIME_WAIT套接字将立刻被清除并打印
警告信息。该参数默认为180 000,过多的
TIME_WAIT套接字会使Web服务器变慢。
❑tcp_max_syn_backlog:这个参数表示TCP
三次握手建立阶段接收SYN请求队列的最大长度,
默认为1024,将其设置得大一些可以使出现Nginx
繁忙来不及accept新连接的情况时,Linux不至于
丢失客户端发起的连接请求。
❑ip_local_port_range:这个参数定义了在
UDP和TCP连接中本地(不包括连接的远端)端口
的取值范围。
❑net.ipv4.tcp_rmem:这个参数定义了TCP接
收缓存(用于TCP接收滑动窗口)的最小值、默认
值、最大值。
❑net.ipv4.tcp_wmem:这个参数定义了TCP
发送缓存(用于TCP发送滑动窗口)的最小值、默
认值、最大值。
❑netdev_max_backlog:当网卡接收数据包的
速度大于内核处理的速度时,会有一个队列保存这
些数据包。这个参数表示该队列的最大值。
❑rmem_default:这个参数表示内核套接字接
收缓存区默认的大小。
❑wmem_default:这个参数表示内核套接字
发送缓存区默认的大小。
❑rmem_max:这个参数表示内核套接字接收
缓存区的最大大小。
❑wmem_max:这个参数表示内核套接字发送
缓存区的最大大小。
注意 滑动窗口的大小与套接字缓存区会在一
定程度上影响并发连接的数目。每个TCP连接都会
为维护TCP滑动窗口而消耗内存,这个窗口会根据
服务器的处理速度收缩或扩张。
参数wmem_max的设置,需要平衡物理内存的
总大小、Nginx并发处理的最大连接数量(由
nginx.conf中的worker_processes和
worker_connections参数决定)而确定。当然,
如果仅仅为了提高并发量使服务器不出现Out Of
Memory问题而去降低滑动窗口大小,那么并不合
适,因为滑动窗口过小会影响大数据量的传输速
度。rmem_default、wmem_default、
rmem_max、wmem_max这4个参数的设置需要
根据我们的业务特性以及实际的硬件成本来综合考
虑。
❑tcp_syncookies:该参数与性能无关,用于
解决TCP的SYN攻击。

Nginx实战

1、nginx简介

常用web服务器

1、Apache服务器
2、Lighttpd服务器
3、Tomcat服务器
4、IBM WebSphere服务器
5、Microsoft IIS

Nginx的发展


选择nginx的理由

1、支持高并发连接
2、内存消耗小
3、成本低廉
4、其它理由

Nginx与 Apache、Lighttpd的对比


2、Nginx的安装与配置

安装Nginx所需要的资源

需要一个Linux服务器,选择CentOS。
CentOS介绍:CentOS是基于RedHat Enterprise Linux源代码重新编译、去除RedHat商标的产物,各种操作、使用和RedHat没有区别。CentOS完全免费,修正了RedHat的很多Bug,但是CentOS不向用户提供技术支持,也不负任何商业责任。

安装编译Nginx需要第三方的工具:
# yum install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel -y
c、c++语言的编译器:gcc gcc-c++ 
创建makefile的工具:autoconf automake 
gzip模块的依赖库:zlib zlib-devel 
ssl功能的依赖库:openssl openssl-devel 
rewrite模块的依赖库:pcre pcre-devel

Nginx的下载

官网 https://www.nginx.org/
https://www.nginx.org/download

Nginx安装与使用

Nginx安装:
1. 停止原有web服务器:
2. 添加普通用户账号来运行nginx:
    # useradd -M -s /sbin/nologin nginx
3.	解压并安装Nginx:
	# wget https://nginx.org/download/nginx-1.22.0.tar.gz
    # tar xf nginx-1.22.0.tar.gz
    # cd nginx-1.22.0
    # ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module  --with-http_ssl_module   --sbin-path=/usr/sbin/
    
若预编译出现报错,一般都是缺少一些软件包
        yum install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel -y
   
   # make && make install
 ----------------------------------------------------------------------------------
    --prefix=/usr/local/nginx                 #指定安装路径
    --with-http_stub_status_module     #启用service status页,默认不启用
    --with-http_ssl_module                    #启用ssl模块,以支持https请求
    --sbin-path=/usr/sbin/                     #指定二进制命令的路径
4.	启动:
		# nginx 
--------------------------------------------------------
    nginx命令常用选项:
        -v      查看版本号
        -V      查看版本号及编译选项
        -s      给主进程发送信号.可接 stop 停止 | quit 退出 | reopen 重启| reload 重新加载配置    
        -t      测试配置是否正确
        -c      指定配置文件,默认为 conf/nginx.conf
5.	查看启动状态:
  # netstat -tanp|grep 80
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5535/nginx 

6.	测试主页是否可以访问

3、Nginx的基本配置和优化

Nginx配置示例

nginx主配置文件主要有以下几大块
    1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
    2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。epoll
    3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
    4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
    5、location块:配置请求的路由,以及各种页面的处理情况。

[root@clone1 nginx]# vim /usr/local/nginx/conf/nginx.conf
    #user  nobody;                 #nginx用户及组,如果用户和组名一样可只写一个    
    worker_processes  1;       #定义了nginx对外提供web服务时的worker进程数。
                       #最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘 数量及负载模式。
          #不能确定的时候,将其设置为可用的CPU核心数将是一个好的开始(设置为“auto”将尝试自动检测它)
    #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;       #每个进程的最大连接数,根据需要调整大小
    }
    http {
        include       mime.types;             #文件扩展名与文件类型映射表
        default_type  application/octet-stream;
        server_tokens off;                       #隐藏软件版本号

        #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;                                                                       #定义日志文件
        sendfile        on;                          #开启高效文件传输模式
        #tcp_nopush     on;
    #keepalive_timeout  0;
        keepalive_timeout  65;              #连接超时时间
        #gzip  on;
        server {
            listen       80;
            server_name  localhost;
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
            location / {
                root   html;
                index  index.html index.htm;
          }
            #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;
            }
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    }

虚拟主机

1、基于IP的虚拟主机
/sbin/ifconfig ens33:1 192.168.105.201 broadcast 192.168.105.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.105.201 dev ens33:1
/sbin/ifconfig ens33:2 192.168.105.202 broadcast 192.168.105.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.105.202 dev ens33:2
将其写入/etc/rc.local即可开机自启

image-20230727120005293

# 第一个虚拟主机
    server {
        # 监听的ip和端口
        listen       192.168.105.200:80;
        # 主机名称
        server_name  192.168.105.200;
        # 日志的存放路径
        access_log  logs/server1.access.log combined;
        location / {
            # 默认首页文件
            index  index.html index.htm;
            # 网页存放的目录
            root /data0/htdocs/server1;
            }
}
    # 第二个虚拟主机
    server {
        # 监听的ip和端口
        listen       192.168.105.201:80;
        # 主机名称
        server_name  192.168.105.201;
        # 日志的存放路径
        access_log  logs/server2.access.log combined;
        location / {
            # 默认首页文件
            index  index.html index.htm;
            # 网页存放的目录
            root /data0/htdocs/server2;
               }
}
    # 第三个虚拟主机
    server {
        # 监听的ip和端口
        listen       192.168.105.202:80;
        # 主机名称
        server_name  192.168.105.202;
        # 日志的存放路径
        access_log  logs/server3.access.log combined;
        location / {
            # 默认首页文件
            index  index.html index.htm;
            # 网页存放的目录
            root /data0/htdocs/server3;
               }
}

2、基于域名的虚拟主机
基于域名的虚拟主机是最常见的一种虚拟主机。只需配置你的 DNS 服务器,将每个主机名映射到正确的IP地址,然后配置Nginx服务器,令其识别不同的主机名就可以了。这种虚拟主机技术,使很多虚拟主机可以共享同一个P地址,有效解决了IP地址不足的问题。所以,如果没有特殊要求使你必须用一个基于IP的虚拟主机,最好还是使用基于域名的虚拟主机

    # 第一个虚拟主机
    server {
        # 监听的ip和端口
        listen       80;
        # 主机名称
        server_name  aaa.domain.com;
        # 日志的存放路径
        access_log  logs/aaa.domain.com.access.log combined;
        location / {
            # 默认首页文件
            index  index.html index.htm;
            # 网页存放的目录
            root /data0/htdocs/aaa.domain.com;
            }
}
    # 第二个虚拟主机
    server {
        # 监听的ip和端口
        listen       80;
        # 主机名称
        server_name  bbb.otherdomain.com;
        # 日志的存放路径
        access_log  logs/bbb.otherdomain.com.access.log combined;
        location / {
            # 默认首页文件
            index  index.html index.htm;
            # 网页存放的目录
            root /data0/htdocs/bbb.otherdomain.com;
               }
}
    # 第三个虚拟主机
    server {
        # 监听的ip和端口
        listen       80;
        # 主机名称
        server_name  www.domain.com domain.com *.domain.com;
        # 日志的存放路径
        access_log  logs/bbb.domain.com.access.log combined;
        location / {
            # 默认首页文件
            index  index.html index.htm;
            # 网页存放的目录
            root /data0/htdocs/domain.com;
               }
}	

日志

在nginx中与日志相关的有access_log(指定日志存放的位置、格式、缓存大小) log_format(日志的格式)两个
这两条指令可以在http{}模块下,也可以在server{}模块下。


1、用log_format指定格式
语法:log_formate name format [format ......]   name是唯一的,不能重复
注意:log_format有一个默认格式,相当于Apache的combined日志格式
log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$httpd_referer" "$http_user_agent"'
                    
如果将nginx作为web服务器,其进行反向代理后,web服务器就不能查看客户端的真实IP了,因此需要自定义一些日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
                          
    $remote_addr和$http_x_forwarded_for用于记录IP地址
    $remote_user用于记录远程客户端用户名称
    $time_local用于记录访问时间与时区
    $request 用于记录请求URL与HTTP协议
    $ status 用于记录请求状态
    $body_bytes_sent用于记录发送给客户端的文件主体内容大小
    $$http_referer用于记录是从哪个页面链接访问过来的
    $http_user_agent用于记录客户端浏览器的相关信息
2、access_log
语法:access_log 路径 log_format格式
access_log off;  关闭日志
access_log /data/logs/nginx.log; 默认日志
access_log /data/logs/nginx.log combined; 默认日志
access_log /data/logs/nginx.log main; 自定义日志
access_log /data/logs/nginx.log main buffer=32k; 自定义日志并设置内存缓冲区大小

注意:日志存放位置还可以用变量表示,如/data/logs/$server_name.log
假设server_name 指令设置的虚拟主机名称为test.domain.com,那么access_log 指令将把访问日志记录在/data/logs/test.domain.com.log 文件中。
(1)使用变量创建的文件位置,Nginx进程设置的用户和组必须有对该路径创建文件的权限。否则日志文件将不被创建。
(2)缓冲将不会被使用
(3)对于每一条日志记录,日志文件都将先打开文件,再写入日志记录,然后马上关闭。为了提高包含变量的日志文件存放路径的性能,须要使用open_log_file_cache指令设置经常被使用的日志文件描述符缓存。
open_log_file_cache指令主要用来设置含有变量的日志路径的文件描述符缓存,语法如下:
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] | off
该指令默认是禁止的,等同于 open_log_file_cache off

image-20230727153221713

日志文件的切割

生产环境中的服务器,由于访问日志文件增长速度非常快,日志太大会严重影响服务器效率。同时,为了方便对日志进行分析计算,须要对日志文件进行定时切割。定时切割的方式有按月切割、按天切割、按小时切割等。最常用的是按天切割。
# vim cut_nginx_log.sh
#!/bin/bash
#这个脚本在每天00:00执行

#nginx日志存放的路径
logs_path="/usr/local/nginx/logs"
nginx_logs_path="/usr/local/nginx/logs/nginx"

mkdir -p $nginx_logs_path/`date | cut -d" " -f6`/`date | cut -d" " -f2`/
mv $logs_path/access.log $nginx_logs_path/`date | cut -d" " -f6`/`date | cut -d" " -f2`/`date | cut -d" " -f3`.log
nginx -s reopen

# crontab -e
00 00 * * * /bin/bash /usr/local/nginx/sbin/cut_nginx_log.sh

这个shell脚本和crontab配置主要实现的功能为:假设今天的日期为2023年5月19日,Nginx当前的日志文件为/usr/local/nginx/logs/access.log,2023年5月20日00:00会执行cut_nginx_log.sh脚本,cut_nginx_log.sh脚本首先创建一个目录/usr/local/nginx/logs/nginx/2023/05,然后将/usr/local/nginx/logs/access.log 文件移动并重命名为/usr/local/nginx/logs/nginx/2009/05/19.log,再重启Nginx主进程号告诉Nginx重新生成一个/usr/local/nginx/logs/access.log 文件,2009年5月20日的日志记录在这个新生成的日志文件中。而/usr/local/nginx/logs/nginx/2023/05/19.log 文件,就是2023年5月19日的日志文件。

压缩输出配置----gzip

目前,90%的浏览器都支持gzip和deflate两种压缩格式。如果浏览器支持gzip 压缩,就会在HTTP请求头中发送一行
“Accept-Encoding: gzip, deflate”,这时候Nginx服务器可以输出经过gzip压缩后的页面给浏览器,浏览器再解压。这种方式可以将网络线路上传输的大量数据消减60%以上,不仅节省了服务器带宽,同时加速了用户的下载速度和体验。

1、gzip指令
语法:gzip on|off
默认值:off
该指令用于开启或关闭gzip模块
2、gzip_buffers指令
语法:gzip_buffers number size
默认值:gzip_buffers 4 4K/8K
设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流.例如4 4k代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存.48k代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存.
如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
3、gzip_comp_level指令
语法:gzip_comp_level 1..9
默认值:zip_comp_level 1
压缩比越大,传输速度越快,消耗的cpu资源越高
4、gzip_min_length指令
语法:gzip_min_length length
默认值:gzip_min_length 0
建议设置为1k 即gzip_min_length 1024
5、gzip_http_version指令
语法:gzip_http_version 1.0|1.1
默认值:gzip_http_version 1.1
21世纪绝大多数的浏览器支持gzip,选择默认即可。
6、gzip_proxied指令
语法:gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any]
默认值:gzip_proxied off
nginxz作为反向代理的时候开启,开启或关闭后端服务器返回的结果。匹配的前提是后端服务器必须要返回包含“Via”的header头。
off———关闭所有的代理结果数据的压缩。
expired——启用压缩,如果header头中包含“Expires”头信息。
no-cache——启用压缩,如果 header头中包含“Cache-Control:no-cache”头信息。
no-store—一启用压缩,如果header头中包含“Cache-Control:no-store”头信息。
private-----启用压缩,如果 header头中包含“Cache-Control:private”头信息。
no_last_modified———启用压缩,如果header头中不包含“Last-Modified”头信息。
no_etag———启用压缩,如果header头中不包含“ETag”头信息。
auth-—启用压缩,如果header头中包含“Authorization”头信息。
any—无条件启用压缩。
7、gzip_types指令
语法:gzip_types mime-type [mime-type...]
默认值:gzip_types text/html
匹配mime类型进行压缩,(无论是否指定)“text/html”类型总是会被压缩的。
注意:如果作为http server来使用,主配置文件中要包含文件类型配置文件。
http
{
   include conf/mime.types;
   ......
}
例子:压缩常规文件
http
{
   include conf/mime.types;
   
   gzip on;
   gzip_min_length 1024;
   gzip_buffers 4 8k;
   gzip_http_version 1.1;
   gzip_types text/plain application/x-javascript text/css text/html application/xml;
   
}

nginx的自动列目录

实现类似页面

image-20230727174836530

前提条件:不能有index指令设置的默认首页文件
location
{
  autoindex on;
}
还有两个与自动列目录相关的指令:
autoindex_exact_size [on|off]  设定索引时文件大小的单位(B、KB、MB、GB)
autoindex_localtime  [on|off]  开启以本地时间来显示文件时间的功能。默认是关

浏览器本地缓存设置

expires指令
语法:expires [time|epoch|max|off]
默认值:expires off
例:对常见格式的图片、Flash文件在浏览器本地缓存30天,对js、css 文件在浏览器本地缓存1小时,如代码3-10所示。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
  expires 30d;
}

location ~ .*\.(js|css)$
{
  expires 1h;
}

4、Nginx与PHP(FastCGI)的安装、配置与优化

CGI和FastCGI介绍

image-20230731101346742

1、nginx作为web服务器,并不能直接处理静态、动态请求。
2、cgi解释器,由于每次处理请求后,其都会关闭,导致速度极慢,因此出现了FastCGI
3、FastCGI读取php.ini,启动多个CGI(保存在内存中),等待客户端的请求,并分配CGI

Nginx+FastCGI工作原理

image-20230731102744729

所有的外部程序都要通过FastCGI来调用,其在Linux下是socket,(这个socket可以是文件socket,可以是ip socket).为了调用CGI,还需要warpper(启动一个程序的程序)。当请求发送到nginx时,socket接受后,通过FastCGI接口让wrapper启动CGI,然后调用application.

spawn-fcgi与php-fpm

这两个就是支持php的FastCGI进程管理器
spawn-fcgi是httpd服务器lighttpd的一部分,目前已经独立为一个项目,一般与lighttpd配合使用来支持php.但是由于lighttpd的spawn-fcgi在高并发访问时,会出现内存泄漏甚至重启FastCGI的问题。因此我们不选择它。
php-fpm是作为php的一个补丁来开发的,在安装时需要和php源码一起编译(它被编译到php的内核中),因此在性能方面高于spawn-fcgi,因此我们选择nginx+php-fpm.

nginx主要功能:处理静态请求、转发动态请求
php/php-fpm主要功能:解析php动态请求
因此我们通常选择将它们部署在不同的服务器上。

php与php-fpm的安装与优化

1、下载安装包
www.php.net                              php-5.2.13.tar.gz
http://php-fpm.org/downloads/            php-5.2.13-fpm-0.5.13.diff.gz
2、配置安装环境
# yum install gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel  zlib zlib-devel glibc glibc-devel glib2 glib2-devel gzip patch -y

3、编译安装PHP和PHP-FPM
解压php并将php-fpm加入
# tar zxvf php-5.2.13.tar.gz
# gzip -cd php-5.2.13-fpm-0.5.13.diff.gz | patch -d php-5.2.13 -p1

解决问题
# curl -o php-5.2.13.patch https://mail.gnome.org/archives/xml/2012-August/txtbgxGXAvz4N.txt
# cd php-5.2.13
# patch -p0 -b < ../php-5.2.13.patch
patching file ext/dom/node.c
Hunk #1 succeeded at 1950 (offset 55 lines).
patching file ext/dom/documenttype.c
Hunk #1 succeeded at 215 (offset 10 lines).
patching file ext/simplexml/simplexml.c
Hunk #1 succeeded at 1340 (offset -77 lines).

编译安装
# ./configure  --prefix=/usr/local/src/php --enable-fastcgi --enable-fpm
# make && make install
# cp php.ini-dist /usr/local/src/php/lib/php.ini
--enable-fastcgi”是启用对PHP的FastCGI支持,“--enable-fpm”是激活对FastCGI模式的fpm支持

4.配置与优化PHP-FPM
php全局配置文件:/usr/local/src/php/lib/php.ini
php-fpm引擎的配置文件: /usr/local/src/php/etc/php-fpm.conf

标签listen_address是配置fastcgi进程监听的IP地址以及端口,默认是127.0.0.1:9000。
<value name="listen_address">127.0.0.1:9000</value>

标签display_errors用来设置是否显示PHP错误信息,默认是0,不显示错误信息,设置为1可以显示PHP错误信息。
<value name="display_errors">0</value>

标签user和group用于设置运行FastCGI进程的用户和用户组。需要注意的是,这里指定的用户和用户组要和Nginx配置文件中指定的用户和用户组一致。
<value name="user">nobody</value> 
<value name="group">nobody</value> 

标签max_children用于设置FastCGI的进程数。根据官方建议,小于2GB内存的服务器,可以只开启64个进程,4GB以上内存的服务器可以开启200个进程。
<value name="max_children">5</value>

标签request_terminate_timeout用于设置FastCGI执行脚本的时间。默认是0s,也就是无限执行下去,可以根据情况对其进行修改。
<value name="request_terminate_timeout">0s</value>

标签rlimit_files用于设置PHP-FPM对打开文件描述符的限制,默认值为1024。这个标签的值必须和Linux内核打开文件数关联起来,例如要将此值设置为65535,就必须在Linux命令行执行'ulimit -HSn 65536'。
<value name="rlimit_files">1024</value>

标签max_requests指明了每个children最多处理多少个请求后便会被关闭,默认的设置是500。
<value name="max_requests">500</value>

标签allowed_clients用于设置允许访问FastCGI进程解析器的IP地址。如果不在这里指定IP地址,Nginx转发过来的PHP解析请求将无法被接受。
<value name="allowed_clients">127.0.0.1</value>
  

index.php
  server {  
 include port.conf;  
 server_name www.ixdba.net ixdba.net;  
 
  location / {  
 index index.html index.php;  
 root /web/www/www.ixdba.net;  
 }  
 
 location ~ \.php$ {  
            root           html;  
            fastcgi_pass   127.0.0.1:9000;  
            fastcgi_index  index.php;  
            fastcgi_param  SCRIPT_FILENAME  html$fastcgi_script_name;  
            include        fastcgi_params;  
        }  
}  

5、Nginx与JSP、ASP.NET、Perl的安装与配置

本章介绍nginx+jsp(tomcat)
nginx+asp.net(Mono+FastCGI)
nginx+Perl(FAstCGI)

nginx+jsp(tomcat)

nginx+asp.net(Mono+FastCGI)

nginx+Perl(FAstCGI)

6、Nginx HTTP 负载均衡和反向代理的配置与优化

负载均衡与反向代理

随着网站访问量的快速增长,单台服务器已经无法承担大量用户的并发访问,必须采用多台服务器协同工作,以提高计算机系统的处理能力和计算强度,满足当前业务量的需求。而如何在完成同样功能的多个网络设备之间实现合理的业务量分配,使之不会出现一台设备过忙、而其他的设备却没有充分使用的情况。要解决这一问题,可以采用负载均衡的方法

负载均衡
负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。均衡负载能够平均分配客户请求到服务器阵列,藉此快速获取重要数据,解决大量并发访问服务问题。这种群集技术可以用最少的投资获得接近于大型主机的性能
image-20230731164147420
反向代理
反向代理(Reverse Proxy)是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。由于外部网络上的主机并不会配置并使用这个代理服务器,普通代理服务器也被设计为在Internet上搜寻多个不确定的服务器,而不是针对Internet上多个客户机的请求访问某一个固定的服务器,因此普通的Web代理服务器不支持外部对内部网络的访问请求。当一个代理服务器能够代理外部网络上的主机访问内部网络时,这种代理服务的方式称为反向代理服务。此时代理服务器对外就表现为一个Web服务器,外部网络就可以简单把它当作一个标准的Web服务器而不需要特定的配置。不同之处在于,这个服务器没有保存任何网页的真实数据,所有的静态网页或CGI程序,都保存在内部的Web服务器上。因此对反向代理服务器的攻击并不会使网页信息遭到破坏,这样就增强了Web服务器的安全性。

常见负载均衡方法

1、用户手动选择

image-20230731164643610

2、DNS轮询		
在域名解析中添加A记录即可
优点:成本低廉
缺点:
可靠性低
当一台服务器发生故障时,所有访问该服务器的请求不会被响应。同时各地宽带、路由器等许多NDS都有缓存,导致一段时间不能访问故障服务器。
负载分配不均衡
由于轮询算法太过简单,不能为性能较好的分配更多请求,造成资源浪费。由于DNS缓存的存在,一段时间只会访问同一机器。
4、四/七层负载均衡设备
四层:lvs
七层:nginx
tcp/ip七层网络模型

常见四/七层负载均衡交换机:F5 BIG-IP、Citrix、NetScaler、Radware、Cisco CSS、Foundry
F5 BIG-IP使用较多。

如下图是 F5 BIG-IP实现动、静态网页分离的负载均衡架构图

image-20230801094307193

(1)如图,假设域名blog.s135.com 被解析到F5的外网/公网虚拟IP:61.1.1.3 (vs_squid),该虚拟IP下有一个服务器池(pool_squid),该服务器池下包含两台真实的 Squid服务器( 192.168.1.11和192.168.1.12)
(2)如果Squid缓存未命中,则会请求F5的内网虚拟IP: 192.168.1.3 (vs_apache),该虚拟IP下有一个默认服务器池(pool_apache_default),该服务器池下包含两台真实的Apache服务器(192.168.1.21和192.168.1.22),当该虚拟IP匹配 iRules规则时,则会访问另外一个服务器池( pool_apache_irules),该服务器池下同样包含两台真实的 Apache 服务器(192.168.1.23和192.168.1.24)XXXXXX
(3)另外,所有真实服务器的默认网关指向F5的自身内网IP,即192.168.1.2
(4)所有的真实服务器通过SNATIP地址61.1.1.4访问互联网

实际案例

image-20230731175911228

image-20230731175936361

image-20230731175949906

image-20230731180037337

Nginx负载均衡与反向代理实现动、静态网页分离

动、静态网页分离,就是让动态PHP等程序网页去访问PHP Web服务器,让缓存页、图片、JavaScript、Css、Flash去访问Squid等缓存服务器

Nginx负载均衡的HTTP Upstream模块

Upstream模块是Nginx负载均衡的主要模块,它提供了一个简单方法来实现在轮询和客户端IP之间的后端服务器负载均衡,并可以对后端服务器进行健康检查。
upstream backend{
server backend1.example.com weight=5;
server baskend2.example.com:8080;
server unix:/tmp/backend3;
}
server{
location /{
proxy_pass http://backend;
    }
}

ip_hash指令