高性能代理服务器-nginx

nginx简介

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

nginx优势

  1. Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。还能可以用不间断服务的情况下进行软件版本的升级,因为它的重启都在毫秒级内。
  2. Nginx 是一款面向性能设计的 HTTP 服务器,相较于 Apache、lighttpd 具有占有内存少,稳定性高等优势
  3. 整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活
  4. 在 Linux 操作系统下,nginx 使用 epoll 事件模型,得益于此,nginx 在 Linux 操作系统下效率相当高。
  5. 能够支持高达 50,000 个并发连接数的响应

centos 环境安装nginx

  1. 源码安装
    下载链接:http://nginx.org/download/nginx-1.16.1.tar.gz

    1. 编译环境准备
      yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
    2. 解压缩
      tar -zxvf nginx-1.16.1.tar.gz && cd nginx-1.16.1
    3. 预编译及安装
      ./configure --prefix=指定安装目录 (增加https模块–with-http_stub_status_module --with-http_ssl_module)
      make && make install
    4. 启动nginx
      进入指定安装目录,执行./bin/nginx (-c 指定配置文件)
  2. rpm包安装
    下载链接:http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.16.1-1.el7.ngx.x86_64.rpm

    1. 安装rpm包
      rpm -ivh ./nginx-1.16.1-1.el7.ngx.x86_64.rpm
    2. 启动nginx
      service nginx start

rpm包体积较小,安装非常简单,属于最小化安装,如果需要增加其他的模块,还是需要下载源码编译安装,所以一般不建议使用

nginx常用命令

./sbin/nginx:启动nginx
./sbin/nginx -s stop:停止nginx
./sbin/nginx -s restart:重启nginx
./sbin/nginx -c:指定配置文件启动
./sbin/nginx -t:测试配置文件是否正常

nginx配置文件详解

以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业务。

  1. worker进程
    worker_processes
    该参数表示启动几个工作进程,建议和本机CPU核数保持一致,每一核CPU处理一个进程。

    worker_rlimit_nofile
    它表示Nginx最大可用的文件描述符个数,需要配合系统的最大描述符,建议设置为102400。
    还需要在系统里执行ulimit -n 102400才可以。
    也可以直接修改配置文件/etc/security/limits.conf修改
    增加:
    soft nofile 655350
    hard nofile 655350

    worker_connections
    该参数用来配置每个Nginx worker进程最大处理的连接数,这个参数也决定了该Nginx服务器最多能处理多少客户端请求
    (worker_processes * worker_connections),建议把该参数设置为10240,不建议太大。

  2. http和tcp连接
    use epoll
    使用epoll模式的事件驱动模型,该模型为Linux系统下最优方式。

    multi_accept on
    使每个worker进程可以同时处理多个客户端请求。

    sendfile on
    使用内核的FD文件传输功能,可以减少user mode和kernel mode的切换,从而提升服务器性能。

    tcp_nopush on
    当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输。
    使用该方法会产生这样的效果:当应用程序产生数据时,内核不会立马封装包,而是当数据量积累到一定量时才会封装,然后传输。

    tcp_nodelay on
    不缓存data-sends(关闭 Nagle 算法),这个能够提高高频发送小数据报文的实时性。
    (关于Nagle算法)
    【假如需要频繁的发送一些小包数据,比如说1个字节,以IPv4为例的话,则每个包都要附带40字节的头,
    也就是说,总计41个字节的数据里,其中只有1个字节是我们需要的数据。
    为了解决这个问题,出现了Nagle算法。
    它规定:如果包的大小满足MSS,那么可以立即发送,否则数据会被放到缓冲区,等到已经发送的包被确认了之后才能继续发送。
    通过这样的规定,可以降低网络里小包的数量,从而提升网络性能。】

    keepalive_timeout
    定义长连接的超时时间,建议30s,太短或者太长都不一定合适,当然,最好是根据业务自身的情况来动态地调整该参数。

    keepalive_requests
    定义当客户端和服务端处于长连接的情况下,每个客户端最多可以请求多少次,可以设置很大,比如50000.

    reset_timeout_connection on
    设置为on的话,当客户端不再向服务端发送请求时,允许服务端关闭该连接。

    client_body_timeout
    客户端如果在该指定时间内没有加载完body数据,则断开连接,单位是秒,默认60,可以设置为10。

    send_timeout
    这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包。
    如果某个连接超过send_timeout定义的超时时间,那么Nginx将会关闭这个连接。单位是秒,可以设置为3。

    buffer和cache(以下配置都是针对单个请求)

    client_body_buffer_size
    当客户端以POST方法提交一些数据到服务端时,会先写入到client_body_buffer中,如果buffer写满会写到临时文件里,建议调整为128k。

    client_max_body_size
    浏览器在发送含有较大HTTP body的请求时,其头部会有一个Content-Length字段,

    client_max_body_size是用来限制Content-Length所示值的大小的。
    这个限制body的配置不用等Nginx接收完所有的HTTP包体,就可以告诉用户请求过大不被接受。会返回413状态码。
    例如,用户试图上传一个1GB的文件,Nginx在收完包头后,发现Content-Length超过

    client_max_body_size定义的值,
    就直接发送413(Request Entity Too Large)响应给客户端。
    将该数值设置为0,则禁用限制,建议设置为10m。

    client_header_buffer_size
    设置客户端header的buffer大小,建议4k。

    large_client_header_buffers
    对于比较大的header(超过client_header_buffer_size)将会使用该部分buffer,两个数值,第一个是个数,第二个是每个buffer的大小。
    建议设置为4 8k

    open_file_cache
    该参数会对以下信息进行缓存:
    打开文件描述符的文件大小和修改时间信息;
    存在的目录信息;
    搜索文件的错误信息(文件不存在无权限读取等信息)。
    格式:open_file_cache max=size inactive=time;
    max设定缓存文件的数量,inactive设定经过多长时间文件没被请求后删除缓存。
    建议设置 open_file_cache max=102400 inactive=20s;

    open_file_cache_valid
    指多长时间检查一次缓存的有效信息。建议设置为30s。

    open_file_cache_min_uses
    open_file_cache指令中的inactive参数时间内文件的最少使用次数,
    如,将该参数设置为1,则表示,如果文件在inactive时间内一次都没被使用,它将被移除。
    建议设置为2。

    压缩
    对于纯文本的内容,Nginx是可以使用gzip压缩的。使用压缩技术可以减少对带宽的消耗。
    由ngx_http_gzip_module模块支持
    配置如下:
      gzip on; //开启gzip功能
      gzip_min_length 1024; //设置请求资源超过该数值才进行压缩,单位字节
      gzip_buffers 16 8k; //设置压缩使用的buffer大小,第一个数字为数量,第二个为每个buffer的大小
      gzip_comp_level 6; //设置压缩级别,范围1-9,9压缩级别最高,也最耗费CPU资源
      gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些类型的文件需要压缩
      gzip_disable “MSIE 6.”; //IE6浏览器不启用压缩

反向代理/正向代理

代理就是我想做一件事情,可是我不想亲自去做,那么我就把我的述求告诉别人,由别人去帮我处理
那么反向代理是什么意思呢? 举个栗子:
1. 房东想卖房子,所以他就把挂到中介
2. 我想买房子,我不认识房东,我只能去中介公司,告诉中介公司我的述求
3. 中介根据我的诉求,找到了合适的房子,帮我联系房东
4. 房东根据我的诉求,收到我的钱了,就把房子卖给我了
以上就是一个反向代理的栗子,房东不知道谁要买房子,就委托中介,我直接找中介,让中介去帮我联系合适的房东,促成本次交易,中介在中间起到的就是代理的作用
那么正向代理其实差不多,反过来就是:
1. 我在网上说我要买房子
2. 房东看到了,但是房东对这个流程不熟悉或者没办法联系到我,所以房东找到了中介
3. 中介就把房东的述求跟我说了
4. 我觉得价格合适,我就买了

  1. 反向代理配置
    server {
    listen 80;
    server_name www.123.com;

     location / {
         proxy_pass http://127.0.0.1:8080;
         index  index.html index.htm index.jsp;
     }
    

    }
    由对外的80端口,代理到内部的8080端口

  2. 正向代理配置
    server {
    listen 80;
    server_name localhost;

     location / {
         proxy_pass http://baidu.com;
     }
    

    }
    由内部的80端口,代理到外部的www.baidu.com

负载均衡

负载均衡策略

  1. 轮询
    轮询方式是Nginx负载默认的方式,顾名思义,所有请求都按照时间顺序分配到不同的服务上,如果服务Down掉,可以自动剔除,如下配置后轮训10001服务和10002服务。

upstream dalaoyang-server {
server localhost:10001; server
localhost:10002;
}

  1. 权重
    指定每个服务的权重比例,weight和访问比率成正比,通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能,如下配置后10002服务的访问比率会是10001服务的二倍。

upstream dalaoyang-server {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}

  1. iphash
    每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务,如下配置(ip_hash可以和weight配合使用)。

upstream dalaoyang-server {
ip_hash;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}

  1. 最少连接

upstream dalaoyang-server {
least_conn;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}

  1. fair
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream dalaoyang-server {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
fair;
}

以上轮询策略,经过时间测试使用,最好用的还是默认轮询
下面是我的配置,可以贴出来看一下


#user  nobody;
worker_processes 32;


pid        logs/nginx.pid;
worker_rlimit_nofile 1024000;

events {
    worker_connections 1024000;
}

http {
    include       mime.types;
    default_type  application/octet-stream;



    log_format  main '[$remote_addr,$http_x_forwarded_for,$request,$request_body,$status,$body_bytes_sent,$bytes_sent,$msec,$http_user_agent,$request_length,$request_time,$upstream_response_time,$time_local,$upstream_addr]';
    access_log  /appslog1/nginx/access.log  main;
    error_log  /appslog1/nginx/error.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  10;
    gzip on;
    gzip_disable "msie6";  
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_min_length 1100;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    open_file_cache max=1024000 inactive=20s;
    open_file_cache_min_uses 2;
    open_file_cache_valid 10s;
    open_file_cache_errors on;

    upstream nsac {
       server 127.0.0.1:33390 weight=1;
       server 127.0.0.1:33391 weight=1;
    } 


limit_conn_zone $binary_remote_addr zone=one:10m;

server {

        listen     3381;
        server_name     127.0.0.1;
       error_log  /appslog1/nginx/3381-error.log;
       access_log  /appslog1/nginx/3381-access.log main;

	
        location / {
            proxy_pass http://nsac/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 10m;
            client_body_buffer_size 128k;
            proxy_connect_timeout 100;
            proxy_send_timeout 100;
            proxy_read_timeout 100;
            proxy_buffer_size 4k;
            proxy_buffers 2 32k;
            proxy_busy_buffers_size 32k;
            proxy_ignore_client_abort  on;

         }
    }


server {

        listen     33381;
        server_name     127.0.0.1;
       error_log  /appslog1/nginx/3381-error.log;
       access_log  /appslog1/nginx/3381-access.log main;

	location /audit_heart {
            proxy_pass  http://10.10.10.141:380/audit_heart;
            proxy_connect_timeout      600;
            proxy_read_timeout         600;
            proxy_send_timeout         600;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

 
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值