zj2092 发表于 2018-11-13 08:15:00

Nginx服务简介

  Nginx概述
  Nginx (engine x) 是一个高性能的http和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
  社区版和商业版两个版本,官网地址为http://www.nginx.org/
  特性:
  模块化设计,较好的扩展性
  高可靠性
  支持热部署:不停机更新配置文件,升级版本,更换日志文件
  低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需要2.5M内存
  event-driven,aio,mmap,sendfile
  基本功能:
  静态资源的web服务器
  http协议反向代理服务器
  pop3/imap4协议反向代理服务器
  FastCGI(lnmp),uWSGI(python)等协议
  模块化(非DSO),如zip,SSL模块
  web服务相关的功能:
  虚拟主机(server)
  支持keep-alive 和管道连接
  访问日志(支持基于日志缓冲提高其性能)
  url rewirte
  路径别名
  基于IP及用户的访问控制
  支持速率限制及并发数限制
  重新配置和在线升级而无须中断客户的工作进程
  Memcached的GET 接口
  Nginx架构

  nginx的程序架构:
  master/worker结构
  一个master进程:
  负载加载和分析配置文件、管理worker进程、平滑升级
  一个或多个worker进程
  处理并响应用户请求
  缓存相关的进程:
  cache loader:载入缓存对象
  cache manager:管理缓存对象
  Nginx的工作流程大致如下:
  1.Nginx启动后,会产生一个主进程,主进程执行一系列的工作后会产生多个工作进程;
  2.在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行数据处理和组织;
  3.Nginx为了提高对请求的响应效率,降低网络压力,采用了缓存机制,将历史应答数据缓存到本地。保障对缓存文件的快速访问;
  ##工作进程##
  工作进程的主要工作有以下几项:
  接收客户端请求;
  将请求依次送入各个功能模块进行过滤处理;
  IO调用,获取响应数据;
  与后端服务器通信,接收后端服务器处理结果;
  数据缓存
  响应客户端请求;
  Nginx模块
  nginx高度模块化,1.9.11版本后开始支持动态装载、卸载,主要包含下述模块:
  核心模块 core module
  标准模块 http、mail、stream
  第三方模块
  Nginx配置
  nginx配置文件中包含几段:
  主配置段
  http配置段
  mail配置段
  stream配置段
  不同的配置参数需要用在不同的配置段,不能乱用
  使用rpm包管理器安装nginx
yum -y installnginx  主配置段,程序正常运行必须配置的字段
vim /etc/nginx/nginx.conf  user nginx; #master进程是以root身份运行,worker进程是以nginx的身份运行
  worker_processes auto; #worker进程的数量;通常应该为当前主机的cpu的物理核心数
  error_log /var/log/nginx/error.log; #服务错误日志的存放路径
pid /run/nginx.pid; #服务的进程id  include /usr/share/nginx/modules/*.conf;
  #与此处的配置等效的模块的配置文件存放路径
  events {
  worker_connections 1024;
  }
  #事件驱动,每个worker进程能够并发打开的最大连接数量,1024是默认值
  #所有配置行必须以分号结尾
  http配置段
  ngx_http_core_module模块
  include /etc/nginx/conf.d/*.conf; #在此路径下以conf结尾的配置文件具有同等效果
  server {
  …………
  }
  #虚拟主机可以在此处配置
  #一些模块参数的配置可以在server中,也可以在http中,还有的必须在二者中的一个
  listen       80 default_server; #开启http服务时i监听的端口,可以指定ip地址
  server_name www.a.com ;#可以指定域名,支持通配符和正则表达式
  server_tokens on ; #隐藏nginx的版本信息
  root /app/website1; #定义此虚拟主机的主页面路径
  location #在server中定义,用于实现uri到文件系统的映射,例子如下:
  server {
  server_name www.a.com;
  location /images/ {
  root /data/imgs/;
  }
  }
  #当访问http://www.a.com/images/logo.jpg时跳转到-->/data/imgs/images/logo.jpg
  #location也支持正则表达式
  alias #在location中定义路径别名,与root的区别,看下面例子:
  server {...
  server_name www.a.com;
  location /images/ {
  alias /data/imgs/;
  }
  }
  #当访问http://www.a.com/images/logo.jpg时跳转到-->/data/imgs/logo.jpg
  #注意区分root与alias
  ngx_http_access_module模块
  此模块实现基于ip地址的访问控制
  location / {
deny 192.168.1.1;  allow 192.168.1.0/24;
  allow 10.1.1.0/16;
  allow 2001:0db8::/32;
  deny all;
  }
  #支持ipv4和ipv6协议
  #自上而下匹配,命中后就不会再匹配下一条策略
  #相对apache,nginx的访问控制还是很好理解的
  ngx_http_auth_basic_module模块
auth_basic string ;  auth_basic_user_file file;
  location /admin/ {
  auth_basic"Admin Area"; #认证窗口的提示信息
  auth_basic_user_file /etc/nginx/.ngxpasswd; #存放认证账户的文件,可以使用httpd-tools包中的passwd工具生成认证用户
  }
  #实现基于用户的访问控制,使用basic机制进行用户认证
  ngx_http_gzip_module模块
gzip on; #开启gzip压缩功能  gzip_comp_level 6; #压缩比,默认是1,范围是1-9
  gzip_min_length 64; #最小达到64字节的文件才能够被压缩
  gzip_proxied off;对被代理的请求不启用压缩
  gzip_types text/xml text/css application/javascript;
  #对何种文件类型进行压缩
  ngx_http_ssl_module模块
  提供https加密
  例子:
  server {
  listen 443 ssl; #必须明确指出监听的端口
  server_name www.a.com;
  root /vhosts/ssl/htdocs;
  ssl on;
  ssl_certificate/etc/nginx/ssl/nginx.crt; #证书文件
  ssl_certificate_key/etc/nginx/ssl/nginx.key; #私钥文件
  ssl_session_cache shared:sslcache:20m; #各个worker进程之间共享ssl会话的内存
  ssl_session_timeout10m;
  }
  ngx_http_rewrite_module重写模块
  将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换
  rewrite regex replacement
  #将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI
  return 状态码 url;
  #停止处理,并返回给客户端指定的响应码
  rewrite_log on;
  #是否开启重写日志, 发送至error_log(notice level)
  ngx_http_referer_module模块
  定义referer首部的合法可用值,不能匹配的将是非法值,可以防盗链
  例子:
  valid_referers www.a.com ;
  if ($invalid_referer) {
  return 403;
  }
  #定义www.a.com为有效值
  #防盗链原理:当非www.a.com要盗用本站的图片等信息,由于不在valid_referers中定义,则会被拒绝并返回403拒绝
  ngx_http_proxy_module模块
  代理服务器,目标主机收到信息后认为源就是代理机器,而不是真正的客户端
  server {
server_name HOSTNAME;  location /uri/ {
  proxy_pass
http://host/new_uri/; #有/和没有/是有很大区别的  }
  }
  #proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri
  #当proxy_pass 后的链接地址末尾有/时,访问http://HOSTNAME/uri/时,实际转发到http://host/new_uri/
  #当proxy_pass 后的链接地址末尾没有/时,访问http://HOSTNAME/uri/时,实际转发到http://host/new_uri/uri/
  在http配置定义缓存信息
  proxy_cache_path /var/cache/nginx/proxy_cache #定义代理机器上的缓存存放的路径
  levels=1:1:1
  #对请求的url进行hash运算得出128位数字(16进制),取出最后三位数字,组成一级、二级、三级缓存目录
  #当客户再次请求此资源时,代理服务器就会从这些缓存目录中快速找到请求资源
  keys_zone=proxycache:20m #定义缓存名称供以后被调用,并定义缓存大小不能超过20m
  inactive=120s#120秒缓存资源未被再次访问则删除此资源
  max_size=1g; #硬盘能存储最多的有关缓存hash信息的容量
  调用缓存功能,需要定义在相应的配置段,如server{...};
  proxy_cache proxycache; #调用在http配置段定义的代理缓存名称
  proxy_cache_valid 200 302 301 1h; #定义对特定响应码的响应内容的缓存时长
  ngx_http_fastcgi_module模块
  php独立模块,前提在后端服务器先配置fpm server和mariadb-server
  在前端nginx代理服务器上配置示例:
  location ~* \.php$ {#凡是请求php结尾的文件都会匹配location的内容
  fastcgi_pass 后端fpm服务器IP:9000; #fastcgi-fpm是一种服务,其监听端口是9000
  fastcgi_index index.php; #fpm服务的默认主页面
  fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
  include fastcgi_params;
  #设置传递给FastCGI服务器的参数值,可以是文本,变量或组合
  }
  fastcgi缓存,与proxy_cache的功能类似,不再赘述
  例子:
  http {
  fastcgi_cache_path /var/cache/nginx/fcgi_cache levels=1:2:1 keys_zone=fcgicache:20m inactive=120s;
  #此处关于fastcgi缓存的配置与proxy_cache含义是一样的
  ...
  server {
  location ~* \.php$ {
  ...
  fastcgi_cache fcgicache;
  fastcgi_cache_key $request_uri;
  fastcgi_cache_valid 200 302 10m;
  fastcgi_cache_valid 301 1h;
  fastcgi_cache_valid any 1m; #其他状态码默认缓存1分钟
  ...
  }
  }
  ngx_http_upstream_module模块
  用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用
  定义后端服务器组,会引入一个新的上下文,在http配置段,默认调度算法是wrr
  upstream httpdsrvs{
  server x.x.x.x weight=m;
  server x.x.x.x weight=n;
  }
  定义nginx代理服务器
  location / {
  proxy_pass http://httpdsrvs; #调用http配置段定义的后端服务器组
  }

页: [1]
查看完整版本: Nginx服务简介