当前位置: 首页 > news >正文

Nginx性能优化

Nginx性能优化可分为对操作系统的优化和队Nginx本身的优化两部分。

针对Nginx对Linux系统的优化

1、关闭不必要的服务
根据自己Linux服务器部署的项目需求,进行相应的关闭不必要的服务或进程。

2、优化写磁盘操作
我们指导,Nginx每次访问一个文件的时候,Linux系统将会对他的“Access”,即访问时间进行修改对于查看一个文件被修改的时间,可以使用stat 文件名 的方式进行查看,例如:

[root@iZ94sni08orZ conf]# stat nginx.conf 
  File: "nginx.conf"
  Size: 2656        Blocks: 8          IO Block: 4096   普通文件
Device: ca01h/51713d    Inode: 660555      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1001/ UNKNOWN)   Gid: ( 1001/ UNKNOWN)
Access: 2015-11-18 16:31:05.221629056 +0800
Modify: 2015-04-21 22:11:59.000000000 +0800
Change: 2015-11-18 10:30:10.421498579 +0800
[root@iZ94sni08orZ conf]# 

列出了访问的时间,所以对于一个高并发的访问系统中,这些磁盘写操作对系统的影响还是挺大的,因此要关闭该功能。

/dev/sdb1  /dataext3  defaults 0  0 

修改为如下配置:

/dev/sdb1  /dataext3  defaults,noatime,nodiratime  0  0 

然后重新启动系统,使之生效。

或者不重启系统的话可以使用remount选项来重新挂载:

-->mount  -o  defaults,noatime,nodiratime  -o  remount  /dev/sdb1  /sdb
-->mount  |  grep  sdb1

/dev/sdb1  on  /sdb   type  ext3 (rw,noatime,nodiratime)

如果是单独挂载的分区或者磁盘,可以直接执行命令:

-->mount  -o  defaults,noatime,nodiratime  /dev/sdb1  /sdb
-->mount  |  grep  sdb1

/dev/sdb1  on  /sdb   type  ext3 (rw,noatime,nodiratime)

3、优化资源限制
Linux有一条命令为ulimit:用于控制shell程序的资源,用于shell启动进程所占用的资源,其语法为:

ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]

参数为:

   -a  显示目前资源限制的设定。 
   -c <core文件上限>  设定core文件的最大值,单位为区块。 
   -d <数据节区大小>  程序数据节区的最大值,单位为KB   -f <文件大小>  shell所能建立的最大文件,单位为区块。 
   -H  设定资源的硬性限制,也就是管理员所设下的限制。 
   -m <内存大小>  指定可使用内存的上限,单位为KB   -n <文件数目>  指定同一时间最多可开启的文件数。 
   -p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。 
   -s <堆叠大小>  指定堆叠的上限,单位为KB   -S  设定资源的弹性限制。 
   -t <CPU时间>  指定CPU使用时间的上限,单位为秒。 
   -u <程序数目>  用户最多可开启的程序数目。 
   -v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB

根据参数的功能,可以使用ulimit -a 来列举资源的限制信息:

[root@iZ94sni08orZ ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3870
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3870
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@iZ94sni08orZ ~]# 

上图是我的CentOS7.0的信息,然后使用命令,对系统针对Nginx进行优化,可以使用下边的命令对-n所对应的资源进行无限制,也就是系统所支持最大的值:ulimit -n unlimited 或者ulimit -n 数目 来修改。

也可以通过修改配置文件的方式进行修改:

vim /etc/security/limits.conf

该文件只有两行,其他的都为注释内容:

* soft nofile 65535
* hard nofile 65535

将其修改为:

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

上述修改之后需后需要重新启动菜而已生效。

4、优化内核TCP选项

修改一下内核参数,该文件在/etc/sysctl.conf,包含内容注释,都可以看懂,默认内容为:

# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

# Controls source route verification

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies

# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536
# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296

vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.conf.lo.arp_announce=2

将对应的属性设置下列值,有的修改,没有的加上去:

net.ipv4.tcp_max_tw_buckets = 6000 #设置timewait的值,默认为180000
net.ipv4.ip_local_port_range = 1024 65000 #设置允许洗头膏打开的端口范围,默认为32768-61000
net.ipv4.tcp_tw_recycle = 1 #设置是否启用timewait快速回收,默认为0
net.ipv4.tcp_tw_reuse = 1 #设置是否开启重新使用,即允许TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_syncookies = 1 #设置是否开启SYN Cookies,如果启用,那么SYN等待队列一处是,则使用Cookies处理,默认为0

net.core_somaxconn = 262144 #
net.core_netdev_max_backlog = 262144 #用于设置被传送到队列数据包的最大数目,在网卡接受数据包的速率比内核处理数据包的速率快时,那么会出现排队现象,这个参数就是用来设置该队列的大小

net.ipv4.tcp_max_orphans = 262144 #设置Linux能够处理不属于任何进程的套接字数量,即处理孤儿进程
net.ipv4.tcp_max_syn_backlog = 262144 #用于记录尚未收到客户端确认信息的链接请求的最大值
net.ipv4.tcp_timestamps = 0 #设置时间戳作为序列号,设置为0表示关闭该功能
net.ipv4.tcp_synack_retries = 1 #设置SYN重试的次数,默认为5,在TCP的三次握手中的第二次握手,内核需要发送一个回应前面一个SYN的ACK的SYN,就是说wile打开对方的链接,内核发出的SYN的次数。减少该参数的值有利于避免DDos攻击

net.ipv4.tcp_syn_retries = 1 #设置内核放弃建立链接之前发送SYN包的数量
net.ipv4.tcp_fin_timeout = 1 #决定它包吃FIN-WAIT-2状态的时间
net.ipv4.tcp_keepalive_time = 30 #当启用该功能是,该参数用于设置TCP发送keepalive消息的频率

优化Nginx服务器

1、关闭访问日志
根据相应的需要,进行相应模块的日志记录,如在http、server、location这些单独的区段中配置日志记录。

2、Nginx服务器配置优化

在server模块的配置文件中设置:

worker_connections 65535
keepalive_timeout 60
client_header_buffer_size 8k
worker_rlimit_nofile 65535

当然还有很多对Nginx的优化,上边简单的学习记录,希望对大家有帮助。

相关文章:

  • Django 开发可以停了
  • Nginx服务器的功能模块
  • 对于沟通的理解
  • QQ登录网站接入功能实现--非官方文档搬运
  • Tomcat使用IDEA远程Debug调试
  • SSH设置别名访问远程服务器
  • ACM程序设计选修课——1049: Efface Numbers(贪心)
  • Dubbo-admin无法显示Group分组信息以及是否可以显示多个分组
  • 使用Jenkins配置Git+Maven的自动化构建
  • JUnit单元测试基础要点
  • Dubbo无法访问远程Zookeeper已注册服务的问题
  • 笔记-iOS 视图控制器转场详解(上)
  • 各大互联网公司架构演进之路汇总 - 分享自@开发者头条
  • centos文件误删除恢复
  • MySQL执行状态分析
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • Google 是如何开发 Web 框架的
  • extract-text-webpack-plugin用法
  • java8 Stream Pipelines 浅析
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java基本数据类型之Number
  • java中具有继承关系的类及其对象初始化顺序
  • vue2.0项目引入element-ui
  • 构建二叉树进行数值数组的去重及优化
  • 开发基于以太坊智能合约的DApp
  • 理清楚Vue的结构
  • 责任链模式的两种实现
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​业务双活的数据切换思路设计(下)
  • #pragma once
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (poj1.3.2)1791(构造法模拟)
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • .NET CLR基本术语
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET使用存储过程实现对数据库的增删改查
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @Bean注解详解
  • @JsonSerialize注解的使用
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [20150321]索引空块的问题.txt
  • [20190113]四校联考
  • [android] 天气app布局练习
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [Enterprise Library]调用Enterprise Library时出现的错误事件之关闭办法
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能