Linux学习-Nginx学习

Posted 丢爸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习-Nginx学习相关的知识,希望对你有一定的参考价值。

HTTP:HyperText Transfer Protocol(超文本传输协议)
html:HyperText Markup Language(超文本标记语言)
MIME:Multipurpose Internet Mail Extension(多用途互联网邮件扩展)

  • major/minor
  • text/plain
  • text/html
    URL:Uniform Resource Locator(统一资源定位符)
  • schema://server[:port]/path/to/source
http事务

request<-------->response

  • request


    空白行
  • response


    空白行

协议格式:文本、二进制

method
  • GET
  • POST
  • HEAD
  • DELETE
  • PUT
  • TRACE
  • OPTIONS
status
  • 1xx:信息类
  • 2xx:成功类,200
  • 3xx:重定向,301,302,304
  • 4xx:客户端错误,401,403,404
  • 5xx:服务器内部错误,500,502
header
  • 通用首部
  • 请求首部
  • If-Modified-Since
  • If-None-Match
  • 响应首部
  • 实体首部
Web页面
  • PV(Page View)入口请求算一个PV
  • UV(User View)独立IP算一个UV
认证
  • 基于IP认证
  • 基于用户认证
  • basic
  • digest
I/O类型
  • 同步(synchronous)和异步(asynchronous)
    关注的是消息通知机制
    同步:调用发出后,不会立即返回,但一旦返回,则返回即是最终结果
    异步:调用发出后,被调用方立即返回消息,但返回的并非最终结果,被调用者通过状态、通知机制等来通知调用者,或通过回调函数来处理结果
  • 阻塞(block)和非阻塞(nonblock)
    关注的是调用者等待被调用者调用结果时的状态
    阻塞:调用结果返回之前,调用者会被挂起,调用都只有在得到调用结果之后才能继续
    非阻塞:调用者在结果返回之前不会被挂起,调用不会阻塞调用者
I/O模型
  • 阻塞式IO(blocking IO)
  • 非阻塞IO(nonblocking IO)
  • IO多路利用(IO multiplexing)
  • 信号驱动IO(signal driven IO)
  • 异步IO(asynchronous IO)
nginx特性
  • 模块化设计,较好的扩展性
  • 高可靠
  • 一个主进程master,
  • 不负责响应任何nginx请求
  • 负责生成worker进程和删除worker进程
  • 解析配置文件,无需重启,让配置文件中内容重新加载,完成平滑版本升级
  • 创建关闭套接字
  • worker
  • cache manager缓存管理
  • 低内存消耗(10000万个keep-alive模式下的conn仅需要2.5M内存)
  • 支持热部署(不停机更新配置文件,日志文件滚动,升级程序版本)
  • 支持事件驱动,AIO,mmap
Nginx基本功能

静态的web服务器,能缓存打开的文件描述符
支持http,smtp,pop3协议的反向代理服务器
缓存加速、负载均衡
支持FastCGI(fpm,LNMP),uWSGI(Python)
模块化(非DSO机制)、过滤器zip、SSI及图像大小调整
支持SSL

Nginx扩展功能
  • 基于名称和IP的虚拟主机
  • 支持keepalive
  • 支持平滑升级
  • 定制访问日志、支持使用日志缓冲区提供日志存储性能
  • 支持URL Rewrite
  • 支持路径别名
  • 支持基于IP及用户的访问控制
  • 支持速率限制,支持并发数限制
Nginx基本架构

一个master进程,生成1个或多个worker进程
事件驱动:epoll(边缘触发)、kqueue(BSD),/dev/poll(Sorials)
复用器:select ,poll,rt signal
支持Sendfile,sendfile64
支持AIO
支持mmap

Nignx工作模式

非阻塞、事件驱动、由一个master进程生成多个worker进程,每个worker响应n个请求

Nginx模块类型
  • 核心模块(core modules)
  • 标准HTTP模块(Standard http modules)
  • 可选HTTP模块(Optional http modules)
  • 邮件模块(Mail Modules)
  • 第三方模块
Nginx配置文件

main配置段:全局配置段
event:定义event模型工作特性
http:定义http协议相关的配置
配置指令:以;结尾
directive value1 [value2…];
支持使用变量
内置变量:模块会提供内置变量定义
自定义变量:set var_name value

main配置段

  • 用于调试、定位问题
  • 正常运行必备的配置
  • 优化性能的配置
  • 事件相关的配置

main配置段正常运行的必备配置

  • user USERNAME [GROUPNAME] :用于指定运行worker进程的用户和组
  • pid /path/to/pid_file :指定nginx守护进程的pid文件
  • worker_rlimit_nofile #:指定所有woker进程能打开的最大文件句柄数
  • worker_rlimit_core #:指定所有woker进程能打开的最大核心文件大小,一般不用调整
    性能优化相关配置
  • worker_processes #:worker进程的个数,通常少于CPU物理核心数,支持auto
  • worker_cpu_affinity cpumask …:用于绑定CPU核心,提升缓存命中率,无法避免进程切换【进程切换CPU会产生不必要的消耗】,cpumask: 0000 0000 0000 0001 0000 0010,如worker_cpu_affinity 00000001 00000010 00000100,可以使用auto
  • timer_resolution interval:计时器解析度:降低此值,可减少gettimeofday()
  • worker_priority #:指定worker进程nice值(优先级),[-20,19],nice值越小,优先级越高
    事件相关配置
  • accept_mutex on|off:master调度用户请求至各woker进程时使用的负载均衡锁,on表示让多个woker轮流,序列化响应用户请求。
  • lock_file file:accept_mutex锁文件路径
  • use [epoll|rtsig|select|poll]:指明使用的事件模型,建议nginx自行选择
  • work_connections #:设置一个worker进程能接受的最大并发连接数
    用于调试、定位问题
  • daemon [on|off]:是否以守护进程方式运行nginx,调试时设置为off
  • master_process [on|off]:是否以master/worker模型来运行nginx,调试时可设置为off
  • error_log file [level]:错误日志记录位置,若使用debug级别,需要编译nginx时打开–with-debug选项

新修改配置生效的方式:/usr/local/nginx/sbib/nginx -s reload
Nginx作为web服务器使用配置

http :由ngx_http_core_module模块所引入,位于ngx_http_core_module下
配置框架
http 
  upstream 
   ...
   
   server 
     location URL
         root /path/to/source
      ...
      #类似于httpd中的<location>,用于定义URL与本地文件系统的映射关系
     location URL 
         if ...
          
     
   ...
    #每个server类似于httpd中的一个<VirtualHost>

注:与http相关的指令仅能够放置于http,server,location,upstream,if上下文
  • server :定义一个虚拟主机,位于ngx_http_core_module下
#在http标签里添加server配置,定义基于端口的虚拟主机
server 
     listen 8080;
     server_name www.tye.com;
     root /vhosts/web1;
    
[root@nginx01 ~]# mkdir -p /webdata/web1
#创建网页文件
[root@nginx01 ~]# cat /webdata/web1/index.html
<h1>tye web site!!!</h1>
#访问刚创建的页面
[root@nginx01 ~]# curl www.tye.com:8080
<h1>tye web site!!!</h1>
  • listen #:指定监听的地址和端口,位于ngx_http_core_module下
listen address [:port]
listen port
  • server_name NAME[…]:后可跟多个主机,名称还可以使用正则表达式(~)或通配符
#-----------匹配规则-------------
#1.先做精确匹配检查
#2.左侧通配符匹配检查:*.tye.com
#3.右侧通配符匹配检查:mail.*
#4.正则表达式匹配检查:如~^.*\\.tye\\.com$
#5.default_server
#-----------匹配规则-------------
server 
  server_name www.tye.com;

server 
  server_name *.tye.com;

  • root path:设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径,位于ngx_http_core_module下
  • location [ = | ~ | ~* | ^~ ] uri … :允许根据用户请求的URI来匹配定义的各location,匹配时,此请求被相应的location配置模块中的配置所处理,如访问控制等功能,位于ngx_http_core_module下
# = 表示精确匹配检查
# ~ 正则表达式模式匹配检查,区分字符大小写
# ~* 正则表达式模式匹配检查,不区分大小写
# ^~:URI的前半部分匹配,不支持正则表达式
#匹配优先级:精确匹配(=)-->(^~)-->(~)-->(~*)-->(不带任何符号的location)

server 
  listen 80;
  server_name www.tye.com;
  location / 
    root /webdata/web1;
  
  location /image/ 
    root /webdata/image;
  
  location ~* .php$ 
    fcgipass:
  

  • alias path:用于location中,定义路径别名,位于ngx_http_core_module下
#注:root表明路径为对应的locaiton "/" URL;alias表示路径映射,即location指令后定义的URL是相对于alias指明的路径而言
location /images/ 
  root "/webdata/web1"

http://localhost/images/a.jpg      <--------/webdata/web1/images/a.jpg
location /images/ 
   alias "/webdata/web1"

http://localhost/images/a.jpg      <--------/webdata/web1/a.jpg
  • index file:定义默认主页,ngx_http_index_module
  • error_page code … [=[response]] uri:根据http响应状态码来指明特定的错误页面,,位于ngx_http_core_module下
#定义错误页面,并将响应码定义为200,当用户访问页面出错时,响应码将返回200而不是404
error_page  404 =200              /404.html;
  • 基于IP的访问控制【allow|deny】
#allow IP/network
#deny IP/network
location / 
            root html;
            deny 127.0.0.1;
        
  • 基于用户的访问控制
#auth_basic
#auth_basic_user_file,建议使用htpasswd生成
location / 
            root html;
            #deny 127.0.0.1;
            auth_basic "Only For VIP";
            auth_basic_user_file /etc/nginx/users/.htpasswd;
        
[root@nginx01 ~]# htpasswd -c -m /etc/nginx/users/.htpasswd tye
New password: 
Re-type new password: 
Adding password for user tye
[root@nginx01 ~]# cat /etc/nginx/users/.htpasswd
tye:$apr1$JX0ejwHf$806WngIYz.uRGt3qIzW.o1

#----测试
[root@nginx01 ~]# curl localhost/tye.txt
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.21.6</center>
</body>
</html>
[root@nginx01 ~]# curl -utye:123456 localhost/tye.txt
/tye.txt
#----测试

以上是关于Linux学习-Nginx学习的主要内容,如果未能解决你的问题,请参考以下文章

2016-1-30 linux基础学习4

HTTP——学习笔记

Linux学习笔记十二周四次课(4月26日)

Linux学习系列--vivim编辑器的使用命令

Linux学习-Nginx学习实现https

nginx学习1:Linux安装nginx