概述
特性
- 模块化设计,较好的扩展性,动态加载。
- 高可用性
- 支持热部署,不停机更新配置文件,升级版本,更换日志文件。
- 低内存消耗,10k keep-alive连接在非活动模式下大概2.5M。
- 事件驱动模型,Aio,mmap,sendfile。
传统网络传输过程
硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈
- 系统调用 read()产生一个上下文切换:从 user mode 切换到 kernel mode,然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。
- 数据从 kernel buffer拷贝到 user buffer,然后系统调用 read() 返回,这时又产生一个上下文切换:从kernel mode 切换到 user mode。
- 系统调用write()产生一个上下文切换:从 user mode切换到 kernel mode,然后把步骤2读到 user buffer的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer和 socket相关联。
- 系统调用 write()返回,产生一个上下文切换:从 kernel mode 切换到 user mode ,然后 DMA 从 kernel buffer拷贝数据到协议栈。
开启sendfile后
硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈
- 系统调用sendfile()通过 DMA把硬盘数据拷贝到 kernel buffer,然后数据被 kernel直接拷贝到另外一个与 socket相关的 kernel buffer。这里没有 user mode和 kernel mode之间的切换,在 kernel中直接完成了从一个 buffer到另一个 buffer的拷贝。
- DMA 把数据从 kernelbuffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里。
- sendfile是个比 read 和 write 更高性能的系统接口,sendfile 是将 in_fd 的内容发送到 out_fd ,而 in_fd 不能是 socket ,也就是只能文件句柄。
- 当 Nginx 是一个静态文件服务器的时候,开启 SENDFILE 配置项能大大提高 Nginx 的性能。
- 是当 Nginx 是作为一个反向代理来使用的时候,SENDFILE 则没什么用了,因为 Nginx 是反向代理的时候。 in_fd 就不是文件句柄而是 socket,此时就不符合 sendfile 函数的参数要求了。
综上所述,sendfile只能接受句柄参数,不能接收socket文件,静态服务器时开启可以大幅度提升性能,反向代理时由于传输socket,就无需开启了。
Nginx基本功能
- 静态资源的web服务器,不支持模块方式php,仅支持安装php-fpm(Tcp:9000,FastCGI通信方式),Apache内部有支持php的模块。
- 反向代理服务器,后端搭建多个web服务器,由Nginx进行七层调度,比LVS功能强,但是性能弱,LVS理论并发400万,Nginx 3万。
- LNMP架构中,如果想访问动态资源,FastCGI作为服务端,Nginx作为客户端;结构应该为 客户端–>Nginx服务器–>php-fpm–>DB。
- uWSGI Django架构服务器,类似LNMP,PHP换成Python:客户端–>Nginx服务器–>(Django,通信方式为uWCGI)python–>DB。
- 动态加载卸载模块。
Web服务器功能
- 虚拟主机:vhosts,include.d。
- 支持keep-alive和管道链接。
- 访问日志(支持基于日志缓冲提高其性能)。
- url rewrite: 访问后重新导向到一个新地址。
- 路径别名:alias别名跳转到文件夹。
- IP与用户的访问控制,速度,并发链接数都可以控制。
- 重新配置和在线升级热操作。
- Memcached的GET接口。
Nginx架构
- Master启动并管理为数不多的worker(1C对应1worker,或者直接auto),worker不是开启很多线程,线程看不到的,而是只是各个进程进行IO多路复用。
- 各个worker内部包含不同的模块,完成例如http,fastcgi,memcache等功能。
- 提供Proxy-Cache功能,本地保留缓存,方便后续客户端进行访问,提高访问效率。
Nginx程序结构 - 都是进程没有线程,IO多路复用,一个worker接收多个请求。
- 模块分类:核心,标准,三方
- 核心模块: Core Module;标准模块: HttP模块(后端http服务器),Mail模块,Stream模块(可以调度数据库);三方模块
- 模块太多了,对经常使用的有了解即可。
Nginx的功用
- 静态的Web服务器,html, jpg, css, js, txt等静态资源都可以被访问。
- 结合FastCGI,uWSGI,SCGI等协议方向代理动态资源请求。
- TCP/UDP协议的请求转发。
- 反向代理,Nginx后端服务器看到的ip是Nginx的,而LVS后端服务器看到的是访问客户端的,等于LVS是透明的。
Nginx源码安装shell脚本
<>后续写出来,网上多了去了,我就懒得写了
Nginx安装
- epel-release源已经收录,安装完成后使用 nginx -V 可以看到红帽默认开启了 TLS SNI Support enabled:一台服务器支持多个https虚拟主机,
在Apache中,一台服务器只允许一个https虚拟主机。 - /etc/nginx/conf.d/.conf 支持多个虚拟主机,每个.conf文件中写一个server,在主配置文件/etc/nginx/nginx.conf里面都包含。
- 全局模块是处在http{…}之前的,http{}中包含很多server{…},每个server都用于定义一个虚拟主机。
Nginx全局配置
配置文件如下:
user nginx;
//安装nginx时候就创建了
worker_processes auto;
//多少个CPU对应多少个work进程,用auto即可
worker_rlimit_nofile 65535;
//这个一定要写,支持多少用户并发
# (worker_cpu_affinity auto) 或者直接根据CPU个数绑定
//CPU绑定,提高命中缓存几率,亲缘性
# 4c: (worker_cpu_affinity 0001 0010 0100 1000)
# 8c: (worker_cpu_affinity 00000001 00000010 ...)
# ps axo pid,cmd,psr |grep nginx
//查看当前worker都是绑定在哪个CPU上的
# worker_priority <num>;
//[-20,19],指定nice值,越小优先级越高
error_log /var/log/nginx/error.log;
//错误日志所在位置,可以发送到远程日志服务器上
//还可以定义日志级别 debug|info|notice|warn|error|crit|alert|emerg
pid /run/nginx.pid;
//pid所在文件夹
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
//使用include可供选择模块放在不同地方
# load_module <file>;
//具体加载哪个模块
# daemon on|off;
//nginx是否编程一个后台守护进程,默认就是on,
//如果off后再启动nginx就会卡在界面上,适合调试测试环境
# master process on|off;
//默认是on的,如果off,重启后只有一个nginx进程,不会出现master_worker多个进程
/*
这段没什么说的,文件打开最大用户数和最大进程数
vim /etc/security/limit.conf
#hard limit ,嚴格的設定,必定不能超過這個設定的數值;
#soft limit ,警告的設定,可以超過這個設定值,但是若超過則有警告訊息。
*
soft noproc
65535
*
hard noproc
65535
*
soft nofile
65535
*
hard nofile
65535
*/
events {
worker_connections 1024;
//每个worker支持的最大连接数,总数:worker_processes * worker_connections
use epoll;
//默认就是epoll,写不写都行
# accept_mutex on|off;
//默认on就好了,来了连接几个worker轮流处理,off的话则会惊群可能造成性能下降。
}
Nginx Http配置:
最重要的部分: ngx_http_core_module
一、 套接字相关配置:
server {
//这个可以定义在conf.d的文件夹下
listen [:PORT]PORT;
//监听地址和端口,default为 *:80,IP:PORT也可以,可以绑定具体ip或所有ip。
server_name SERVER_NAME;
//一般都是www.xx.com类似域名
location {
root /PATH/TO/HTML/LOCATION;
//可以写绝对路径,如果是相对路径要看default root是哪儿,yum安装/usr/share/nginx/html/为根目录
}
}
//root 对应路径下必须为 index.html,否则403 forbbiden
listen []
- PORT | IP:PORT | unix:<socket location> ,这几种格式都是支持的。
- default_server 为关键字,一般用在listen address后面,默认访问ip不加端口号,选择default server虚拟主机。
- ssl :限制仅能够通过ssl连接提供服务。
- backlog= :后援队列,超过session最大上限后,新请求进入后援队列的长度,例如并发2万连接,超过了5000连接则设置=6000,就是这个意思。
- rcvbuf= : 接收缓冲区大小,客户端访问nginx时候,也是先放入缓冲区队列等待;
sndbuf= : 发送缓冲区大小,nginx返回数据给客户端,也先放入缓冲区队列。
server_name []
- 支持通配符和正则表达式匹配:server_name ~ *.a.com,通过通配符可以判断只要域名解析成立,x.a.com的网站最后都会导向到初始www.a.com中。
- 不推荐匹配模式,消耗服务器资源,精确网站最好。
location [] 可以放在server {…}和location {…}
-
一定理解root定义在location外和location内的区别。
-
root: 这个没什么说的,网站路径,根目录确定好位置,可以放在location外,可以指向一个文件。
-
location /…
// location对应的部分为URL,一定要理解这句话,location /shit 的意思就是 http://<网址>/shit/ 这个路径。 -
理解root和location的关系:
location /shit { // URL:http://www.xx.com/shit/ 这个是URL拼接 root /data/damn // 真实路径 /data/damn/shit/<xx资源>,真实存在的东西 } // 如果访问 http://<网址>/shit/<xx资源> 这个路径, // 取得的资源是在 /data/damn/shit/<xx资源>,这时location外部的root定义时不生效的
-
location = /index.html {…} //精确匹配指向一个文件,只能访问 http://<网址>/ ,后面多一点东西都不算精确匹配, http://<网址>/xx就不对了。
-
location优先级问题,location优先级如果有匹配项,则比外部定义的root等级高,从高到低优先级 {= ^~ / /xx},也就是不带符号优先级最低*。
生产中一般不会弄得这么复杂,消耗CPU计算资源 Let’s illustrate the above by an example: location = / { //匹配优先级最高 [ configuration A ] } location / { //如果上面不匹配才轮到这儿,优先级最低 [ configuration B ] } location /documents/ { //比 / 更精确 [ configuration C ] } location ^~ /images/ { //左匹配比右匹配优先级高 [ configuration D ] } location ~* .(gif|jpg|jpeg)$ { //右匹配比不带任何符号的优先级高,即大于B,C [ configuration E ] } /* The “/” request will match configuration A, the “/index.html” request will match configuration B, the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, the “/documents/1.jpg” request will match configuration E. */
-
alias /xx 和 root /xx 区别
alias只能用于location中location /shit { root /xx //匹配 /xx/shit/下的资源 alias /xx //匹配 /xx下的资源,alias相当于覆盖 }
-
error页面,定义如下,这样可以定义自己的404页面
error_page 404 /404.html; location /404.html { root /data/a/error/; }
为了防止360浏览器劫持404页面,可以使用如下方案防止劫持页面:
error_page 404 =200 /404.html; //404依旧是404,但是对于浏览器响应头返回的是200,这样360就会认为这是个正常的页面,不会劫持了 location /404.html { root /data/a/error/; }
-
try_files xx xx xx XX: 按照顺序检查,如果前面n-1都不存在,那么返回最后的XX作为最后重定向手段。
二、 其他http{…}中的配置项
-
tcp_nodelay on|off :
keep alive模式下的连接是否启用TCP_NODELAY选项:可以用在server和location里面
off时延迟发送,合并多个请求后再发送; //对服务器压力小,但是扎堆发送影响客户体验
on时不延迟发送,来一个发一个。 //对服务器有消耗,但是客户体验好,一般开启。 -
sendfile on|off :
默认关闭,反向代理服务器可以不用配置此项;但是访问静态资源强烈建议开始,节省了从内核复制到用户空间再发送内核socketbuf的过程。 -
server_token on|off|build|string :
是否在响应报文的Server首部显示Nginx版本,server和location里面都可以使用
根据网络安全暴露nginx版本很不安全,容易让黑客找到版本对应漏洞进行攻击,所以推荐使用off,提高安全性。
商业版中可以此项为字符串,随便写一些字符串,例如京东网站,发现server名称为 JDWS,不是Nginx。 -
keepalive_timeout: 一般设置30秒,根据业务情况来。
-
keepalive_requests : 再一次长连接上所允许请求的资源最大数量。
-
keepalive_disable none|browser : 禁止哪一种浏览器长连接。
-
send_timeout <time>: 向客户端发送响应报文的超时时长。
-
client_body_buffer_size 128k:
接收客户端请求报文的body部分的缓冲区大小,默认16k,超过大小时,暂存磁盘
client_max_body_size 10M :
接收客户端请求报文body的最大值是10M;
client_body_temp_path 1 2 2;
client_body_temp_path后部文件夹由哈希值构成,每个文件都有一个哈希值运算,从后面取5位,按122比例分配,形成/1/2/2路径模式存放最终body部分的文件。
最后
以上就是高挑蜜蜂为你收集整理的Nginx基础架构和配置的全部内容,希望文章能够帮你解决Nginx基础架构和配置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复