1、nginx常用功能和配置

1.1 限流

  • limit_conn_zone(限制连接数,针对客户端,即单一ip限流)
  • limit_req_zone(限制请求数,针对客户端,即单一ip限流)
  • ngx_http_unpstream_module(推荐,针对后台,如:有两台服务器,服务器A最大可并发处理10W条请求,服务器B最大可并发处理5W条请求,这样当12W请求按照负载均衡规则应当被分配给服务器A时,nginx为了防止A挂掉,所以将另外的2W分配给B)

1.2 压力测试工具——Ab

1.2.1安装

yum install httpd-tools -y

1.2.2 测试

// 10个用户,向 http://www.test.com/ 并发发送1000条请求(总请求数=1000)

ab -c 10 -n 1000 http://www.test.com/

1.2.3 返回值

  • Document Path:测试的页面路径
  • Document Length:页面大小(byte)
  • Concurrency Level:并发数量,即并发用户数
  • Time taken for tests:测试耗费时长
  • Complete requests:成功的请求数量
  • Failed requests:请求失败的数量
  • Write errors:错误数量
  • Requests per second:每秒钟的请求数量、吞吐率
  • Timer per request:每次请求所需时间、响应时间

1.3 limit_conn_zone

  1. http {
  2. # 将请求客户端的IP($binary_remote_addr)存放到perip区域,区域大小为10M,一个IP占用32Byte(32位系统)或64Byte(64位系统)左右
  3. # perip是区域的名字,可自定义
  4. limit_conn_zone $binary_remote_addr zone=perip:10m;
  5. server {
  6. # 每个IP最大并发1条连接
  7. # 该语句还可直接放置到http模块下,这样下属的server都应用该配置
  8. # 该语句还可放置到server中的location模块中,这样仅指定的location应用该配置
  9. limit_conn perip 1;
  10. # 每个连接限速300 k/s
  11. limit_rate 300k;
  12. }
  13. }

1.4 limit_req_zone

  1. http {
  2. # 将请求客户端的IP存放到perip区域,区域大小为10M,并限制同一IP地址的请求每秒钟只处理一次
  3. limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
  4. server {
  5. # 当有大量请求爆发时,可以缓存2条请求
  6. # 设置了nodelay,缓存队列的请求会立即处理,若请求数 > rate+burst 时,立即返回503;如果没设置,则会按照rate排队等待处理
  7. # 该语句还可直接放置到http模块下,这样下属的server都应用该配置
  8. # 该语句还可放置到server中的location模块中,这样仅指定的location应用该配置
  9. limit_req zone=perip burst=2 nodelay;
  10. }
  11. }

1.5 limit_req_zone

  1. http {
  2. # 将请求客户端的IP存放到perip区域,区域大小为10M,并限制同一IP地址的请求每秒钟只处理一次
  3. limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
  4. server {
  5. # 当有大量请求爆发时,可以缓存2条请求
  6. # 设置了nodelay,缓存队列的请求会立即处理,若请求数 > rate+burst 时,立即返回503;如果没设置,则会按照rate排队等待处理
  7. # 该语句还可直接放置到http模块下,这样下属的server都应用该配置
  8. # 该语句还可放置到server中的location模块中,这样仅指定的location应用该配置
  9. limit_req zone=perip burst=2 nodelay;
  10. }
  11. }
  12. - 测试:ab -c 1 -n 3 http://localhost/
  13. - 3个请求全部成功,因为正在处理的请求数1加上缓存数2,没超过限制
  1. Server Software: nginx/1.18.0
  2. Server Hostname: 192.168.159.128
  3. Server Port: 80
  4. Document Path: /
  5. Document Length: 612 bytes
  6. Concurrency Level: 1
  7. Time taken for tests: 0.001 seconds
  8. Complete requests: 3
  9. Failed requests: 0
  10. Total transferred: 2535 bytes
  11. HTML transferred: 1836 bytes
  12. Requests per second: 2439.02 [#/sec] (mean)
  13. Time per request: 0.410 [ms] (mean)
  14. Time per request: 0.410 [ms] (mean, across all concurrent requests)
  15. Transfer rate: 2012.67 [Kbytes/sec] received
  • 测试:ab -c 3 -n 4 http://localhost/

    • 3个请求成功,1个请求失败,因为正在处理的请求数1加上缓存数2,另外1条请求失败
  1. Server Software: nginx/1.18.0
  2. Server Hostname: 192.168.159.128
  3. Server Port: 80
  4. Document Path: /
  5. Document Length: 612 bytes
  6. Concurrency Level: 1
  7. Time taken for tests: 0.002 seconds
  8. Complete requests: 4
  9. Failed requests: 1
  10. (Connect: 0, Receive: 0, Length: 1, Exceptions: 0)
  11. Non-2xx responses: 1
  12. Total transferred: 3223 bytes
  13. HTML transferred: 2330 bytes
  14. Requests per second: 2504.70 [#/sec] (mean)
  15. Time per request: 0.399 [ms] (mean)
  16. Time per request: 0.399 [ms] (mean, across all concurrent requests)
  17. Transfer rate: 1970.86 [Kbytes/sec] received

1.5 ngx_http_upstream_module

  1. upstream MyName {
  2. server 192.168.0.1:8080 weight=1 max_conns=10;
  3. server 192.168.0.2:8080 weight=1 max_conns=10;
  4. }

2、安全配置

2.1 版本安全

  • 隐藏HTTP Response消息头Server中的版本号

    • 隐藏前:Server: nginx/1.18.0
    • 隐藏后:Server: nginx
  1. http {
  2. server_tokens off;
  3. }

2.2 IP安全

  • 白名单配置(适用于授权IP较少的情况),可配置在http、server、location中
  1. location / {
  2. allow 192.168.1.1;
  3. deny all;
  4. }
  • 黑名单配置(适用于授权IP较多的情况),可配置在http、server、location中
  1. location / {
  2. deny 192.168.1.1;
  3. allow all;
  4. }

2.3 文件安全

  1. location /logs {
  2. autoindex on;
  3. root/opt/nginx/;
  4. }
  5. location ^logs~*\.(log|txt)$ {
  6. add_header Content-Type text/plain;
  7. root/opt/nginx/;
  8. }

3、进程数、并发数、系统优化

3.1 配置nginx.conf,增加并发量

  1. # 与CPU逻辑核心数一致
  2. worker_processes 12;
  3. events {
  4. # 单个worker最大并发连接数
  5. worker_connection 65535;
  6. }

3.2 调整内核参数

  • 查看所有的属性值

    ulimit -a
  • 临时设置硬限制(重启后失效)

    ulimit -Hn 100000
  • 临时设置软限制(重启后失效)

    ulimit -Sn 100000
  • 持久化设置(重启后仍生效)
  1. vim /etc/security/limits.conf
  2. 接下来是文件中需要配置的内容
  3. * soft nofile 100000
  4. * hard nofile 100000
  5. 用户/组 软/硬限制 需要限制的项目 限制的值

4、GZIP

  • 作用:启用gzip后,服务器将响应报文进行压缩,有效地节约了带宽,提高了响应至客户端的速度。当然,压缩会消耗nginx所在电脑的cpu
  • 配置范围:http、server、location
  1. http {
  2. # 启用gzip
  3. gzip on;
  4. # 允许压缩的最小字节数(即如果response header中的content-length小于该值,就不压缩)
  5. gzip_min_length 2k;
  6. # 按照原数据大小以16k为单位的4倍申请内存用作压缩缓存
  7. gzip_buffers 4 16k;
  8. # 压缩级别,级别越大,压缩率越高,占用CPU时间更长
  9. gzip_comp_level 5;
  10. # 需要被压缩的响应类型,默认值是text/html
  11. gzip_types text/plain application/x-javascript text/css application/xml;
  12. # 配置最低版本的http压缩协议(即1.0时,1.0和1.1都会启用压缩;1.1时,仅1.1时才会启用压缩)
  13. gzip_http_version 1.0;
  14. # IE6及以下禁用压缩
  15. gzip_disable "MSIE [1-6]\.";
  16. }

5、、状态监控

5.1 配置访问地址

  1. location /nginxstatus {
  2. stub_status on;
  3. // 禁止将监控信息写入访问日志
  4. access_log off;
  5. }

5.2 安装插件并重启

  1. cd /usr/local/src/nginx-1.18.0
  2. # 如果不是使用的默认路径,使用 --prefix 指定
  3. ./configure --with-http_stub_status_module
  4. make && make install
  5. /usr/local/nginx/sbin/nginx -s quit
  6. /usr/local/nginx/sbin/nginx

5.3 访问地址,状态参数如下

  • Active connections:活跃的连接数量
  • server accepts handled requests:处理的总连接数 创建的握手数 处理的总请求数
  • reading:读取客户端的Header信息的次数。这个操作仅读取头部信息,完成后立即进入writing状态
  • writing:响应数据传到客户端的Header信息次数。这个操作不仅读取头部,还要等待服务响应
  • waiting:开启keep-alive后等候下一次请求指令的驻留连接

6、负载均衡

6.1 轮询

  1. upstream myserver {
  2. # 默认所有服务器权重为 1
  3. server 192.168.250.220:8080;
  4. server 192.168.250.221:8080;
  5. server 192.168.250.222:8080;
  6. }

6.2 加权轮询

  • 性能更好的服务器权重应更高
  1. upstream myserver {
  2. server 192.168.250.220:8080 weight=3;
  3. server 192.168.250.221:8080; # default weight=1
  4. server 192.168.250.222:8080; # default weight=1
  5. }

6.3 最少连接

  1. upstream myserver {
  2. least_conn;
  3. # with default weight for all (weight=1)
  4. server 192.168.250.220:8080;
  5. server 192.168.250.221:8080;
  6. server 192.168.250.222:8080;
  7. }

6.4 加权最少连接

  • 性能更好的服务器权重应更高
  1. upstream myserver {
  2. least_conn;
  3. server 192.168.250.220:8080 weight=3;
  4. server 192.168.250.221:8080; # default weight=1
  5. server 192.168.250.222:8080; # default weight=1
  6. }

6.5 IP Hash

  • 算法:根据客户端ip进行Hash得到一个数值,然后使用该数值对服务器个数取模,得到的结果就是映射的服务器序号
  • (在服务器个数不变的情况下)可保证同一ip地址的请求始终映射到同一台服务器,解决了session共享问题
  1. upstream myserver {
  2. ip_hash;
  3. # with default weight for all (weight=1)
  4. server 192.168.250.220:8080;
  5. server 192.168.250.221:8080;
  6. server 192.168.250.222:8080;
  7. }

6.6 uri Hash

  • (在服务器个数不变的情况下)可保证同一uri始终映射到同一台服务器
  • nginx在1.7.2之后支持uri_hash
  1. upstream myserver {
  2. hash $request_uri;
  3. # with default weight for all (weight=1)
  4. server 192.168.250.220:8080;
  5. server 192.168.250.221:8080;
  6. server 192.168.250.222:8080;
  7. }

7、access日志切割

7.1 新建Shell脚本

脚本文件路径随意

vim /usr/local/nginx/nginx_log.sh

  • 将以下内容添加到脚本中
  1. #! /bin/bash
  2. # 设置日志文件存放目录(nginx安装目录为/usr/local/nginx)
  3. LOG_HOME="/usr/local/nginx/logs"
  4. # 备份Log名称
  5. LOG_PATH_BAK="$(date -d yesterday +%Y%m%d%H%M)".access.log
  6. # 重命名日志文件
  7. mv ${LOG_HOME}/access.log ${LOG_HOME}/${LOG_PATH_BAK}.log
  8. # 向nginx主进程发信号重新打开日志
  9. kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

7.2 创建crontab定时作业

crontab -e

  • 将以下内容添加到作业中去(任取一个)

    • corn表达式生成器:http://cron.qqe2.com/
  1. # 以每分钟切割一次为例
  2. */1 * * * * sh /usr/local/nginx/nginx_log.sh
  3. # 以每天切割一次为例
  4. 0 0 0 1/1 * ? sh /usr/local/nginx/nginx_log.sh

8、动静分离

  • 概念:将动态请求和静态请求分开
  • 实现方式:
    • (推荐)将静态文件存放在专门的服务器上,使用单独的域名
    • 另一种是将动态和静态文件放在一起,使用nginx区分

8.1 以实现方式1为例

  • 前提:将静态文件存放在代理服务器中
  • 在ngnix中创建文件目录(如/usr/local/nginx/static),将所有静态文件发布到该目录中
  • 在nginx.conf http server 中配置动静分离
  1. server {
  2. location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
  3. {
  4. root /usr/local/nginx/static;
  5. # 缓存30天
  6. expires 30d;
  7. }
  8. }

在实际的后台服务器中发布的程序中,使用静态文件时,路径指向设置为静态文件服务器(这里是代理服务器)。

nginx常用功能和配置的更多相关文章

  1. 5.8 Nginx 常用功能的配置

  2. Nginx常用功能配置二

    Nginx常用功能配置二 Nginx location匹配设置 location作用:可以根据用户请求的URI来执行不同的应用,根据用户请求的网站的地址URL匹配. location语法: locat ...

  3. Nginx常用功能配置一

    Nginx常用功能配置 参数include配置 说明:如果日常工作中server标签存在太多,可以采用include配置模式,Nginx的主配置文件包含的所有虚拟主机的子配置文件会统一放入extra目 ...

  4. 3.Nginx常用功能介绍

    Nginx常用功能介绍 Nginx反向代理应用实例 反向代理(Reverse Proxy)方式是指通过代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并且从内部网络服 ...

  5. Nginx常用功能

    3.Nginx常用功能 3.1 反向代理服务器 3.1.1.demo2 a.我在tomcat下部署了一个javaweb项目,tomcat安装的服务器IP为:192.168.37.136,部署的项目在t ...

  6. nginx常用功能配置

    一.规范优化nginx配置文件 nginx的主配置文件为nginx.conf,主配置文件包含的所有虚拟主机的子配置文件会统一放入extra目录中,虚拟主机的配置文件按照网站的域名或功能取名,例如www ...

  7. 前端开发掌握nginx常用功能之rewrite

    上一篇博文对nginx最常用功能的server及location的匹配规则进行了讲解,这也是nginx实现控制访问和反向代理的基础.掌握请求的匹配规则算是对nginx有了入门,但是这些往往还是不能满足 ...

  8. nginx常用命令和配置

    1.常用命令 查看版本号: ./nginx -v   启动nginx:在/usr/local/nginx/sbin 目录下执行  ./nginx   关闭nginx:在/usr/local/nginx ...

  9. Swiper 常用功能及配置清单

    内容来源于Swiper中文在线(http://www.swiper.com.cn/),由于Swiper功能强大,这里只将常用的功能列出来,方便开发. 这里统一使用Swiper最新版 4.0做为演示! ...

随机推荐

  1. Linux 网卡 bonding配置

    网卡 bonding配置 目录 网卡 bonding配置 一.bonding技术 bonding的七种工作模式 总结: 二.Centos7配置bonding 1.关闭和停止NetworkManager ...

  2. linux系统搭建ftp服务器及创建用户使用

    linux 系统下搭建ftp服务器 ftp是什么 FTP是 File Transfer Protocol 文件传输协议的英文名称,用于在Internet上控制文件的双向传输. 同时它也是一个应用程序. ...

  3. hadoop fs -stat 查看文件状态

    转载来自:https://blog.csdn.net/knowledgeaaa/article/details/24394287 当向HDFS上写文件时,可以通过设置dfs.block.size配置项 ...

  4. Salesforce 大数据量处理篇(二)Index

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.202.0.salesforce_large_data_volumes_bp.meta/ ...

  5. Flutter 应用入门:计数器

    用Android Studio创建的Flutter应用模板默认是一个简单的计数器示例. // 导入包 import 'package:flutter/material.dart'; // 应用入口,启 ...

  6. docker 镜像导入load、导出save以及重命名

    docker 导入导出操作 save 保存(导出)镜像 # 把镜像打包成 .tar # -o 要保存路径.tar # > 要保存路径.tar # docker save 镜像id > /存 ...

  7. Session、Cookie与Token

    http协议是无状态协议 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到 ...

  8. linux线程数限制与zabbix监控

    Linux最大线程数限制及当前线程数查询 最大线程数计算方式: n = total_memory/128k; Linux用户线程数限制而导致的程序异常为 java.lang.OutOfMemoryEr ...

  9. 【RAC】打完补丁后,发现只有一台rac可以启动,另一台无法启动

    安装11Gr2单机asm后,打完11.2.0.3.7的psu后,发现启动不起来数据库,alert日志内容如下: Errors in file /u01/app/oracle/diag/rdbms/bd ...

  10. ctfshow——web_AK赛

    签到_观己 从题目描述中没发现什么有用的信息 发现文件包含 尝试使用PHP伪协议执行命令,发现无法执行 尝试使用远程文件包含,发现也未开启 尝试使用日志注入 记录了UA值,抓包写入一句话木马 使用蚁剑 ...