一:理解Nginx 1:什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。 2:Nginx特性 (1)更快 (2)高扩展性,Nginx的设计极具扩展性, 它完全是由多个不同功能、 不同层次、 不同类型且耦合度极低的模块组成。 (3)高可靠性 (4)低内存消耗 (5)单机支持10万以上并发连接 (6)热部署,即可以在7*24小时不间断提供服务 3:Nginx使用要求 1:内核为2.6以上版本的操作系统 [root@localhost ~]# uname -a Linux localhost.localdomain 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 2:所需软件 1:gcc编译器 用户编译c语言程序 #yum install -y gcc 2:PCRE库 支持正则表达式 #yum install -y pcre pcre-devel 3:zlib库 zlib库用于对HTTP包的内容做gzip格式的压缩 。 #yum install -y zlib zlib-devel 4:openSSL库 如果我们的服务器不只是要支持HTTP, 还需要在更安全的SSL协议上传输HTTP, 那么就需要拥有OpenSSL了。 #yum install -y openssl openssl-devel 3:linux内核参数优化 首先需要修改/etc/sysctl.conf来更改内核参数,配置如下,然后执行sysctl -p命令生效。 #file-max: 这个参数表示进程(比如一个worker进程) 可以同时打开的最大句柄数, 这个参数直接限制最大并发连接数, 需根据实际情况配置。 fs.file-max = 999999 #tcp_tw_reuse: 这个参数设置为1, 表示允许将TIME-WAIT状态的socket重新用于新的TCP连接, 这对于服务器来说很有意义, 因为服务器上总会有大量TIME-WAIT状态的连接。 net.ipv4.tcp_tw_reuse = 1 #tcp_keepalive_time: 这个参数表示当keepalive启用时, TCP发送keepalive消息的频度。默认是2小时, 若将其设置得小一些, 可以更快地清理无效的连接。 net.ipv4.tcp_keepalive_time = 600 #tcp_fin_timeout: 这个参数表示当服务器主动关闭连接时, socket保持在FIN-WAIT-2状态的最大时间。 net.ipv4.tcp_fin_timeout = 30 #tcp_max_tw_buckets: 这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字, TIME_WAIT套接字将立刻被清除并打印警告信息。 该参数默认为180000, 过多的TIME_WAIT套接字会使Web服务器变慢。 net.ipv4.tcp_max_tw_buckets = 5000 #ip_local_port_range: 这个参数定义了在UDP和TCP连接中本地(不包括连接的远端)端口的取值范围。 net.ipv4.ip_local_port_range = 1024 61000 #tcp_max_syn_backlog: 这个参数表示TCP三次握手建立阶段接收SYN请求队列的最大长度, 默认为1024, 将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时, #Linux不至于丢失客户端发起的连接请求。 net.core.netdev_max_backlog = 8096 #net.ipv4.tcp_rmem: 这个参数定义了TCP接收缓存(用于TCP接收滑动窗口) 的最小值、 默认值、 最大值。 net.ipv4.tcp_rmem = 4096 32768 262142 #net.ipv4.tcp_wmem: 这个参数定义了TCP发送缓存(用于TCP发送滑动窗口) 的最小值、 默认值、 最大值。 net.ipv4.tcp_wmem = 4096 32768 262142 #netdev_max_backlog: 当网卡接收数据包的速度大于内核处理的速度时, 会有一个队列保存这些数据包。 这个参数表示该队列的最大值。 net.core.netdev_max_backlog = 8096 #rmem_default: 这个参数表示内核套接字接收缓存区默认的大小。 net.core.rmem_default = 262144 #wmem_default: 这个参数表示内核套接字发送缓存区默认的大小。 net.core.wmem_default = 262144 #rmem_max: 这个参数表示内核套接字接收缓存区的最大大小。 net.core.rmem_max = 2097152 #wmem_max: 这个参数表示内核套接字发送缓存区的最大大小。 net.core.wmem_max = 2097152 #tcp_syncookies: 该参数与性能无关, 用于解决TCP的SYN攻击。 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn.backlog=1024 4:安装Nginx 下载地址:http://nginx.org/en/download.html寻找一个合适的版本进行下载。 安装: $tar -zxvf nginx-1.13.8.tar.gz #configure命令做了大量的“幕后”工作, 包括检测操作系统内核和已经安装的软件, 参数的解析, 中间目录的生成以及根据各种参数生成一些C源码文件、 Makefile文件等。 $./configure #make命令根据configure命令生成的Makefile文件编译Nginx工程, 并生成目标文件、 最终的二进制文件。 $make #make install命令根据configure执行时的参数将Nginx部署到指定的安装目录, 包括相关目录的建立和二进制文件、 配置文件的复制。 $make install 启动: (1)默认方式启动 #/usr/local/nginx/sbin/nginx (2)指定配置文件启动方式 #/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 测试: (1)测试配置信息是否错误 #/usr/local/nginx/sbin/nginx -t 版本: #/usr/local/nginx/sbin/nginx -v 停止: 从容停止: #/usr/local/nginx/sbin/nginx -s quit 快速停止: #/usr/local/nginx/sbin/nginx -s stop 重读: 1:重读配置文件 #/usr/local/nginx/sbin/nginx -s reload 日志回滚: 重新再新的日志文件打印日志 #/usr/local/nginx/sbin/nginx -s reopen 回到顶部 二:Nginx的配置 2.1work与进程关系 在正式环境下,Nginx会使用一个master进程来管理多个work进程,work进程数量与服务器上的CPU核数相等。 为什么要设置为相同? 这正是apache和Nginx的不同之处,在apache上每个进程只处理一个请求,work进程可以同时处理多个,只受内存大小的限制。 2.2基本配置项 按照用户使用时的预期功能,可以将配置项分为4类: 1:正常运行必备配置项 2:事件配置项 3:用于调试,定位问题的配置项 4:优化性能配置项 2.2.1正常运行配置项 (1)定义环境变量 可让用户直接设置操作系统上的环境变量 env TESTPATH=/tmp/; (2)嵌入其他配置文件 include a.conf (3)work进程运行的用户及用户组 user (4)pid文件路径 pid path; 2.2.2事件配置项 (1)是否打开accpet锁 这个锁是负载均衡的锁,这个锁可以让多个work进程轮流地,有序的与新的客户建立TCP连接。 默认为打开,关闭会使负载不均衡,因此不建议打开。 accept_mutex on; (2)每个work最大连接数 每个work进程可以同时处理最大连接数 work_connections number; 2.2.3优化性能配置项 (1)work进程个数 work_processes number; (2)绑定work进程到指定的cpu内核 work_processes 4; work_cpu_affinity 1000 0100 0010 0001; (3)work进程优先级设置 work_priority 0; 2.2.4调试定位 (1)是否以守护进程运行Nginx 守护进程是否脱离终端并且在后台运行进程。 daemon on; (2)err日志设置 根据自己的需要这是err日志的级别和路径 日志的级别;debug,info,notice,warn,error,crit,alert,emerg err_log logs/err.log debug; 2.3用HTTP模块配置一个静态web服务器 2.3.1虚拟机与请求的分发 多个主机域名对应同一个IP。 (1)监听端口 listen后面可以只加IP地址,端口,或者主机名非常灵活。 listen 80; listen 127.0.0.1:80; listen 127.0.0.1; #默认为80端口 listen *.8; listen localhost:80; 在端口之后可加参数: listen 127.0.0.1 .......; 1.default:将所在的server块作为整个web服务的默认server块。如果没有设置这个,将会以文件的第一个server作为默认server。为什么要这样设置,因为,当一个请求无法配置配置文件中的所有主机域名时,就会选用默认的虚拟主机。 2.backlog=num: (2)主机名称 server_name 后面可跟多个主机名,在处理一个请求时,nginx会取出header头部的host,与每个server_name进行匹配,以此决定用哪个server块来处理这个请求。 (3)server_names_hash_bucket_size 为提高查找相应server_name的能力,Nginx使用散列表来存储server name,而server_names_hash_bucket_size设置每个散列桶占用内存的大小。 (4)server_names_hash_max_size 越大,消耗的内存越多,散列的冲突率会降低。 (5)location location = /{ 站点根路径匹配 例如: http://www.magedu.com/ 匹配 http://www.magedu.com/index.html 不匹配 } location ~ /a{ 对uri做正则表达式模式匹配,区分字符大小写 } location ~* /a{ 对uri做正则表达式模式匹配,不区分字符大小写 } location ^~ /image{ 对uri最左侧部分做匹配检查,不区分字符大小写 } location ~* /.(gif|jpg|jepg)${ #匹配结尾即可 } 匹配优先级从高到低:=, ^~, ~/~*, 不带符号 2.3.2文件路径的定义示例:http://www.magedu.com/bbs/index.php (1)以root方式设置资源路径 location /bbs/ { root /web/forum/; --真实访问的uri /web/forum/bbs/index.html } (2)以alias方式设置资源路径 location /bbs/ { alias /web/forum/; --> 真实访问uri /web/forum/index.html } (3)HTTP返回码重定向 error_page 500 502 503 504 = /50x.html; 2.3.3内存及虚拟资源的分配 2.3.4网络连接的设置 (1)读取HTTP头部的超时时间 client_header_timeout 60 如果在一定时间内没有收到客户端发送来的字节,则认为超时,返回408 (2)读取HTTP包体的超时时间 client_body_timeout 60 只有超过这个时间,读取HTTP包体时间才有效 (3)发送相应的超时时间 超过定义时间则关闭连接 send_timeout 60 (4)keepalived_diabled 超时时间 keepalive_timeout 75; 一个keepalive连接闲置超过一定时间后,(默认为75秒),服务器和浏览器都会去关闭这个连接 (5)一个keepalive长连接上允许承载的最大请求 keepalive_requests 100 代表keepalive上默认最对只能发送100个请求 2.3.5MIME类型的设置 2.3.6对客户端请求的限制 (1)按HTTP方法名限制用户请求 limit_except GET { allow 192.168.1.0 } (2)HTTP请求包体的最大值 浏览器在发送较大的HTTP请求时,其头部会有一个Content-Length字段,client_max_body_size是用来限制Connect-Length字段的大小 client_max_body_size 1m (3)对请求限速 limit_rate 0; 此配置对客户端请求限制每秒传输的字节数,0表示不限速 (4)limit_rate_after 1m 此配置表示NGINX想客户端发送的相应长度超过1m后开始限速 2.3.7文件操作的优化 2.3.8对客户端请求的特殊处理 (1)忽略不合法的请求头部 ignore_invalid_headers off|on 当为off时当有不合法的http请求头部时,nginx会拒绝服务,并发送400错误 当为on时,会忽略错误请求 (2)HTTP请求是否允许下划线 underscores_in_headers on|off 默认为off,表示不允许下划线 (3)文件未找到时是否记录到err日志 log_not_found on|off (4)是否合并相邻的“/” merge_slashes on 此配置项表示是否合并相邻的“/”,例如//test//s.txt,如果为on表示匹配为/tesr/a.txt (5)DNS解析地址 resolver address... (6)DNS解析的超时时间 resolver_timeout 30 此配置项表示解析的超时时间
来源:https://www.cnblogs.com/tanxiaojun/p/12152099.html