Nginx是一个开源且高性能、可靠的 Http web 服务、代理服务
开源:直接获取源代码
高性能:支持海量并发
可靠:服务稳定
Apache :httpd,最早的web服务
Nginx
OpenResty 基于Nginx+Lua
Tengine 淘宝基于Nginx开发
Lighttpd: 是一个德国人领导的开源轻量Web服务器软件
IIS 微软
GWS Google Web Server
BWS Baidu Web Server
高性能、高并发
支持很高的并发,在处理大量并发的情况下,比其他web服务器要高效
轻量且高扩展
功能模块少(源代码仅保留http与核心模块代码,其余不够核心代码会作为插件来安装)
代码模块化(易读,便于二次开发,支持第三方模块,对于开发人员非常友好)
高可靠性
只要不过分不会出现问题
宕机时间,99.999%
大部分web服务需要定期重启维护,nginx不需要
支持热部署
运行期间,更新迭代、代码部署
互联网公司都选择 Nginx
Nginx技术成熟, 国内公司基本大规模使用
适合当前主流架构趋势, 微服务、云架构、中间层
统一技术栈, 降低维护成本, 降低技术更新成本。
事件模型:Nginx 采用 Epoll 网络模型, Apache 采用 Select 模型
Select: 当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下。
Epoll: 当用户发起请求,epoll模型会直接进行处理,效率高效,并无连接限制。
进程是操作系统资源分配的最小单位,由于CPU数量有限,多个进程通过被分配的时间片来获得CPU的使用权,系统在进行内核管理和进程调度时,要执行保存当前进程上下文、更新控制信息、选择另一就绪进程、恢复就绪进程等一系列操作,而频繁切换进程会造成资源消耗。
1) nginx采用master-workers的工作机制,如下图
1.主管进程负责工作进程的配置加载、启停等操作;
2.工作进程负责处理具体请求;
3.工作进程之间都是独立的,每个工作进程处理多个连接;
4.每个连接由一个工作进程全权处理,不需要进行进程切换,不会产生进程切换引起的资源消耗问题;
5.共享内存允许多个进程访问同一个内存地址,一个进程改变了内存中的内容后,其他进程都可以使用变更后的内容。
2)worker进程工作原理,如下图:
模块化的设计为Nginx提供了高度的可靠性、可扩展、可定制特性。具体分类如下:
核心模块(core)
提供了Nginx服务运行的基本功能,如Nginx的进程管理、CPU亲缘性、内存管理、配置文件解析、日志等功能。
事件模块(event)
负责进行连接处理,提供对不同操作系统的I/O网络模型支持和自动根据系统平台选择最有效I/O网络模型的方法。
HTTP模块(http)
提供HTTP处理的核心功能和部分功能模块。
Mail模块(mail)
提供邮件代理功能。
Stream模块(stream)
提供TCP/UDP会话的代理和负载相关功能。
upstream模块
提供七层代理和负载均衡
官方提供三种版本下载
Mainline version:主线版本,也叫开发版。最新版本,但没经过大量测试
Stable version:稳定版本,通过大量的测试,相对比较稳定的版本,生产环境使用该版本
Legacy version:往期的稳定版
Nginx 软件安装的方式有很多种
源码编译=>Nginx (1.版本随意 2.安装复杂 3.升级繁琐)
epel源=>Nginx (1.版本较低 2.安装简单 )
官方源=>Nginx (1.版本较新 2.安装简单 )
三种安装方式都需要安装运行环境
yum install -y gcc gcc-c++ autoconf pcre pcre-devel zlib-devel openssl-devel make automake wget httpd-tools vim tree make automake wget httpd-tools vim tree
部署阿里云epel源
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
安装nginx
yum install -y nginx
1.配置 nginx yum 源(必须使用官方源)
# vim /etc/yum.repos.d/nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
2.安装Nginx服务
#yum install nginx -y
1.下载源码包
#wget http://nginx.org/download/nginx-1.20.1.tar.gz
2.解压源码包
#tar xf nginx-1.20.1.tar.gz
3.配置安装环境(程序用户,安装路径等)
#1.创建用户和组,且不创建用户的家目录 #groupadd nginx -g 888 #useradd -u 888 -g 888 -s /sbin/nologin -M nginx #2.创建安装目录 默认安装到/usr/local/nginx/,建议安装到指定目录,目录路径根据公司要求来定义 #mkdir -p /app
4.进入解压目录,执行配置脚本进行预编译,生成Makefile
# cd nginx-1.20.1/ # ./configure --prefix=/app/nginx-1.20.1 --user=nginx --group=nginx #相关选项用法: ./configure --help #查看配置参数 --prefix= #指定nginx安装路径 --user= #指定nginx程序用户 --group= #指定nginx程序用户组 --with-**= #指定编译模块 --without-**= #指定不编译模块 --add-module= #指定第三方模块
5.编译安装
# make && make install #检查安装好的目录结构 #tree /app/nginx-1.20.1 /app/nginx-1.20.1/ ├── conf ├── html ├── logs └── sbin
6.做软链接
#ln -s /app/nginx-1.20.1 /app/nginx
7.配置环境变量
#写入启动配置文件 #echo "export PATH=$PATH:/app/nginx/sbin" >> /etc/profile #马上生效 #source /etc/profile
nginx #启动nginx。 等价于systemctl start nginx -s reopen #重启Nginx。 等价于systemctl restart nginx -s reload #重新加载Nginx配置文件,然后以优雅的方式重启Nginx。 等价于systemctl reload nginx -s stop #强制停止Nginx服务。 等价于systemctl stop nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务) -?,-h #打开帮助信息 -v #显示版本信息并退出 -V #显示版本和配置选项信息,然后退出 -T #检测配置文件是否有语法错误,转储并退出 -q #在检测配置文件期间屏蔽非错误信息 -p prefix #设置前缀路径(默认是:/usr/share/nginx/) -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf) -g directives #设置配置文件外的全局指令
Nginx 主配置文件 /etc/nginx/nginx.conf 是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束。
1.CoreModule 核心模块
2.EventModule 事件驱动模块
3.HttpCoreModule http内核模块
需了解扩展项
CoreModule层下可以有Event、HTTP
HTTP模块层允许有多个Server层, Server主要用于配置多个网站
Server层又允许有多个Location, Location主要用于定义网站访问路径
CoreModule核心模块
user nginx; #Nginx进程所使用的用户 worker_processes 1; #Nginx运行的work进程数量(建议与CPU数量一致或auto) error_log /var/log/nginx/error.log warn #Nginx错误日志存放路径 pid /var/run/nginx.pid #Nginx服务运行后产生的pid进程号
events 事件模块
events { worker_connections 1024 //每个worker进程支持的最大连接数 use epoll; //事件驱动模型, epoll默认 }
http内核模块
//公共的配置定义在http{} http { //http层开始 include mime.types; //引入MIME类型映射表文件 default_type application/octet-stream; //浏览器检测文件类型 access_log /var/log/nginx/access.log main //访问日志 sendfile on; //启用零复制机制 keepalive_timeout 65; //保持连接超时时间65s //使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机) server { listen 80; //监听端口, 默认80 server_name localhost; //提供服务的域名或主机名 //控制网站访问路径 location / { root /usr/share/nginx/html; //存放网站代码路径 index index.html index.htm; //服务器返回的默认页面文件 } //指定错误代码, 统一定义错误页面, 错误代码重定向到新的Locaiton error_page 500 502 503 504 /50x.html; } ... //第二个虚拟主机配置 server { ... } include /etc/nginx/conf.d/*.conf; //包含/etc/nginx/conf.d/目录下所有以.conf结尾 的文件 } //http层结束
[root@web01 conf.d]# cat /etc/nginx/conf.d/game.conf server { listen 80; #监听端口80 server_name game.tf.com; #域名 location / { root /code; #根路径 index index.html; #网站格式 } }
[root@web01 ~]#mkdir /code #创建源代码放置的目录 [root@web01 ~]#cd /code/ [root@web01 code]# unzip h5game.zip -d /etc/code #上传源代码文件,并解压到指定目录 [root@web01 code]# nginx -t #检查nginx的语法是否存在错误 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
方法一: [root@web01 code]# nginx -s reload 方法二:建议这种 [root@web01 code]# systemctl reload nginx
1.通过服务器的IP直接访问(不推荐)
2.通过假域名方式访问(推荐方式)
Windows修改 C:\Windows\System32\drivers\etc\hosts
10.0.0.7 game.zmj.com
在hosts文件最后添加IP及域名
3.使用ping命令测试域名解析是否正常
Nginx有非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志。日志格式通过
log_format 命令定义格式
log_format详解
在nginx默认的配置文件中, log_format 已经将日志格式定死,但是我们可不可以修改呢?
log_format 的作用是定义日志格式语法
# 配置语法: 包括: error.log access.log Syntax: log_format name [escape=default|json] string ...; Default: log_format combined "..."; Context: http
nginx默认日志格式语法如下
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
Nginx日志格式允许包含的内置变量
$remote_addr # 记录客户端IP地址 $remote_user # 记录客户端用户名 $time_local # 记录通用的本地时间 $time_iso8601 # 记录ISO8601标准格式下的本地时间 $request # 记录请求的方法以及请求的http协议 $status # 记录请求状态码(用于定位错误信息) $body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小 $bytes_sent # 发送给客户端的总字节数 $msec # 日志写入时间。单位为秒,精度是毫秒。 $http_referer # 记录从哪个页面链接访问过来的 $http_user_agent # 记录客户端浏览器相关信息 $http_x_forwarded_for #记录客户端IP地址 $request_length # 请求的长度(包括请求行, 请求头和请求正文)。 $request_time # 请求花费的时间,单位为秒,精度毫秒 # 注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地 址。 # $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中, # 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址
.access_log日志配置语法
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off; Default: access_log logs/access.log combined; Context: http, server, location, if in location, limit_except
Nginx Access日志配置实践
server { listen 80; server_name code.tf.com; #将当前的server网站的访问日志记录至对应的目录,使用main格式 access_log /var/log/nginx/code.tf.com.log main; location / { root /code; } #当有人请求改favicon.ico时,不记录日志 location /favicon.ico { access_log off; return 200; } }
nginx日志切割
使用logrotate切割日志
[root@nginx conf.d]# cat /etc/logrotate.d/nginx /var/log/nginx/*.log { daily # 每天切割日志 missingok # 日志丢失忽略 rotate 52 # 日志保留52天 compress # 日志文件压缩 delaycompress # 延迟压缩日志 notifempty # 不切割空文件 create 640 nginx adm # 日志文件权限 sharedscripts postrotate # 切割日志执行的命令 if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat/var/run/nginx.pid` fi endscript }
日志切割后的效果
[root@web01 ~]# ll /var/log/nginx/ total 4044 -rw-r----- 1 www adm 54438 Oct 12 03:28 access.log-20181012.gz -rw-r----- 1 www adm 28657 Oct 13 03:48 access.log-20181013.gz -rw-r----- 1 www adm 10135 Oct 12 03:28 error.log-20181130.gz -rw-r----- 1 www adm 7452 Oct 13 03:48 error.log-20181201.gz