# `Nginx`使用场景 - 静态资源服务:通过本地文件系统提供服务 - 反向代理服务:缓存、负载均衡 - `API`服务:`OpenResty`高性能`Web`平台,集成大量`Lua`库、第三方模块及依赖项 # `Why` `Apache`一个连接一个进程。互联网和物联网的普及。 # 优点 - 高并发下的高性能 - 可扩展 - 可靠 - 热部署 - `BSD`许可 `BSD`协议 ``` --在源代码和二进制类库中包含原来代码中的BSD协议 --不可以以源代码的作者/机构的名字做市场推广 ``` `MIT`协议 ``` --作者只想保留版权 --在源代码和二进制类库中包含原来代码中的MIT协议 ``` 几个协议的关系 ``` 修改源码后是否可以闭源? 可以 每个修改文件是否必须放置版权说明? 需要放置版权说明 Apache 不需要放置版权说明 衍生软件的广告是否可以用你的名字促销? 可以用你的名字 MIT 不可以用你的名字 BSD 不可以 新增代码是否采用同样的许可证? 采用同样的许可证 GPL 可以不采用同样的许可证 是否需要对源码修改后提供说明文档? 需要 Mozilla 不需要 LGPL ``` # `NginX`的组成 - 二进制可执行文件 - 控制行为用`Nginx.conf` - 记录每一条`http`请求用`acess.log` - 记录错误日志用`error.log` # `Nginx`开源免费和商业 - 开源: `nginx.org` - 商业:`nginx.com` `Tengine`是淘宝网发起的`Web`服务器项目。 # `OpenResty`开源免费和商业 - 开源:`openrety.org` - 商业:`openresty.com` # 配置语法 ### 全局配置 | 字段 | 说明 | | ------------------ | ------------------------------------------------------------ | | user | worker进程的用户和组。如果忽略group,那么group的名字等于用户名 | | worker_processes | worker进程的启动数量。通常是处理器数量的1.5-2倍 | | error_log | 所有错误的写入文件 | | `pid` | 记录主进程ID的文件 | | use | 设置使用什么样的连接方式 | | worker_connections | 一个工作进程处理理并发数的最大值 | `nginx.conf` ``` user www; worker_processes 12; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; //一个{}就是一个上下文,events就是一个模块 events { use /dev/poll; worker_connections 2048; } ``` ### 使用`include`文件 为了方便维护,可以把配置文件放在`nginx.conf`以外的配置文件中。 ``` --进入conf目录: cd /usr/local/nginx/conf --创建目录:mkdir vhost --创建文件:nano test1.com.conf server { listen 8000; server_name test1.com location / { proxy_set_header Host #host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_hreader X-Forwarded-For $proxy_add_x_forwareded_for; # proxy_pass http://xxx.xxx.xxx; echo "test1.com"; } } --创建文件:nano test2.com.conf server { listen 8000; server_name test2.com; location / { proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_headeer X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_apss http://xxx.xxx.xxx; echo "test2.com"; } } --在nginx.conf文件中引入 include vhost/*.conf; --编辑/etc/hosts文件:nano /etc/hosts 127.0.0.1 test1.com 127.0.0.1 test2.com --测试:curl http://test1.com:8000 --测试:curl http://test2.com:8000 ``` ### `HTTP`的`Server`部分 #### 客户端指令 | 指令 | 说明 | | ---------------------------- | ------------------------------------------------------------ | | chunked_transfer_encoding | 发送给客户端的响应中,允许禁用`http/1.1` | | client_body_buffer_size | 允许客户端请求体的缓存大小,默认为两个内存页面 | | client_body_in_file_only | 设置成`on`将客户端请求体强制写入磁盘文件 | | client_body_in_single_buffer | 将客户端请求体保存在单个缓存中 | | client_body_temp_path | 保存客户端请求体的路径 | | client_body_timeout | 指定读取两个客户端请求体之间的时间间隔 | | client_header_buffer_size | 指定客户端请求头的缓存大小 | | client_header_timeout | 指定客户端请求头的超时时间 | | client_max_body_size | 执行客户端请求体的大小,超过大小报`413`错误 | | `keepalive_disable` | 对某些客户端禁用`keepalive`功能 | | `keepalive-request` | 关闭`keepalive`功能之前可以接收多少请求 | | `keepalive-timeout` | `keepalive`连接持续多久 | | large_client_header_buffers | 客户端最大缓存大小 | | `msie_padding` | 为了填充响应大小到512字节,对于`MSIE`客户端,大于400的状态码会被添加注释以便满足512字节,通过启用命令可以禁用 | | `msie_refreshes` | 对于`MSIE`客户端,启用发送`refresh`头而不是`redirect`头 | #### 文件I/O指令 | 指令 | 说明 | | -------------------------- | ------------------------------------------------------------ | | `aio` | 启用异步文件`I/O` | | direction | 启用操作系统特定的表之,在`Linux`下启用`aio`需要使用 | | direction_alignment | 设置`direction`的算法,通常512足够 | | open_file_cache | 配置一个缓存,用来存储文件描述符、目录查询和文件查询错误 | | `open_file_cahce_errors` | 按照`open_file_cache`启用文件查询错误缓存 | | `open_file_cache_min_uses` | `open_file_cache`缓存的文件描述符保留在缓存中,使用本指令配置最少使用文件描述符的次数 | | `open_file_cache_valid` | 设置`open_file_cache`缓存有效检查的时间间隔 | | postpone_output | 指定发送给客户端最小的数值 | | read_ahead | 预读文件到设定的参数大小,Linux会忽略 | | `sendfile` | 复制数据从一个到另一个文件描述 | | `sendfile_max_chunk` | 设置`sendfile(2)`最大数据大小,以阻止worker进程的贪婪 | #### Hash指令 指定`Nginx`分配给某些变量多大的静态内存。 | 指令 | 说明 | | ----------------------------- | ----------------------------------------- | | server_names_hash_bucket_size | 指定用户保存`server_name`散列表的大小的桶 | | server_names_hash_max_size | 指定`server_name`散列表的最大值 | | types_hash_bucket_size | 指定用于存储散列表的桶的大小 | | types_has_max_size | 指定散列表类型表的最大大小 | | variables_hash_bucket_size | 指定用于存储保留变量桶的大小 | | `varialbes_hash_max_size` | 指定存储保留变量最大散列值大小 | #### Socket指令 设置如何创建`TCP`套接字。 | 指令 | 说明 | | ---------------------------- | ------------------------------------------------------------ | | lingering_close | 如何保持客户端连接 | | lingering_time | 指定客户端连接为了处理更多数据需要保持打开连接的时间 | | lingering_timeout | 结合lingering_close,在关闭客户端连接之前的超时时间 | | `reset_timedout_comnnection` | 超时的连接将会被立即关闭,释放相关内存。 | | `send_lowat` | 如果非零,在客户端套接字尝试减少发送操作 | | `send_timeout` | 在两个成功客户端接收响应的写操作之间设置一个超时时间 | | `tcp_nodelay` | 启用禁用`TCP_NODELAY`用于配合`keep-alive` | | `tcp_nopush` | 仅依赖于`sendfile`的使用。在一个数据包中尝试发送响应头以及在数据包中发送一个完整的文件 | 示例 ``` http { include /opt/local/etc/nginx/mime.types; default_type application/octer-stream; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; server_names_has_max_size 1024; } ``` ### 虚拟服务器 以`server`开头的部分称为虚拟服务器,会根据不同的`server_name`指令逻辑分隔资源。一个虚拟服务器由`listen`和`server_name`指令组合定义。 `Listen`指令 | 指令 | 说明 | | -------------- | ------------------------------------------------------------ | | default_server | 定义`addres:port`组合 | | `setfib` | 为套接字监听设置`FIB`,仅支持`FreeBSD`,不支持`UNIX`域套接字 | | backlog | 在listen()中设置,`FreeBSD`默认值-1,其它系统511 | | `rcvbuf` | 设置`SO_RCVBUF`参数 | | `sndbuf` | 设置`SO_SNDBUF`参数 | | accept_filter | 设置接收的过滤器:`dataready`或`httpready`, `dataready` | | deferred | 延迟`accept()`调用,仅支持Linux | | bind | 为`address:port`套接字打开一个单独的`bind`调用 | | `ipv6only` | | | `ssl` | 只接收`HTTPS`连接 | | so_keep-alive | | ### location指令 用字虚拟服务器内部,设置重定向。