一、Nginx服务基础
1. Nginx 概述
Nginx ("engine x") 是一个 高性能 的 HTTP 和反向代理服务器。 Nginx 是由 Igor Sysoev 为俄
罗斯访问点开量第二的 Rambler.ru 站发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源 代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而 闻 名。2011 年 6 月 1 日, Nginx 1.0.4 发布。 1.18 1.20 1.22 1.12
Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件( IMAP/POP3 )代理服务器,
单台物理服务器 可支持 30 000 ~ 50 000 个并发请求 。并在一个 BSD-like 协议下发行。由俄罗斯的程序设 计师 Igor Sysoev 所开发,供俄国大型的入口网站及搜索引擎 Rambler (俄文: Рамблер )使用。其特 点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国 大陆使用 Nginx 网站用户有:百度 BWS 、新浪、网易、腾讯、等。
2. Nginx 功能介绍
- 静态的web资源服务器html,图片,js,css,txt等静态资源
- http/https协议的反向代理 ,7层 url
- 结合FastCGI /uWSGI/SCGI等协议反向代理动态资源请求
- tcp/udp协议的请求转发(反向代理) 4层
3. Nginx 应用场景
① 静态服务器 (图片、视频服务、文本)
② 动态服务
③ 反向代理, 负载均衡
④ 缓存服务
4. Nginx和Apache的差异
- Nginx是一个甚于事件的Web服务器,Apache是一个基于流程的服务器;
- Nginx避免子进程的概念,Apache是基于子进程的;
- Nginx在内存消耗和连接方面更好,Apache在内存消耗和连接方面一般;
- Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于CPU和内存等硬件;
- Nginx支持热部署,Apache不支持热部署;
- Nginx对于静态文件处理具有更高效率,Apache相对一般;
- Nginx在反向代理场景具有明显优势,Apache相对一般。
5. Nginx 框架
6. Nginx核心模块
- 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能
- 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如:端口配置、网页编码设置、 HTTP响应头设置等等
- 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash多媒体传输、解析 GeoIP 请求、网络传输压缩、安全协议 SSL 支持等
- 邮件服务模块:主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
- Stream服务模块: 实现反向代理功能,包括TCP协议代理四层
- 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
常用模块
ngx_http_core_module 核心模块
ngx_http_access_module 访问控制
ngx_http_auth_basic_module 身份验证
ngx_http_gzip_module 压缩模块
ngx_http_log_module 日志模块
ngx_http_proxy_module 代理模块
ngx_http_rewrite_module 重写模块
ngx_http_stub_status_module 状态页模块
ngx_http_upstream_module 反向代理
ngx_http_stream_module 四层代理
二、Nginx 安装
1. yum 安装
①、使用yum 部署 Nginx 需要先安装 epel-release 扩展包,官方源默认没有 Nginx 的 yum源。
yum install epel-release -y //安装epel-release
②、扩展源安装完后直接安装 Nginx 。
yum install nginx -y //安装nginx③使用 yum 安装的 nginx 配置文件位置在: /etc/nginx.conf 。默认根目录在: /usr/share/nginx/html 。默认日志文件在: /var/log/nginx/ 路径下。
2. Nginx 编译安装
2.1 关闭防火墙和增强功能
systemctl stop firewalldsystemctl disable firewalldsetenforce 0
将软件包传到/opt目录下
2.2 安装依赖包
#nginx 的配置及运行需要 pcre 、 zlib 等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。yum -y install pcre-devel zlib-devel gcc gcc-c++ make
2.3 创建运行用户与组
# 创建运行用户、组( Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)useradd -M -s /sbin/nologin nginx
2.4 编译安装Nginx
tar zxvf nginx-1.18.0.tar.gz -C /opt/yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel./configure --help# 查看帮助模块./configure --prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_ssl_module \--with-http_v2_module \--with-http_realip_module \--with-http_stub_status_module \--with-http_gzip_static_module \--with-pcre \--with-stream \--with-stream_ssl_module \--with-stream_realip_modulemake && make installln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ # 让系统识别 nginx 的操作命令nginx -t # 检查配置文件是否配置正确
2.5 Nginx信号
nginx -t 检查语法nginx -T 检查语法 并打印所有配置nginx -v 显示版本nginx -V 显示详细信息, 包括 编译的信息nginx -c 指定配置文件启动nginx -s = kill 发送信号nginx -s relaod 重新加载配置文件nginx -s stop 停止 nginx 立即停止nginx -s quit 优雅的退出 , 如果有人在访问我的服务, 那么不会立即关闭, 等客户断开连接再 退出nginx -s reopen 重新生成日志文件 USR1 日志 有关nginx -s USR2 飞行中升级
2.6 添加Nginx系统服务
vim /lib/systemd/system/nginx.service[Unit]Description=nginxAfter=network.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStart=/usr/local/nginx/sbin/nginxExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true[Install]WantedBy=multi-user.target----------------[Unit]: 服务的说明Description: 描述服务After: 依赖,当依赖的服务启动之后再启动自定义的服务[Service] 服务运行参数的设置Type=forking 是后台运行的形式,使用此启动类型应同时指定PIDFile 以便 systemd 能够跟踪服务的主进程。ExecStart 为服务的具体运行命令ExecReload 为重启命令ExecStop 为停止命令PrivateTmp=True 表示给服务分配独立的临时空间注意:启动、重启、停止命令全部要求使用绝对路径[Install] 服务安装的相关设置,可设置为多用户-----------------chmod 754 /lib/systemd/system/nginx.servicesystemctl start nginx.service #启动服务systemctl enable nginx.service #开机自启动
三、Nginx主配置文件 nginx.conf
--- 认识Nginx服务的主配置文件 nginx.conf ----
1. 全局配置
①、运行用户:user nobody;:指定Nginx服务的运行用户,默认是 nobody。如果需要指定其他用户,可以在此处修改。
②、工作进程:worker_processes 4;:配置工作进程的数量,通常设置为服务器核心数的2倍。对于低访问量的网站,设置为1可能已经足够。
示例: CPU配置
2P:2个物理CPU。
4C:每个物理CPU有4个核心,因此总共有2 * 4 = 8个逻辑核心。
内存配置: 8GB。
存储配置: 4C 16G 高效盘 40GB(系统盘)、存储OSS、网络存储NAS 50MB。
③、错误日志:error_log logs/error.log;:指定错误日志文件的位置。默认情况下,这一项是被注释掉的,可以根据需要启用并指定路径。
④、PID文件:#pid logs/nginx.pid;:指定PID文件的位置。PID文件用于存储Nginx进程的ID,以便管理和控制服务。默认是被注释掉的,可以根据需要启用并指定路径。
2. I/O 事件配置
events {use epoll; # 使用 epoll 模型, 2.6 及以上版本的系统内核,建议使用epoll模型以提高性能worker_connections 4096; # 每个进程处理 4096 个连接 2000}
- #如提高每个进程的连接数还需执行“ulimit -n 65535”命令临时修改本地每个进程可以同时打开的最大文件数。
- #在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
- #可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。 /etc/security/limits.conf
- #epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版 本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。若工作进程数为 8,每个进程处理 4 096 个连接,则允许 Nginx 正常提供服务的连接数 已超过 3 万个(4 096×8=32 768),当然具体还要看服务器硬件、网络带宽等物理条件的性能表现。
3. HTTP 配置
http {
## 文件扩展名与文件类型映射表
include mime.types;
## 默认文件类型
default_type application/octet-stream;
## 日志格式设定(示例已被注释)
# log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
## 访问日志位置(示例已被注释)
# access_log logs/access.log main;
## 支持文件发送(下载)
sendfile on;
## 连接保持超时时间,单位是秒
keepalive_timeout 65;
## Web 服务的监听配置
server {
## 监听地址及端口
listen 80;
## 站点域名,可以有多个,用空格隔开
server_name www.kgc.com;
## 网页的默认字符集
charset utf-8;
## 根目录配置
location / {
## 网站根目录的位置
root html;
## 默认首页文件名
index index.html index.php;
}
## 内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
## 错误页面配置
location = /50x.html {
root html;
}
}
}
$remote_addr 与 $http_x_forwarded_for 用以记录客户端的 ip 地址;$remote_user :用来记录客户端用户名称;$time_local : 用来记录访问时间与时区;$request : 用来记录请求的 url 与 http 协议;$status : 用来记录请求状态;成功是 200 ,$body_bytes_sent :记录发送给客户端文件主体内容大小;$http_referer :用来记录从哪个页面链接访问过来的;$http_user_agent :记录客户浏览器的相关信息;