安装
安装 pcre
1 | 下载 |
更新依赖
1 | sudo yum install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel |
安装 nginx
1 | 下载 |
CentOS7 的默认防火墙改成了 firewall,不再使用 iptables 为默认防火墙了
安装好 nginx 后需要打开 80 端口
1 | firewall-cmd --list-all #查看开发的端口号 |
firewall 相关命令
1 | systemctl stop firewalld.service # 停止 |
相关命令
查看版本号:
1 | [root@centos-7 sbin]# ./nginx -v |
停止:
1 | [root@centos-7 sbin]# ./nginx -s stop |
启动:
1 | [root@centos-7 sbin]# ./nginx |
重加载:
1 | [root@centos-7 sbin]# ./nginx -s reload |
配置文件
一般在/usr/local/nginx/conf
下。
注意:如果在 nginx 安装过程中指定了--prefix=/path/
的情况下,这个目录就在指定的 path 下。
注意:yum 安装的可能不在这个目录下。
配置文件分为 3 个部分:
全局块(对应下文中配置文件的 1-10 行)
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令。
主要包括配置运行 nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型、配置文件的引入等。
比如:
worker_processes 1;
是 nginx 服务器并发处理服务的关键配置,值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。(和 CPU 核心数量一致比较合理?)events 块
主要影响 nginx 服务器与用户的网络连接。
比如:
worker_connections 1024;
支持的最大连接数。http 块
配置中最频繁的步伐,代理、缓存、日志定义绝大多数功能和第三方模块的配置都在这里
注意:http 块也可以包括 http 全局块、server 块。
- http 全局块(下文中 17-33 行)
- 包括文件引入、mime-type 定义、日志自定义、连接超时时间、单链接请求数上限等。
server 块
和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,每个 server 块就相当于一个虚拟主机。
每个 server 块也分为全局 server 块以及可以同时包含多个 location 块。
全局 server 块(下文 35-41 行)最常见的就是配置本虚拟主机的监听配置和本虚拟主机的名称或 IP 配置。
location 块,一个 server 块可以包含多个 location 块,主要是基于 nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
1 | #user nobody; |
NGINX 原理
master & worker
1 | [root@centos-7 keepalived]# ps aux | grep nginx |
worker 是如何工作的?
争抢。
一个 master 和多个 worker 的好处?
1、可以使用 nginx -s reload 热部署
当使用了热部署后,之前有 client 请求的 worker 还是按照之前的规则进行处理请求,空闲的 worker 就可以根据新的配置来进行处理 client 的请求。
2、对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
3、采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。
当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
设置多少个 worker 合适?
Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是 千上万个请求也不在话下。
每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。
1 | 设置worker数量 |
连接数 worker_connection
这个值是表示每个worker进程所能建立连接的最大值。
所以,一个nginx 能建立的最大连接数,应该是worker.connections * worker processes
。
当然,这里说的是最大连接数,对于HTTP 请求本地资源来说,能够支持的最大并发数量是worker.connections * worker processes
。
如果是支持http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是worker.connections * worker.processes / 2
。
而如果是HTTP作为反向代理来说,最大并发数量应该是worker.connections * worker_proceses/4
。
因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
发送请求,占用了woker的几个连接数?
2 个或者 4 个。
比如请求的是静态资源,一来一回是两个连接数。
如果访问别的资源比如说是 tomcat,则 worker 和 tomcat 也有一来一回两个连接,所以是 4 个连接数。
nginx有一个master,有四个woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?
普通的静态访问最大并发数是: worker connections * worker processes/2
而如果是HTTP作为反向代理来说,最大并发数量应该是worker connections * worker processes/4
EOF