目录
Nginx是一款轻量级的Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在连接高并发的情况下,Nginx是Apache服务不错的替代品
学习nginx之前,我们来简单了解一下
nginx与apache的区别,以及各自的优点
nginx与apache在性能上的差别其本质在于nginx采用了epoll网络模型,相比较于apache的采用的select模型,epoll的优点在于它不需要轮询、没有最大并发连接的限制,mmap内存映射、它最大的优点在于它只管理”活跃“的连接,跟总连接数无关,因此在实际的网络环境中,在高并发的情况下,epoll的效率会远高于select。
关于select、poll、epoll的更详细的区别可以参考:https://www.cnblogs.com/aspirant/p/9166944.html
nginx优点:
1、event-driven、mmap(内存映射)、sendfile传递机制
(关于mmap内存映射和sendfile传递方式的介绍,请关注我的另一篇文章:https://blog.youkuaiyun.com/keil_wang/article/details/86688271)
2、nginx属于轻量级服务器,比起apache占用更少的内存及资源
3、nginx处理请求是异步非阻塞的,多个连接对应一个进程,而apache是阻塞型的,一个连接对应一个进程。所以在高并发下,nginx表现出低资源、低消耗、高性能的优势
4、静态处理有优势
apache优点:
1、模块众多
2、rewrite模块更加完善
3、动态处理有优势
4、apache支持php,如果接收到java请求,需要在apache后用tomcat做支撑,将java请求发送给tomca
总体来说,对性能要求高,首选nginx,对稳定性要求高,首选apache
-----------------------
nginx安装
在官网下载repo包
http://nginx.org/en/linux_packages.html#stable
yum clean all
yum -y install nginx
nginx使用指令:
-h 查看帮助选项
-V 查看版本和配置选项
-t 测试语法
-s 发送信号给master进程
nginx -s stop/reload/quit/reopen #常用指令
主进程(master)负责监控端口(80),协调工作进程的工作状态,分配工作任务,worker进程负责任务处理。
nginx #启动nginx
ps -ef |grep nginx
netstat -anpl |grep nginx
测试:浏览器输入本机IP
-------------------------
nginx的配置
可参考官网文档:http://nginx.org/en/docs/ 在该文档中,有每一个参数的详解以及示例,可打开如下图的字母检索方便查找
vim /etc/nginx/nginx.conf #主配置文件
该配置文件采用模块化,包括 全局配置、事件模块、server模块、location模块。每一项参数都有特定的位置,有的参数可以配置在多个模块中,具体参考官方文档,下文中也会简单标注。
全局配置
event{
}
http{
server{ #配置一个虚拟主机,当主机较多时,可用include来区分
location{ #针对路径做额外配置,也可在server块中
}
}
}
注意:每一行要以”;“封号结尾
全局配置
user nginx /nobody;
worker_processes 2/auto; worker进程数量,一般等于cpu个数
worker_cpu_affinity auto/0001 0010 0100 1000; cpu亲和力,将进程和cpu绑定,提高缓存命中率
worker_priority 20; worker进程的优先级 【-20,20】
worker_rlimit_nofile 65536; worker进程能够打开文件数量的上限值(worker_processes*worker_connections)
调优:linux的初始最大打开文件数为 1024,当负载(并发量)较大时,会出现 error:too many open files 因此,可适当调节
ulimit -n 查看系统当前的最大打开文件数
vim /etc/security/limits.conf #修改最大打开文件数
* soft nofile 65535
* hard nofile 65536
* soft noproc 65536 #所有用户打开进程数的最大值为65535
@student hard noproc 65536
*表示所有用户,@针对某个用户做限制
注意:
a、所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max
b. nofile的soft limit不能超过其hard limit
c. nofile的hard limit不能超过/proc/sys/fs/nr_open
error_log /var/log/nginx/error.log;
pid /run/nginx.pid; 指定nginx主进程PID的文件路径
daemon on/off; 是否使用守护进程,默认on,后台执行。off:前台,适用于测试环境
include file; 指定其他配置文件
}
事件
events{
worker_connections 30000; 每个w进程能够打开的最大并发连接数量
use epoll; 并发连接请求的处理方法,nginx的优势就在于epoll的处理方法
multi_accept on/off; 默认为on
on:一个连接只唤醒一个Worker,其他处于休眠,适用于并发量小时
off:一个连接会唤醒所有W(惊群),直到分配完,未连接的继续休眠,适用于高并发量,提高效率
}
http{
sendfile on; 是否调用sendfile函数来输出文件,在内核中封装,直接发送
tcp_nodelay on/off
on: 不延时发送,来一个请求发送一个,提高用户体验
off:延时发送,多个请求合并后一起发送,节省服务器资源
server_tokens on/off/build/string 是否显示nginx版本信息,可在http、server、location模块中
ssl 仅能够通过ssl连接
backlog=number 超过最大并发连接数后,新的请求进入后援队列
rcvbuf=size 接收缓冲区大小
sndbuf=size 发送缓冲区大小
include file;
server { //配置一个虚拟主机,当主机较多时,可用include来区分
listen 80; (default_server)可将IP地址和端口绑定,127.0.0.1:80;
server_name www.a.com; 支持多种写法, 通配符、正则表达式等
root /data/aaa; 网站路径 也可在http、location模块
index file; 默认页面
location /news { #针对路径做额外配置,也可在server块中
root /test/aaa; 访问的是/test/aaa下的news,而不是/data/aaa下的news
try_files $uri file; 默认文件页面
limit_except GET{ #除了DET之外的其他方法,仅允许192.168.10.10访问,仅location
allow 192.168.10.10;
deny all;
}
}
error_page 404 =200 /404.html; 错误页面,(响应码改为200,防止被劫持)
location /404.html{
root /data/aaa/error; 在/data/aaa/error/404.html文件中编写错误页面
}
keepalive_timeout time; 保持连接超时时长
keepalive_requests number; 一次长连接上允许请求的最大数量,默认为100
keepalive_disable none... 禁用长连接
send_timeout time; 向客户端发响应报文的超时时长
client_body_buffer_size size; 接受用户请求报文body部分的缓冲区大小,默认为16k,若超过,被暂存到磁盘上,路径由client_body_temp_path定义
client_body_temp_path /var/test 1 2 2
1 一级目录,占1位16进制,0-f 共16个目录
2 二级目录,占2位16进制,00-ff 共16*16=256个目录
2 三级目录,占2位16进制,00-ff 共16*16=256个目录
例:某文件名的哈希值为...45764d,则他的存储位置为,/var/test/d/64/57
} #server块(标注以下括号,参数实在太多了。。。)
} #http块
----Location中alias 别名 ,与root的区别
root ,给定的路径对应location中的/url/左侧的/
alias ,给定的路径对应location中的/url/右侧的/
location /bbs/ {
root /web/forum/; 访问的是:/web/forum/bbs/index.html
}
location /bbs/ {
alias /web/forum/; 访问的是:/web/forum/index.html
}
nginx作为代理服务器
http {
.....
upstream server-1 {
server 192.168.142.160:8080 ##8080端口是tomcat的web服务端口
}
server { ##server块可用include另外写
listen 80;
server_name www.a.com;
location / {
proxy_pass http://server-1;
index index.html index.htm;
}
}
}
反向代理流程:浏览器输入www.a.ocm,通过域名解析到192.168.142.161(nginx服务器),进而匹配到sever_name为www.a.com的server块,通过proxy_pass将请求转发到upatream server-1,也就是tomcat服务器
其他的一些调优模块
(h、s、l表示该参数可在http、server、location中配置)
1、limit_rate rate; 限制响应客户端的传输速率,单位:bytes/second 默认为0,表示不限制,(h、s、l)
2、aio on/off; 是否启用异步IO,默认off (h、s、l)
3、directio size /off; 直接IO,达到指定的size,直接写磁盘,而非写缓存(h、s、l)
4、缓存文件相关模块
nginx服务器收到用户请求后从系统内核读取到的文件,将被缓存 (h、s、l)
open_file_cache off;
open_file_cache max=N[inactive=time]
N:可缓存的缓存项上限 inactive=time:此时长内未被命中或命中次数小于open_file_cache_min_uses所指定的次数时,成为非活动项,将被删除
open_file_cache_min_uses number; 默认为1
open_file_cache_errors on/off; 是否缓存 查找时发生错误的文件
open_file_cache_valid time; 缓存项有效性的检查频率,默认为60s
5、访问控制模块
location / { #按顺序检查,一般将精确的放在前面
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
6、身份验证模块,即访问页面时会提示输入用户名和密码,借助httpd-tools生成
auth_basic string/off; 默认off 。(h、s、l)
auth_basic “admin“; 字符串,自定义
auth_basic_user_file /etc/nginx/nginxuser;
针对特定文件验证:
location /admin {
auth_basic “admin “;字符串,自定义
auth_basic_user_file /etc/nginx/nginxuser;
}
httpd-tools工具提供,生成加密文件
htpasswd -cm nginxuser httpuser1
回车,提示创建密码,可创建多个用户,第二次创建时,不用加-c参数
7、状态页模块(nginx服务器运行状态)
location /status {
stub_status; {s、l)
deny ... 针对用户做限制,不能访问status
}
状态页信息:
Active connections:当前状态,连接数
accepts:已接收的客户端请求总数
handles:已处理的客户端请求总数
requests:客户端发来的请求分数
Reading:正在读取请求报文首部的连接数
Writing:正在向客户端发送响应报文的连接数
Waiting:正在等待请求的空闲连接数
8、访问日志模块
log_format name string...; string为格式定义,参考官方文档(h)
access_log path /off; 调用日志格式,配合log_format使用(h、s、l)
[format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]
例:access_log /etc/log/nginx/access.log test ; 此处的test就是log_format 中的name(自定义格式的名称)
9、日志缓存
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; (h、s、l)
与open_file_cache 类似
open_log_file_cache off; 默认off
例:open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
10、压缩模块(压缩响应数据) (h、s、l)
gzip on/off;
gzip_comp_level number; 压缩级别,1-9,默认1
gzip_disable 指定浏览器不压缩
gzip_min_length length; 响应报文大于这个值时启用压缩
gzipz_types ...; 指定对那些类型的资源进行压缩,默认包含text/html,所以不用写这两个类型
gzip_vary on | off; 压缩的提示字段 即是否显示”Vary: Accept-Encoding”,默认off
如有错误,敬请指正~~