一 全局配置
(1)user ngxin运行用户以及用户组,主要关系到一些权限问题(rwx)。默认是nobody
(2)worker_processes ngxin开启进程数,建议配置成与cpu核数一致
(3)error_log 定义输出错误日志级别 输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
(4)pid 指定pid文件位置,目的是为了避免开启多个副本进程,当进程创建时会创建pid文件,写入自己的进程号。如果其他用户想要再次启动这个进程副本,如果没有这个pid文件的写权限是不会启动失败的
(5)worker_rlimit_nofile ngxin每个进程打开的最大文件数,如果worker_processes配置为2,nginx可以打开的最大文件数就是2 * worker_rlimit_nofile,这个可以限制ngixn的最大并发量
(6)worker_cpu_affinity 可以为每个进程配置使用的cpu
二 event模块
(1)use ngxin的工作模式 可选为select,poll,epoll。 select会管理一个连接池,每当有新连接加入或者之前的连接断开会动态的调整整个连接池,然后不停的轮询连接池是否有可写(向客户端发消息)或可读(客户端发来信息)的连接,并返回给程序,select会将连接以数组的形式保存在内核中,因为限制最大程度为1024,所以最大链接数也被限制为1024; poll是select的升级版,是以链表的形式报错链接,没有最大长度的限制;epoll是为事件加了个回调函数,有响应的时候直接调用之前配置的函数就可以了,如果所有连接都比价活跃,select和poll比较合适,大部分情况下epoll是首选。
(2)worker_connections 每个进程的最大并发连接数。整个nginx的最大连接数:worker_connections * worker_processes, 如果作为反向代理要除以2(要同时连接后端和客户端),如果客户端要建立两个连接(应该是一个连接用于输入,一个连接用于输出,这个我也不是很肯定)要除以4
三 http模块
(1)types 文件扩展名与类型映射表,ngixn可以根据文件的后缀名判断文件类型,这个后面的值是一般include是一个文件名,文件里写明了映射关系,如果直接写到配置文件里得好长。
(2)default_type 默认文件类型
(3)access_log 指定访问日志位置(后面可以加个别名)
(4)log_format 指定某个(加哪个日志的别名,就是为哪个日志配置)日志显示的内容(内置一些变量,比如ip时间什么的,想要显示什么就写什么就行)和格式(跟拼接字符串一样)。
例子: log_format main '$remote_addr - $remote_user [$time_local] "$request" '
(5)sendfile 一种优化的读写模式(用户buffer-内核-硬盘)
普通读写
ohn Nagle通过不立即发送小包来解决问题(Nagle的算法)。 所有这样的分组被收集一定量的时间,然后作为单个分组一次发送。 这改进了底层网络的的效率。 因此,典型的TCP/IP协议栈在将数据包发送到客户端之前需要等待200毫秒。
在打开套接字时可以使用TCP_NODELAY选项来禁用Nagle的缓冲算法,并在数据可用时立即发送。 NGINX提供了tcp_nodelay指令来启用此选项。
(7)tcp_nopush 作为Nagle算法的替代方案,Linux提供了TCP_CORK选项。 该选项告诉TCP堆栈附加数据包,并在它们已满或当应用程序通过显式删除TCP_CORK指示发送数据包时发送它们。 这使得发送的数据分组是最优量,并且因此提高了网络的效率。
(8)client_max_body_size 用来设置允许客户端请求的最大的单个文件字节数
(9)keepalive_timeout 如果超过这时间没有活动,链接会被断开
(10)gzip 对传输文件进行压缩,传输更高效 可以定义压缩等级1到9, 等级越高压缩后的文件越小,但相应的会吃更多的cpu。可以定义对哪种类型文件进行压缩,也可以定义对超过多大的文件进行压缩
四 sever模块(配置虚拟主机)
(1)listen 监听端口
(2)server_name 主机域名
(3)error_page 错误页面 比如当出现状态为500时,跳转错误页面
(4)location 对不同请求资源定向到不同目录,支持正则。
匹配优先级:
= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。
(5)root 项目根目录
(6)index 默认访问文件 index.php
(7)deny 拒绝访问
(8)allow 允许访问
(9)expires 定义访问资源的过期时间,比如设置为30秒,那么三十秒内客户端对该文件只会请求一次,然后保留在客户端30秒作为缓存
(10)try_files $uri $uri/ /index.php 一种重定向功能,如果我访问的是www.demo.com/test $uri的值就是test,前面两个值分别是test和test/,就是如果有这个文件或者这个目录,那么就直接访问这个文件或者目录就可以了,如果没有的话跳转到index
(11)fastcgi_split_path_info nginx默认没有PATH_INFO 这个参数通过正则自定义分割出绝对路径(SCRIPT_FILENAME)和参数(PATH_INFO)
(12)fastcgi_pass 设置连接php-fpm 主要有两种连接方法 1.tcp socket 写php-fpm运行的ip地址和端口号 例子 fastcgi_pass 127.0.0.1:9000 2.nuix socket 写php-fpm运行pid的文件地址 例子fastcgi_pass unix:/var/run/php5-fpm.sock
比较:unix能够减少没必要的tcp开销 但并不稳定 毕竟没有协议的支撑 高并发下会产生大量的长时缓存,tcp面向连接的协议,可以保证通信的正确定和完整性
五.upstream (负载均衡)
主要有四种调度方法
1.weight轮询(默认) weight越大越容易被轮到
2.ip_hash 对每个访问的ip进行hash结果分配 ,这个可以解决session共享问题
3.fair nginx本身并不支持,这个需要新增一个拓展模块upstream_fair,根据服务器响应时间分配 ,响应时间快的优先分配
4.url_hash 对访问url进行hash结果分配