nginx的作用
nginx是什么
Web服务器,或者WWW(World Wide Web)服务器。具备Web服务器的基本功能:基于REST架构风格,以统一资源描述符(URI)或者统一资源定位符(URL)作为沟通依据,通过HTTP为浏览器等客户端程序提供各种网络服务。
竞争对手:Apache,Lighttpd,Tomcat,Jetty,HS
Tomcat和Jetty面向java语言,先天就是重量级的服务器,性能与Nginx没有可比性
HS只能在windows上运行,windows相比UNIX稳定性,性能都不如
Apache发展时间很长,一个重量级,不支持高并发的web服务器。数以万计的并发HTTP请求同时访问,服务器消耗大量内存,进程切换消耗CPU。
Lighttpd和nginx都是轻量级,高性能的web服务器,欧美喜欢使用Lignttpd,国内喜欢使用nginx。
nginx是跨平台的web服务器。
nginx的特点
- 更快
- 高扩展性
- 高可靠性
- 低内存消耗
- 单机支持10万以上的并发连接
- 热部署
- 最自由的BSD许可协议
安装
以linux系统为例:
前提条件
linux内核版本
需要内核为Linux2.6及以上的版本,因为2.6才支持epoll,而在Linux上使用select或poll来解决时间的多路复用,是无法解决高并发压力问题的。查看linux内核版本如下:
[root@VM-12-5-centos conf]# uname -a
Linux VM-12-5-centos 3.10.0-1160.11.1.el7.x86_64 #1 SMP Fri Dec 18 16:34:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
可见内核版本为3.10.0
必备软件
- GCC编译器:用来编译C语言程序,Nginx不会直接提供二进制可执行程序
yum install -y gcc
yum install -y gcc-c++
使用C++来编写HTTP模块
- PCRE库
支持正则表达式,如果需要在conf文件中使用正则表达式,则需要安装
yum install -y pcre pcre-devel
- zlib库
用于对HTTP包的内容做gzip格式的压缩,如果需要在conf中皮质gzipon,对于某些类型(context-type)的HTTP响应使用gzip来进行压缩以减少网络传输
yum install -y zlib zlib-devel
- OpenSSL开发库
如果不只是要支持HTTP,还需要更安全的SSL协议上传输HTTP,那么就需要使用OpenSSL了,
yum install -y openssl openssl-devel
磁盘目录
- nginx源代码存放目录
存放nginx源码文件,以及第三方或我们自己缩写的模块源码文件
- nginx编译阶段产生的中间文件存放目录
在configure命令执行后所生成的源文件及目录,以及make命令执行后生成的目标文件和最终连接成功的二进制文件。默认情况,configure命令会将该目录命名为objs,放nginx源码目录下
- 部署目录
该目录存放实际nginx服务运行期间所需要的二进制文件,配置文件等。默认/usr/locl/nginx
- 日志文件存放目录
日志文件通常比较大,研究nginx底层架构,需要打开debug级别,需要预先分配一个拥有更大磁盘空间的目录
linux内核参数的优化
修改linux内核参数的方法
# 修改参数
vim /etc/sysctl.conf
# 参数生效
sysctl -p
默认如下:
net.ipv4.ip_forward = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0
# Controls the System Request debugging functionality of the kernel
# 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
net.ipv4.tcp_syncookies = 1
# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536
# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536
net.ipv4.conf.all.promote_secondaries = 1
net.ipv4.conf.default.promote_secondaries = 1
net.ipv6.neigh.default.gc_thresh3 = 4096
net.ipv4.neigh.default.gc_thresh3 = 4096
kernel.softlockup_panic = 1
net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.default.disable_ipv6=0
net.ipv6.conf.lo.disable_ipv6=0
kernel.numa_balancing = 0
kernel.shmmax = 68719476736
kernel.printk = 5
kernel.sysrq = 1
需要修改的参数
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.tcp_max_syn.backlog = 1024
net.ipv4.ip_local_port_range = 1024 61000
net.ipv4.tcp_rmem = 4096 32768 262142
net.ipv4.tcp_wmen = 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
解释如下
- fs.file-max
进程可以同时打开的最大句柄数,这个参数直接限制最大并发连接数
- net.ipv4.tcp_tw_reuse
允许将TIME_WAIT状态的socket重新用于新的TCP连接
- net.ipv4.tcp_keepalive_time
当启用keepalive时,TCP发送keepalive消息的频度。默认是2h,设置小一点,可以更快清理无效的连接
- net.ipv4.tcp_fin_timeout
当服务器主动关闭连接时,socket保持在FIN-WAIT-2状态的最大时间
- net.ipv4.tcp_max_tw_buckets
允许TIME_WAIT套接字数量的最大值,超过这个数字,TIME_WAIT套接字将立刻被清除并打印告警信息,该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢
- net.ipv4.tcp_max_syn.backlog
表示TCP三次握手建立连接接收SYN请求队列的最大长度,默认为1024,将其设置大一些可以使出现Nginx繁忙来不及accept新连接的情况下,Linux不至于丢失客户端发起的请求连接
- net.ipv4.ip_local_port_range
定义了在UDP和TCP连接中本地(不包括连接的远端)端口的取值范围
- net.ipv4.tcp_rmem
TCP接收缓存(用于TCP接收滑动窗口)的最小值,默认值,最大值
- net.ipv4.tcp_wmen
TCP发送缓存(用于TCP发送滑动窗口)的最小值,默认值,最大值
- net.core.netdev_max_backlog
当网卡接收数据包的速度大于内核处理速度时,会有一个队列保存这些数据包,这个参数表示该队列的最大值
- net.core.rmem_default
表示内核套接字接收缓存区默认的大小
- net.core.wmem_default
表示内核套接字发送缓存区默认的大小
- net.core.rmem_max
内核套接字接收缓存区的最大大小
- net.core.wmem_max
内核套接字发送缓存区的最大大小
- net.ipv4.tcp_syncookies
该参数与性能无关,用于解决TCP的SYN攻击
安装
安装
#auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
#auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src在./configure后文件目录变化
./configure
make
make install
nginx命令行控制
默认nginx被安装在/usr/local/nginx,二进制文件在/usr/local/nginx/sbin/nginx,配置文件在/usr/local/nginx/conf/nginx.conf
- 默认启动方式
/usr/local/nginx/sbin/nginx
- 执行配置文件启动
/usr/local/nginx/sbin/nginx -c /tmp/nginx.conf
- 指定安装目录启动
/usr/local/nginx/sbin/nginx -p /usr/local/nginx/
- 指定全局配置项启动
- 测试配置信息是否有误
[root@VM-12-5-centos sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# -q参数可以不把error级别以下的信息输出到屏幕
/usr/local/nginx/sbin/nginx -t
- 显示版本
[root@VM-12-5-centos sbin]# ./nginx -v
nginx version: nginx/1.22.1
- 显示编译阶段的参数
[root@VM-12-5-centos sbin]# ./nginx -V
nginx version: nginx/1.22.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments:
- 快速停止服务
/usr/local/nginx/sbin/nginx -s stop
# 类似于kill命令
# kill -s SIGTERM 进程ID
- 优雅停止服务
/usr/local/nginx/sbin/nginx -s quit
# kill -s SIGQUIT 进程号
与stop区别,当快速停止服务时,worker进程和master进程收到信号后会立刻跳出循环,推出进程
而优雅停止服务时,首先会关闭监听器口,停止接收新的连接,然后把当前正在处理的连接全部处理完,最后推出进程
- 使运行中的nginx重读配置项并生效
/usr/local/nginx/sbin/nginx -s reload
- 日志文件回滚
/usr/local/nginx/sbin/nginx -s reopen
- 平滑升级nginx
nginx服务升级到新版本必须要将旧的二进制文件替换掉,通常是需要重启服务的,但是nginx支持不重启服务来完成新版本的平滑升级
1)通过向master进程发送USR2信号可达到目的
kill -s SIGUSR2 <nginx master pid>
这时,运行中的nginx会将pid文件重命名,如将/usr/local/nginx/logs/nginc.pid重命名为/usr/local/nginx/logs/nginc.pid.oldbin这样新的nginx才有可能重新启动
2)启动新版本的nginx,可以使用之前的任意一种启动方式。通过ps命令可以发现新旧版本的nginx在同时运行
3)通过kill命令向旧的版本master进程发送SIGQUIT信号,以优雅的方式关闭旧版本的nginx。随后将只有新版本的nginx服务运行,此时平滑升级完毕
- 显示命令行帮助