设为首页 收藏本站
查看: 916|回复: 0

[经验分享] nginx作为http服务器常用模块

[复制链接]
发表于 2018-11-16 06:44:46 | 显示全部楼层 |阅读模式
1.nginx核心功能模块(Core functionality)
  accept_mutex on|off; #Context:events
  这个指令的意义:当一个新连接或者说用户请求到达nginx服务时,如果accept_mutex为on,
  那么多个worker将以串行方式来处理,其中一个worker会被激活,其他worker继续保持休眠状态,
  如果accept_mutex为off,那么所有的worker将会被唤醒,但只有一个worker会获取新连接,其他worker会重新休眠。
  这可以算是惊群问题吧。当网站并发量很大时,可以设置为off,
  error_log
  错误日志文件路径,错误记录等级,等级从低到高为debug, info, notice, warn, error, crit, alert, emerg
  例:error_log /var/log/nginx/error.log warn;
  events
  用来指定nginx的工作模式及连接数上限
  

例:events {  
use epoll; #使用epoll I/O传输模型
  
worker_connections 1024; #每个worker允许的最大用户请求数
  
}
  

  worker_connections #Context:events
  每一个worker进程能并发处理(发起)的最大连接数,并不是越大越好
  需要深入理解的优化选项
  worker_cpu_affinity
  将worker进程固定在指定的CPU(或核心)中,因为nginx默认是随机分配cpu(或核心)的,
  此设置可将nginx进程固定在指定的CPU(或核心)上,以加快处理速度降低出错率。
  

例:worker_processes 4;  
worker_cpu_affinity 0001 0010 0100 1000;
  

  worker_priority
  让worker以指定nice值工作,-20~19 nice值越高就会优先获取CPU资源;
  nginx默认状态下的nice值为0
  worker_processes
  设置nginx的work process的数量,推荐设置为等于或略小于CPU的核心数,
  因为若设置为大于CPU的核心数时会产生拥挤,范围会影响性能,若设置成auto,默认数量为CPU的核心数
  include file | mask;
  将指定的文件包含在配置中,nginx运行时会自动加载
  

例:include vhost/*.conf  

  master_process on | off;
  确认master process的开启状态。
  multi_accept on | off; #Context:events
  当multi_accept为on时,所有的新连接情求将同时被worker process同时接收处理,
  当multi_accept为off时,worker process一次只接收处理一个新连接
  默认为off
  pid
  设置nginx主进程ID文件位置
  

例:pid log/nginx.pid;  

  use
  设置进程连接的方式。值得注意的是此项一般不做设置,因为nginx会自动选择最适合系统的方式。
  There is normally no need to specify it explicitly, because nginx will by default use the most efficient method.
  user
  指定nginx主进程的用户及组

2.http核心功能模块(ngx_http_core_module)
  alias #Context:location
  alias表示路径别名,alias后面接路径,也就是用户访问的真正路径,一般用在location环境下
  

例:location /i/ {  
alias /data/w3/images/; #一定要记得结尾加/
  
}
  

  当用户请求为路径URI/i/时,实际访问的是URI/data/w3/images/

  此处可深入对比root与alias的区别:
  1.root指定的是location匹配访问的path目录的上一级目录,也可以理解为location匹配访问的起始根目录
  2.alias指定的是location匹配访问的path目录的真正目录路径,而location后是path目录别名
  3.对于root来说,location后的path目录必须真实存在
  4.对于alias来说,location后的path目录可以不存在
  5.alias只能用在location中,而root可用在 http,server,location,if in location中
  6.有网友建议
  1)在location /中配置root目录;
  2)在location /path中配置alias虚拟目录。

  listen #Context:server
  设置监听IP的地址和端口,一般只需设置ip和端口
  

例:  
listen 127.0.0.1:8000;
  
listen 127.0.0.1;
  
listen 8000;
  
listen *:8000;
  
listen localhost:8000;
  

  扩展设置:listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
  default_server:设定为默认虚拟主机;
  ssl:限制仅能够通过ssl连接提供服务;
  backlog=number:后援队列长度;
  rcvbuf=size:接收缓冲区大小;
  sndbuf=size:发送缓冲区大小;

  server #Context:http
  用来定义虚拟主机,格式为server { … }
  server_name #Context:server
  设置虚拟主机的主机名,可使用正则表达式进行匹配
  

例:server {  
server_name ~^(www\.)?(.+)$;
  
index index.php index.html;
  
root /nginx/$2;
  
}
  

  这里用到了正则表达式后向引用的知识,可以实现在一个server中配置多个站点,
  当输入站点www.fff.com时对应站点的主目录为/nginx/fff.com目录
  当输入站点www.ddd.org时对应站点的主目录为/nginx/ddd.com目录
  目录必须存在

  tcp_nodelay on|off; #Context:http, server, location
  只在keepalived下开启有效,长连接时不做报文打包发送,不产生延迟(delay)
  tcp_nopush on|off; #Context:http, server, location
  在 nginx 中,tcp_nopush 配置和 tcp_nodelay “互斥”。它可以配置一次发送数据的包大小。也就是说,它不是按时间累计 0.2 秒后发送包,而是当包累计到一定大小后就发送。
  在 nginx 中,tcp_nopush 必须和 sendfile 搭配使用。

  有一点不明白,tcp_nopush和tcp_nodelay为何是互斥却可以在实例中同时为on

  sendfile #Context:http, server, location, if in location
  此选项可提高web服务器的传输性能,不使用sendfile的传统网络传输:
  read(file,tmp_buf, len);
  write(socket,tmp_buf, len);
  硬盘 –> kernel buffer –> user buffer –> kernel socket buffer –> 协议栈
  使用sendfile的网络传输:
  sendfile(socket,file, len);
  硬盘 –> kernel buffer (快速拷贝到kernelsocket buffer) –> 协议栈
  sendfile省去了很多中间过程,从而提高了传输速度
  keepalive_timeout
  keepalive的超时时间
  

例:keepalive 75s;  

  root #Context:http, server, location, if in location
  设置站点的根目录
  location #Context: server, location
  根据用户请求的URI做访问逻辑的设置,location下的root比server下的root有更高的优先权?
  

例:  
location = / {
  
[ configuration A ]
  
}
  

  
location / {
  
[ configuration B ]
  
}
  

  
location /documents/ {
  
[ configuration C ]
  
}
  

  
location ^~ /images/ {
  
[ configuration D ]
  
}
  

  
location ~* \.(gif|jpg|jpeg)$ {
  
[ configuration E ]
  
}
  

  error_page #Context:http, server, location, if in location
  设置当用户请求发生错误时nginx反馈给用户错误显示的URI
  设置方法有多种:
  例:1. error_page 502 503 /50x.html; #当访问出现502 503错误时,就向用户反馈50x.html的内容
  2. error_page 502 503 =200 /50x.html; #当访问出现502 503时,向用户反馈状态码为200,并反馈50x.html的内容50x.html可替换为其他内容,如jpg,gif,php文件
  3. error_page 404 = http://www.baidu.com; #当访问出现404错误时,将用户请求跳转至百度主页
  

4. location / {  
error_page 404 = @fallback;
  
}
  

  
location @fallback {
  
proxy_pass http://backend;
  
}
  

  keepalive_timeout
  设置长连接的超时时间,设置0时表示关闭长连接,默认为75s
  

例:keepalive_timeout 40s;  

  keepalive_disable none | browser …;
  设置禁止长连接的浏览器
  keepalive_requests
  设置一次长连接允许的最大请求数,默认为100
  client_body_buffer_size # Context:http, server, location
  body是指报文的主体部分,此选项用于设置接收客户端请求报文的body部分的缓冲区大小,
  默认为16k,一旦超过设置的值,便会发起磁盘I/O,影响站点性能,
  只有在允许用户请求或上传大于16k数据时,才有必要调整此项,
  但当用户上传数据大到不得不直接储存在磁盘上时则需使用client_body_temp_path
  client_body_temp_path # Context:http, server, location
  这里涉及到了当用户较多且用户存放文件较多时,各用户如何快速准确的找到各自存放在站点的文件的问题。
  此选项可设置文件分级存放,
  

例:client_body_temp_path /var/tmp/client_body 2 1 1  
#用户存放主目录为/var/tmp/client_body 创建16*16个一级子目录,
  
每个一级子目录下创建16个二级子目录,每个二级子目录下创建16个三级子目录
  
这是一种算法机制,为用户访问磁盘数据时提供一种快捷的路径路由机制
  

  aio on|off
  aio是指异步非阻塞IO模型,在nginx第一讲中有详细介绍
  open_file_cache Context:http, server, location
  用于设置服务器访问频率较高文件的元数据缓存,将访问频率较高的文件缓存至内存中,
  当用户访问时不需要再进行磁盘查找,可直接根据文件的元数据找到文件进行下一步操作,
  大大提升了用户访问效率。
  

例:open_file_cache off;  
open_file_cache max=1000 inactive=20s; #最大缓存1000个缓存项 缓存项的非活动时长20s,受open_file_cache_min_uses选项的影响,在设定时间内访问命中数少于open_file_cache_min_uses设置数时,缓存将被清理
  

  open_file_cache_uses
  参照open_file_cache
  

例:open_file_cache max=1000 inactive=20s;  
open_file_cache_valid 30s;
  
open_file_cache_min_uses 2;
  
open_file_cache_error on; #是否缓存查找时发生错误的文件信息的
  

3.基于IP的访问控制模块(ngx_http_access_module)
  allow
  允许访问
  deny
  拒绝访问
  

例:location / {  
deny 192.168.1.1;
  
allow 192.168.1.0/24;
  
allow 10.1.1.0/16;
  
allow 2001:0db8::/32;
  
deny all; }
  

4.基于用户登录的访问控制模块(ngx_http_auth_basic_module)
  auth_basic #Context:http, server, location, limit_except
  反馈给用户的服务器认证信息,必须与auth_basic_user_file配合使用
  auth_basic_user_file
  设置用户认证文件的路径,配置用户认证的用户名与密码可用httpd-tools来实现
  yum -y install httpd-tools #安装httpd-tools
  htpasswd -c -m /etc/nginx/.ngxpwd ready #指定密码文件路径与文件名,用户名为ready
  

例:server {  
server_name www.hhh.com;
  
root /nginx/test2/;
  
location ~* ^/(login|admin) {
  
#alias /admin/; #为何加此项会访问不成功,改为location /login/却会访问成功?
  
auth_basic “why?”;
  
auth_basic_user_file /etc/nginx/.ngxpwd;
  
} #root路径下用户请求以admin或login开头时,都会出现用户认证
  

5.nginx访问状态模块(ngx_http_stub_status_module) }
  stub_status
  可以查看nginx的状态信息,此信息一定要保密,可单独创建一个location再配合auth_basic_user_file与auth_basic使用
  

例:  
location /abc {
  
stub_status;
  
auth_basic “why?”;
  
auth_basic_user_file /etc/nginx/.ngxpwd;
  
}
  

  输出示例:
  Active connections: 3 #当前的活动链接数
  server accepts handled requests #accept已经接受的用户请求数,handled已经处理完成的用户请求数,requests总请求数
  303 303 2533
  Reading: 0 Writing: 1 Waiting: 2 #Reading:处于读取客户端请求报文首部的连接的连接数;
  #Writing:处于向客户端发送响应报文过程中的连接数;
  #Waiting:处于等待客户端发出请求的空闲连接数

6.nginx访问日志模块(ngx_http_log_module)
  access_log #Context:http, server, location, if in location, limit_except
  设置访问日志路径,可在全局设置,也可在server,location等中做精细设置,便于不同主机的访问精细管理
  也可压缩打包处理
  

例:access_log /path/to/log.gz combined gzip buffer=16k flush=5m;buffer可设置访问日志的缓冲区大小,flush为刷新周期  

  

  log_format
  定义访问日志的格式
  

例:log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘  
‘$status $body_bytes_sent “$http_referer” ‘
  
‘”$http_user_agent” “$http_x_forwarded_for”‘;
  

7.ngx_http_gzip_module
  nginx中gzip的主要作用就是用来减轻服务器的带宽问题,经过gzip压缩后的页面大小可以变为原来的30%甚至更小,
  这样用户浏览页面时的速度会快很多。gzip的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,
  传到浏览器后浏览器解压缩并解析。目前的大多数浏览器都支持解析gzip压缩过的页面。默认为off
  

例:gzip on;  
gzip_comp_level 2; #压缩等级,默认为1
  
gzip_min_length 1000; #启用压缩功能的临界值
  
gzip_proxied expired no-cache no-store private auth;
  
gzip_types text/plain application/xml;
  

8.https服务模块(ngx_http_ssl_module)
  ssl on | off;
  开启/关闭ssl服务
  

例:  
server {
  
listen 443 ssl;
  
server_name www.hhh.com;
  
root /nginx/test2/;
  
access_log /var/log/nginx/ssl_access.log main;
  

  
ssl on;
  
ssl_certificate /etc/pki/nginx/server.crt; #证书存放路径
  
ssl_certificate_key /etc/pki/nginx/private/server.key; #私钥存放路径
  
ssl_session_cache shared:SSL:1m; #在各worker之间启用大小为1m的共享缓存,可提高缓存利用率,1m可缓存4000个回话
  
ssl_protocols sslv3 TLSv1 tlsv1.1 tlsv1.2; #设置支持的ssl协议
  
ssl_session_timeout 10m; #设置共享缓存的超时时间
  

9.nginx URL重写模块,rewrite模块(ngx_http_rewrite_module)
  根据用户请求的URL按一定规则进行重新替换或定向,使用户请求跳转至规则定制的URL
  

例:server {  
server_name www.fff.com;
  
location /alais/ {
  
alias /nginx/ta/;
  
index index.html index.htm;
  
rewrite /(.*)\.png$ http://www.fff.com/$1.jpg; #将用户输入以.png结尾的请求全部替换为.jpg结尾的请求
  
rewrite /(.*)$ https://www.fff.com/$1; #将用户请求全部重写为https协议并返回请求
  
}
  
}
  

  rewrite规则默认会自上而下一次匹配执行,当第一条rewrite执行后,会将新URL再重新在location中检查一遍,直到没有匹配的rewrite,
  这样可能会产生死循环,因为rewrite结尾默认有一个last标识,也可在结尾改为其他标识实现不提功能
  1.last #只要有新URL就会使用此标识结尾的规则检查一次
  2.break #检查若匹配就执行并不再执行后面的rewrite规则
  3.redirect #反馈给用户302响应码并将新定向的URL,让客户端自己请求新定向的URL
  4.permanent #与redirect不同的是,permanent是永久重定向

10.防盗链模块(ngx_http_referer_module)

  再打开某些网站时,会出现类似”此图片仅允许xx网内部使用”的图片提示,这就是基于此模块来实现防盗链的一种方法
  valid_referers none | blocked | server_names | string …;
  定义referer首部的合法可用值;

  none:请求报文首部没有referer首部;
  blocked:请求报文的referer首部没有值;
  server_names:参数,其可以有值作为主机名或主机名模式;
  arbitrary_string:直接字符串,但可使用作通配符;
  regular expression:被指定的正则表达式模式匹配到的字符串;要使用~打头,例如 ~..magedu.com;
  

例:  
valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.;
  

  
if($invalid_referer) {
  
return http://www.magedu.com/invalid.jpg;



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-635516-1-1.html 上篇帖子: nginx七层负载均衡 下篇帖子: nginx部署安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表