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

[经验分享] Nginx(一):静态资源web服务器配置详解

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-2-22 08:35:07 | 显示全部楼层 |阅读模式
一、Nginx概述

1.Nginx简介
          解决基于进程模型产生的C10k问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万现状。2006年俄罗斯编写。全称为engine X,缩减合并称为nginx。  官方站点:http://nginx.org/。 2013年发出企业版Nginx Plus
          二次发行版:tengine, OpenResty… …

  2.Nginx的特性
       1) 模块化设计、较好扩展性;早期不支持模块的动态装卸载
       2) 高可靠性:基于master/worker模式
master:负责启动服务,分析配置文件,父子启动子进程和worker进程
worker:真正响应用户请求进程
       3) 支持热部署(平滑迁移):不停机更新配置文件、更换日志、更新服务器程序版本;
       4) 内存消耗低:10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存;
       5) 支持event-driven事件驱动模型, aio一步驱动机制, mmap内存映射;

  3.Nginx基本功能
       1) 静态资源的web服务器;
       2) http协议的反向代理服务器;
       3) pop3, smpt,imap4等邮件协议的反向代理;
       4) 能缓存打开的文件(元数据:文件的描述符等等信息)
       5) 支持FastCGI(php-fpm), uWSGI(Python WebFramwork)等协议机制,实现代理后端应用程序交互
       6) 高度模块化(非DSO机制)
       模块类型:
core module
核心公用模块
Standard HTTP  modules
标准(核心)HTTP模块;自动编译进程序不止一个
Optional HTTP  modules
可选HTTP模块
Mail modules
邮件模块
3rd party modules
第三方模块,在编译时需手动指明加载方式加载
       7) 支持过滤器,例如zip,SSI
       8) 支持SSL加密机制;
       9) web服务相关的功能:虚拟主机(server)、keepalive、访问日志(支持基于日志缓冲提高其性能)、urlrewirte、路径别名、基于IP及用户的访问控制、支持速率限制及并发数限制;
……
  4.Nginx的基本架构:master/worker
       master/worker模型:一个master进程可生成一个或多个worker进程;每个worker基于时间驱动机制可以并行响应多个请求
   master:加载配置文件、管理worker进程、平滑升级,...
   worker:http服务,http代理,fastcgi代理,...
wKioL1bIF0fD_1shAAKLQ5WBSH0552.jpg

     事件驱动:epoll(Linux),kqueue(FreeBSD), /dev/poll(Solaris)
消息通知:select,poll, rt signals
     支持sendfile,  sendfile64
     支持AIO,mmap



二、Nginx编译安装配置
  1.编译安装nginx
     (1)编译环境准备
              [iyunv@localhost~]# yum install -y make
              [iyunv@localhost~]# yum install -y gcc
              [iyunv@localhost~]#  yum -y groupinstall "开发工具""服务器平台开发"
              [iyunv@localhost~]# yum install -y pcre-devel  openssl-develzlib-devel
              [iyunv@localhost~]# useradd -r nginx
     (2)解压安装
              [iyunv@localhost~]# tar xf nginx-1.8.0.tar.gz
              [root@localhostnginx-1.8.0]# ./configure --prefix=/usr/local/nginx--conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx  --error-log-path=/var/log/nginx/error.log--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid--lock-path=/var/lock/nginx.lock --with-http_ssl_module--with-http_stub_status_module --with-http_gzip_static_module --with-debug
注意:check时,在Linux上epoll机制要存在
              [root@localhostnginx-1.8.0]#make &&make install
     (3)启动服务,检测端口是否启用
              [iyunv@localhost~]#  /usr/local/nginx/sbin/nginx
              [iyunv@localhost~]# ss-tnl
wKiom1bIFt-iaDHCAACydAysM8U914.jpg

2.Nginx配置文件
    (1)配置指令有类型
             1) 全局指令:放置于mainblock中,即文档根
main配置段类别:正常运行必备的配置;优化性能相关的配置;用于调试、定位问题的配置;
             2) 模块指令:由模块引入,其也必须放置于相应的Directive blocks中;block之间可能存在嵌套关系。用{}嵌套
   event 配置段
事件驱动模块段,面向用户并发连接请求响应组织配置机制
   http 配置段
web模块相关配置
   mail配置段
邮件模块相关配置;编译安装时候默认无此模块
   … ...

wKiom1bIF0KQTyFnAAE_wCXCz8E867.jpg
    (2)组成部分
主配置文件:nginx.conf
     在主配置文件中加入include语句,可以将主配置文件切割成端例如include conf.d/*.conf   ===>  /etc/nginx/conf.d/*.conf
fastcgi的配置文件:fastcgi_params
  …  ...
    (3)配置文件内容语法格式
1)  配置指令(必须以分号结尾):Directive  value1 [value2...];
2) 支持使用变量:
内置变量:由模块引入;
自定义变量:set  variable value; 引用变量:$variable



三、主配置文件框架解析
1.MAIN配置段常用参数
   (1)常规配置指令
user  USERNAME  [GROUPNAME];
指定用于运行worker进程的用户和组:例如user  nginx   nginx;
pid  /PATH/TO/PID_FILE;
指定nginx进程的pid文件路径;pid  /var/run/nginx.pid;
worker_rlimit_nofile  #;
指定一个worker进程所能够打开的最大文件描述符数量;
worker_rlimit_sigpending  #;
指定每个用户能够发往worker进程的信号的数量;
   (2)性能优化相关指令
worker_processes  #;
worker进程的个数;通常应该为物理CPU核心数量减1;"auto"实现自动设定
worker_cpu_affinity  CPUMASK CPUMASK …;
CPU绑定;加上CPU掩码
实例:worker_cpu_affinity 00000001 00000010 00000100;
worker_priority  nice;
[-20, 19]
   (3)调试定位Bug相关指令
daemon  off|on;
是否以守护进程方式启动nignx;
master_process  on|off;
是否以master/worker模型运行nginx;
error_log  /PATH/TO/ERROR_LOG level;
错误日志文件及其级别;
调试需要可以设定为debug;但debug在编译时使用了"--with-debug"选项

2.event配置段常用参数
worker_connections  #;
  每个worker进程所能够响应的最大并发请求数量;默认为1024;
上限:worker_proceses * worker_connections
use  [epoll|rgsig|select|poll];
定义使用的事件模型;建议让nginx自动选择;
accept_mutex  [on|off];
各worker接收用户的请求的负载均衡锁(互斥锁)
on:启用,表示用于让多个worker轮流地、序列化地响应新请求;
lock_file  /PATH/TO/LOCK_FILE;
锁文件位置



四、Nginx:http常规配置
     说明:http的所有配置需要在http{ } 配置段进行定义。未具体说明指令基于ngx_http_core_module模块配置
  1.主机或套接字相关指令
   (1) server {}:定义一个虚拟主机;server可以出现一次货多次
server{
listenPORT;
server_name  NAME;
root /PATH/TO/DOCUMENTROOT;
}
...
              注意:
      1) 基于port:listen指令监听在不同的端口;
      2) 基于hostname:server_name指令指向不同的主机名;
   (2) listen:配置监听端口
  使用格式:listen address[:port] [default_server] [ssl] [http2 | spdy]
                        listen port [default_server] [ssl] [http2 | spdy]
        注释:
default_server:设置默认虚拟主机;用于基于IP地址,或使用了任意不能对应于任何一个server的name时所返回站点;
ssl:用于限制只能通过ssl连接提供服务;
spdy:SPDYprotocol(speedy),在编译了spdy模块的情况下,用于支持SPDY协议;
http2:支持httpversion 2第二版http协议;
   (3) server_name NAME [...];:指明主机名称
   后可跟一个或多个主机名;名称还可以使用通配符和正则表达式(~引导整个正则表达式);
匹配顺序:
1) 首先做精确匹配;例如:www.xxx.com
2) 左侧通配符;例如:*.xxx.com
3) 右侧通配符,例如:www.xxx.*
4) 正则表达式,例如:~^.*\.xxx\.com$
5)default_server
   (4) tcp_nodelay on|off;
对keepalive模式下的连接是否使用TCP_NODELAY选项;一般为off
提高带宽利用率,将发往同一主机很小的TCP报文合并成一个;实际生产上对于用户请求即使浪费带块也不能合并请求
   (5) tcp_nopush on|off;
是否启用TCP_NOPUSH(FREEBSE)或TCP_CORK(Linux)选项;仅在sendfile为on时有用;
尝试将多个报文首部压缩成一个发送,默认off,不启用该功能
   (6) sendfile on|off;
是否启用sendfile功能;静态文件直接在内核中封装响应,而不是从内核空间到用户空间再发往内和空间

  2.路径相关指令
   (1) root:指明根文件路径
设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径;可用与server或localtion中
实例:
server{
...
root  /data/www/vhosts;
}
http://www.xuding.com/images/logo.jpg --> /data/www/vhosts/images/logo.jpg
server{
...
server_name  www.xuding.com;
location/images/ {
root  /data/imgs/;
...
}
}
http://www.xuding.com/images/logo.jpg --> /data/imgs/images/logo.jpg
   (2) location
            允许根据用户请求的URI来匹配定义的各location。匹配到时,此请求将被相应的location块中的配置所处理;即用于为需要用到专用配置的uri提供特定配置;
       使用格式:
              1) location @name { ... }
   2) location[ = | ~ | ~* | ^~ ] uri { ... }  
当能匹配多次时,其匹配优先级:精确匹配=、^~、~或~*、不带符号的URL;
=:URI的精确匹配,其后多一个字符都不可以,精确匹配根
~:做正则表达式匹配,区分字符大小写;
~*:做正则表达式匹配,不区分字符大小写;
^~:URI的左半部分匹配,不区分字符大小写;
           server {
...
server_name www.xuding.com;
root/data/www;
location  /admin/ {
...
}
}
   (3) alias:定义路径别名,只能用于location配置段
location  /images/ {
root/data/imgs/;
}
location  /images/ {
alias/data/imgs/;
}
          注意:
       root指令:给定的路径对应于location的“/”这个URL;/images/test.jpg -->  /data/imgs/images/test.jpg
       alias指令:给定的路径对应于location的“/uri/"这个URL;/images/test.jpg-->  /data/imgs/test.jpg
   (4) index :设置默认主页(ngx_http_index_module模块引入)
  可以带上变量,如$geo更具不同IP地区来设置不同的语言主页
      indexfile ...;
   (5) error_page code ... [=[response]] uri;:自定义错误页面,根据http的状态码重定向错误页面;
  实例:
       1)指明错误页面
error_page  404 /404.html
error_page 500 502 503 504 /50x.html
location = /50x.html {
root html;
}
        2) 以指定的响应状态码进行响应
error_page  404 =200  /404.html
   (6) try_files file ... uri;:以指定的顺序检查文件的存在性响应
     try_files file ... =code;
            尝试查找第1至第N-1个文件,第一个即为返回给请求者的资源;若1至N-1文件都不存在,则跳转至最一个uri(必须不能匹配至当前location,而应该匹配至其它location,否则会导致死循环);

  3.面向客户端请求相关的配置
    (1) keepalive_timeout # ;
设定keepalive连接的超时时长;0表示禁止长连接;默认为启用为75s;
   (2) keepalive_requests # ;
在keepalived连接上所允许请求的最大资源数量;默认为100;
   (3) keepalive_disable … ….;
指明禁止为何种浏览器使用keepalive功能;默认none,也可以指明具体浏览器名称
   (4) send_timeout #;
发送响应报文的超时时长,默认为60s;
   (5) client_body_buffer_size size;
接收客户请求报文body的缓冲区大小;默认为16k;超出此指定大小时将被移存于磁盘上;
   (6) client_body_temp_pathpath [level1 [level2 [level3]]];
设定用于存储客户端请求body的临时存储路径及子目录结构和数量;
client_body_temp_path  /var/tmp/client_body  2 2;

  4.对客户端请求的进行限制
   (1) limit_excpet  METHOD {...}:对指定范围之外的其它的方法进行访问控制;
limit_except  GET {
allow  172.16.0.0/16;
denyall;
}
   (2) limit_rate  # ;
              制客户端每秒钟所能够传输的字节数,默认为0表示无限制;

  5.文件操作优化相关的配置
    (1) aio  on|off;     
  是否启用异步IO模式
   (2) directio  size|off;   
    直接IO;不在内存中缓冲,直接从硬盘加载使用(当大于指定size)
Enablesthe use of the O_DIRECT flag (FreeBSD, Linux), the F_NOCACHE flag (Mac OS X),or the directio() function (Solaris), when reading files that are larger thanor equal to the specified size.
   (3) open_file_cache :打开文件缓存
open_file_cache off;
open_file_cachemax=N [inactive=time];
注释:nginx可以缓存以下三种信息
1)文件描述符、文件大小和最近一次的修改时间;
2)打开的目录的结构;
3)没有找到的或者没有权限操作的文件的相关信息;
    max=N表示可缓存的最大条目上限;一旦达到上限,则会使用LRU算法从缓存中删除最近最少使用的缓存项;
    inactive=time:在此处指定的时长内没有被访问过的缓存项是为非活动缓存项,因此直接删除;
   (4) open_file_cache_errorson | off;
是否缓存找不到其路径的文件,或没有权限没有权限访问的文件相关信息;
   (5) open_file_cache_valid # ;
每隔多久检查一次缓存中缓存项的有效性;默认为60s;
   (6) open_file_cache_min_uses # ;
缓存项在非活动期限内最少应该被访问的次数;

  6.ngx_http_access_module模块调用配置(基于IP的访问控制)
        allow address | CIDR | unix: | all;   允许
         deny address | CIDR | unix: | all;  拒绝
可以应用于http, server, location, limit_except上下文范围内,直接指定IP

  7.ngx_http_auth_basic_module模块调用配置(basic认证)
   (1) auth_basic string |off;:使用httpbasic认证协议对用户进行认证;
string为所给定字符,其作用在于认证时显示的提示所信息
   (2) auth_basic_user_file FILE ;:实现用户认证的账号文件;
         认证文件格式(需手动创建):
name1:password1
name2:password2:comment
    注意:密码需要加密,加密方式可以为encryptedwith the crypt() function; md5加密;
       密码可以用htpasswd创建:htpasswd-c -m  /etc/nginx/.ngxhtpasswd tom(创建第二个用户时需要将-c去掉)
实例:
location/admin/ {
auth_basic"Admin Area";
auth_basic_user_file/etc/nginx/.ngxhtpasswd;
}                                       

  8.ngx_http_log_module模块调用配置(访问日志)
   (1) log_format  name string  ...;:定义日志格式及其名称;
日志格式一般通过调用内置变量来定义;
string:通过nginx所支持的变量(每个模块会引入自变量)来支持的
   (2) access_log:访问日志
access_logpath [format [buffer=size [flush=time]]];
access_logoff;
访问日志文件路径,格式名称以及缓存大小和刷写时间间隔;建议定义缓冲以提升性能;
   (3) open_log_file_cachemax=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cacheoff;

  9.ngx_http_stub_status_module模块调用配置:
stub_status;
调用查看nginx状态指令
实例:
location /staus{
      stub_status;
}
通过指定的uri输出stub status;其具体输出结果如下:
Activeconnections: 291
serveraccepts handled requests
1663094816630948 31070465
Reading:6 Writing: 179 Waiting: 106                                
输出结果注释

Active connections
当前活动的客户端连接数
accepts
已经接受的客户端连接总数量:16630948
handled
已经处理过后客户端连接总数量:16630948
requests
客户端的总的请求数量:31070465
Readking
正在读取的客户端请求的数量
Writing
正向其发送响应报文的连接数量
Waiting
等待其发出请求的空闲连接数量

10.ngx_http_referer_module模块调用配置(基于请求报文中的Referer首部的值做访问控制)
            valid_referers  none | blocked | server_names | string ...;
none
请求报文不存在referer首部;
blocked
请求报文中存在referer首部,但其没有有效值,或其值非以http://或https://开头;
server_names
其值为一个主机名;
arbitrary string
直接字符串,可以使用*通配符;
regular expression
以~起始的正则表达式;
注意:内置变量:$invalid_referer(所有不能符合valid_referer指定定义的引用请求均为不合法引用),需加上条件判断语句
    示例:
valid_referers   none  blocked   server_names   *.example.com   example.* www.example.org/galleries/  ~\.google\.;        
if($invalid_referer) {
return  403;
}

11.ngx_http_gzip_module模块:gip压缩
gzip on | off;
启用或禁用gzip压缩响应报文;
gzip_comp_level  level;
压缩比,1-9,默认为1;
gzip_disable regex  ...;
regex是为用于匹配客户端响应器类型的正则表达式;表示对何种浏览器禁止使用压缩功能;
gzip_min_length  length;
触发压缩功能的响应报文的最小长度;
gzip_http_version  1.0 | 1.1;
设定启用压缩功能时,协议的最小版本;
gzip_proxied # ;
off | expired |  no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
定义对客户端请求的具有何种请求属性的资源启用压缩功能;如expired则表示对由于使用了expire首部而无法缓存的对象启用压缩功能;
gzip_types  mime-type ...;
指明仅对哪些类型的资源执行压缩操作;即压缩过滤器;
     实例:
gzip  on;
gzip_http_version1.0;
gzip_comp_level6;
gzip_disablemsie6;
gzip_min_length2;
gzip_typestext/plain text/css text/xml application/x-javascript application/xmlapplication/jsonapplication/java-script;                                



五、Nginx:https配置(基于ngx_http_ssl_module)
ssl_certificate  FILE;
证书文件路径
ssl_certificate_key  FILE;
证书对应的私钥文件
ssl_ciphers  CIPHERS;
指明由nginx使用的加密算法,可以是OpenSSL库中所支持各加密套件
ssl_protocols  # ;
指明支持的ssl协议版本,[SSLv2]  [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]默认为后三个
ssl_session_timeout  #;
ssl会话超时时长;即ssl  session cache中的缓存有效时长
ssl_session_cache # ;
指明ssl会话缓存机制;off | none | [builtin[:size]] [shared:name:size],默认使用shared
      说明:(ssl_session_cache)
   off:禁止缓存,关闭缓存,不支持缓存功能
   none:禁止缓存,不响应缓存
    builtin:使用OpenSSL内置的ssl会话缓存,对机制为各worker私有;
   shared:在各worker之间使用一个共享的缓存;name:独有名称;size:缓存空间大小,默认1M,可以调到10M;
      注意:
            1)  https定义时候也是定义在http{ }配置段,其监听配置定义:listen 443 ssl。不是以监听在443端口作为限定。用于限制只能通过ssl连接提供服务。
            2) 若不在listen处定义,也可以在server{ }中定义ssl on; 来启用https服务



六、Nginx:http请求重写(ngx_http_rewrite_module)
1.ngx_http_rewrite_module功能
       将请求的url基于正则表达式进行重写(URL重定向),在如下情况下可以使用:ttp转换成httpd服务http--> https、域名转换domain1.tld --> domain2.tld,、URL转换uri1 --> uri2、实现SEO搜索引擎优化效果 …

  2.指令
      (1)rewrite  regex replacement [flag];
    regex:正则表达式,用于匹配用户请求的url;
   replacement:重写(重定向、替换)成为的结果;
    [flag]:
last:重写完成之后停止对当前uri的进一步处理,重新请求URL,对新url的新一轮从第一条开始匹配处理;
可能会出现死循环情况,此时可以设置循环次数,超过次数后返回给客户端错误
break:重写完成之后停止对当uri的处理,重写检查结果结束,转向其后面的其它配置;
redirect:重写完成之后会返回客户端一个临时的重定向,由客户端对新的url重新发起请求(302);
permanent:重写完成之后会返回客户端一个永久的重定向,由客户端对新的url重新发起请求(301);
实例:
server{
...
rewrite^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return  403;
...
}                                
  验证请求:http://www.xxx.com/download/a/b/c/media/32.wmv -->   /download/a/b/c/mp3/32.mp3
       注意:
1)last和break请求处理是在服务器内部完成,客户端仅请求一次。redirect和permanent需要客户端再次请求
2)URL重写时所用的正则表达式需要使用PCRE格式。PCRE正则表达式元字符:
字符匹配:.,[ ], [^]
次数匹配:*,+, ?, {m}, {m,}, {m,n}
位置锚定:^,$
或者:|
分组:(),后向引用, $1, $2, ...

  3.if (condition) { ... }:条件判断,引用新的配置上下文
        condition可以为以下格式  :
1) 比较表达式:
==,!=
~:模式匹配,区分字符大小写;
~*:模式匹配,不区分字符大小写;
!~:模式不匹配,区分字符大小写;
!~*:模式不匹配,不区分字符大小写;
2) 文件及目录判断:
-f,!-f:是否存在且为普通文件;
-d,!-d: 是否存在且为目录;
-e,!-e:是否存在;
-x,!-x:是否存在且可执行;
   实例:
        1) cookie首部检测匹配
if($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}
        2) 请求报文的请求方法是POST,返回405
if($request_method = POST) {
    return 405;
}
        3) 限速(如会员认为不是slow不做限速)
if($slow) {
    limit_rate 10k;
}
        4) 非法引用,返回403。注:也可以对非法引用到其他网页
if($invalid_referer) {
    return 403;
}
4.reture:立即停止对请求的uri的处理,并返回指定的状态码;
returncode [text];
returncode URL;
returnURL;
5.set:设定变量值,或者自定义变量
set $variable value;   变量赋值;
6.rewrite_log 重写日志
         rewrite_log on | off;:是否将重写日志记入errorlog中,默认为关闭;
错误日志调试方法:错误日志debug,并开启rewrite_log;


运维网声明 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-181076-1-1.html 上篇帖子: nginx+tomcat7+redis session共享 下篇帖子: "index" directive should be absolute in x 问题解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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