几乎所有的web服务器都是nginx 功能与apache 类似
最主要的功能是提供web服务和反向代理,虚拟主机是web服务器的基本要求 这样的话就可以支持 我同一个web服务器上可以运行多个网站 虚拟主机的主要作用,他还支持http https 地址从写 还有反向代理,现在还在运行apache的几乎都是老的站点了,如果新的站点 几乎都是使用nginx
nginx 从性能上来说 比apache 要高得多 从配置上说比apache 更加简单 语法简单 更加易读
国产的有个OpenResty 这是基于 nginx 做的二次开发
除了这个以外还有 淘宝基于nginx 开发一个 tengine
nginx
特点免费开源,nginx 也有商业版
nginx 主要功能:httpd服务器 和反向代理服务器 邮件代理服务器 以及tcp udp 代理服务器
解决C10K 问题,10k就是10千就是1w,10年前主流的服务,几乎没有任何一个服务 单机服务能够支持并发量1w并发请求的能力,几乎没有
所以nginx 出来以后打破了这个规律 我一个nginx 同一时间 并发请求数 可以超过1w
说明性能极强
还有二次发行版 Tengine 淘宝发行的 做的二次开发 也是开源的
Tengine官网:https://tengine.taobao.org/
nginx官网:https://nginx.org/
国内用Tengine 的非常多 因为他的配置几乎和nginx 是一样的 有些微小的差别
http服务器 http就是web服务器
特点 整个nginx 是模块化设计 从配置编译 就能感觉到 有些功能你不需要的话 可以不装 需要就装 和apache 类似 可以使用官方自带的模块 也可以使用第三方模块
nginx 可靠性非常高 几乎不会down机
支持热部署 可以不停机 直接升级 比如从1.16 升级到1.18 可以不关闭nginx 直接升级 热更新 还可以更换日志文件
低内存消耗 就是1w个 连接同时进来 他消耗内存才2.5m 左右
nginx 服务器本身 对内存要求不高
未来生产及服务器 应该是16G 就够用了 但是跑些其他的大型应用的话 都是跑几百个g,nginx 对内存消耗非常低
event-driven /aio /mmap /sendfile
enent-driven 事件驱动 aio
这四个功能是提高性能的:mmap 是 内存映射 sendfile 叫高性能文件传输、aio 是异步io、event-driven 事件驱动 也是aio的一种机制
本来nginx 的很多功能加一起 就产生了nginx性能非常强,基本功能静态web服务器.
他和apache 一样只能处理静态请求如果想处理动态请求他需要 其他服务结合
之前apache和lamp结合 apache+linux+mysql+php
这是apache 和php 结合的 是因为apache 处理不了 php 语言的动态请求
nginx 也一样 要结合 php 来做动态的时候也一样 他需要php 语言 结合java 做动态请求 安装java
纯web 服务器本身无法处理 动态请求
它本身的功能就是静态资源的web服务器 他无法 提供静态
结合java 结合c++ 结合python
第一个功能叫静态资源的web服务器
第二个功能叫http 协议 反向代理服务器 最主要的就是这两个功能
一个叫web服务器 一个叫http 反向代理的服务器
http 在七层模型里面 在第七层 应用层协议
http 被称为七层反向代理服务器 相对应的tcp 和udp 传输层 在四层
称为四层服务器 nginx 在1.9 版本之前 是没有四层的能力
从1.9 后 才提供了四层的能里 提供了tcp 和dup 反向代理
FastVGI (LNMP) 还有uWSGI(python) 协议
模块化是非DSO 的 就是不能动态化加载的特性
这是他的一些特性和基本功能
虚拟主机适合apache 是一样的 支持长连接 访问日志
nginx 组织结构
进程模型: 正常安装启动一个nginx 他的启动状态
开始安装:
先装一个nginx
创建一个目录放进去
wget http://nginx.org/download/nginx-1.18.0.tar.gznginx 很小 都不到1m
整个nginx 一共没有多少代码 就1w六千多代码
tar xf nginx-1.18.0.tar.gz 
cd nginx-1.18.0/
chown -R root:root *把属主属组换成root
然后就是编译 配置 安装了

目录里面有个conf/ 这个目录文件
./configure --help
查看 他支持那些参数
有两大类 除了--prefix

还有with 开头的
with和without
这个without 是 如果 有with 没有hout
比如 --with-pcre
说明默认没有安装这个nginx 没有安装 没有这个模块 这个功能如果生产商需要的话 牛需要把他装起来 就需要执行他 --with 说明没有装 默认 nginx 不装的功能
另一个 --withhout 说明默认已经安装的功能 他已经安装了这个功能了
如果你加上了这条 就代表 把这个卸载了 不用了 相当于把这个功能关闭了
这里最主要的两项 --with --withhout

我们在编译配置 之前需要装几个依赖包
只要是c语言的东西 都需要装依赖包
apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev libssl-dev libxslt1-dev libxml2-dev libgeoip-dev openssl  libgd-dev-y在windows 上称为软件 在linux 称为应用 就是app
我们创建个apps目录
mkdir /apps
groupadd -g 1002 nginx
useradd -g 1002 -u 1002 nginx-s /sbin/nologin创建用户和组 启动nginx 使用
Ubuntu和centos 创建用户 不太一样
创建的适合 如果不指定家目录 它默认是不创建家目录的
在创建用户和组的时候 他俩的id 有可能会不一样 所以我们指定一下 让他俩 id一样
这个我们授权的时候用 我们授权的时候 不是看组和用户名字是否一样
而是看 组和用户id 是否一样
./configure \
    --prefix=/apps/nginx \
    --user=nginx \
	--group=nginx \
    --with-threads \
    --with-file-aio \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_xslt_module \
    --with-http_image_filter_module \
    --with-http_geoip_module \
    --with-http_sub_module \
    --with-http_dav_module \
    --with-http_flv_module \
    --with-http_mp4_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_auth_request_module \
    --with-http_random_index_module \
    --with-http_secure_link_module \
    --with-http_degradation_module \
    --with-http_slice_module \
    --with-http_stub_status_module \
    --with-stream \
    --with-stream_ssl_module \
    --with-stream_realip_module \
    --with-stream_geoip_module \
    --with-stream_ssl_preread_module \
    --with-compat  \
    --with-pcre-jit&& make && make install编译配置完 会生成一个 Makefile

里面内容
我们编译的时候 事实上就是去找这个文件
default: build
clean:
rm -rf Makefile objs
# 删除以前老的环境
build:
$(MAKE) -f objs/Makefile
# 构建一个新的
install:
$(MAKE) -f objs/Makefile install
#install 就是安装 build 和install 通常是一起来做
modules:
$(MAKE) -f objs/Makefile modules
upgrade:
/apps/nginx/sbin/nginx -t
kill -USR2 `cat /apps/nginx/logs/nginx.pid`
sleep 1
test -f /apps/nginx/logs/nginx.pid.oldbin
kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin`

make && make install然后安装
安装完后 给我们生成了四个目录

conf/ #配置文件
html/ #默认跟目录
logs/ #日志
sbin/ #启动脚本
里面就一个命令
我们平常改的就一个conf/ 目录里面的

这个目录里面有很多文件
主配置文件就nginx.conf 这个文件
看下这个主配置文件
vim /apps/nginx/conf/nginx.conf
user nginx;
因为 我们指定了这个用户
其他的不用管
nginx 启动
/apps/nginx/sbin/nginx
他事实上起来的是两个进程 一个叫nginx master 一个叫nginx worker
这就是nginx 的进程模型 但是这个worker 不一定是一个 因为我们当前 指定了一个
一般情况下 master 就一个 worker 数量最少一个 最多无限 自己指定
指定方法
vim /apps/nginx/conf/nginx.conf
比如我们改为10个
保存
/apps/nginx/sbin/nginx -t测试配置目录语法是否正确

看到ok 就代表正确

说明配置文件没有错
/apps/nginx/sbin/nginx-s reload不关闭nginx重新加载配置文件
然后我们看下 worker 是不是10个

那这个就是worker 的数量
worker 就是工作的意思
master 就是老板
worker 工作进程
这个工作进程数量是可以自己控制数量的
master 主进程 作用
1读取配置文件 并检测有效性
比如下图 我们刚才nginx -t 读取配置文件的时候 是master 来完成

这个master 会读取我们在配置文件的更改项 我们更改了什么 他就会去读取
读取完成了 后 会按照更改的需求去从新生成worker 进程
2建立 绑定 和关闭socket 连接 就是目前 nginx 本身是个web 服务或者反向代理服务
他是给客户提供访问 的一个应用级 的服务 如果这个时候 我在执行reload 过程的时候
我有用户请求正在连接进来了 那reload 会不会影响到 已有的请求 事实上reload 是不影响的 因为他会来把我们正在连接进来的请求 处理完成以后 他才会把我们这个worker 进程重启 新的请求进来的时候 需要master来 第一次连接用他来连接 但是具体的任务分发给worker
3 按照配置生成管理和结束工作进程
worker 叫工作进程 他的工作进程就是用master 进程来启动的 master来负责新的worker 生成结束 以及更新 负责管理worker的
4 接受外界指令 比如说重启 升级 或退出服务器
指令就是nginx 就这一个指令 也就通过这一个指令来传给master 刚才指定 nghinx -s reload 就是传送给master master 负责nginx 指令
这个指令不光是这个
停止服务
/apps/nginx/sbin/nginx -s stop为了方便 使用 我们命令加到环境变量里面去
vim /etc/profile最后一行加入
export PATH=/apps/nginx/sbin:$PATH
source /etc/profile然后就可以直接使用
nginx -h #查看帮助文档
nginx #启动nginx
nginx -t #检测配置文件是否可以使用
nginx -s reload #不关闭加载配置文件
nginx -s stop #关闭nginx
nginx -v #查看nginx版本
nginx -V #查看当前编译指定的参数
nginx -T #列出当前所支持的模块
nginx -q #测试配置
nginx -s #传递个信号给他
nginx -p #设置prefix 路径
nginx -c #指定配置文件 默认是找/conf/nginx.conf 如果想让他找其他的 可以指定-c
nginx -d #设置全局配置文件输出目录
5 不中断服务 实现平滑升级 重启服务并应用新的配置
6开始日志文件 获取文件描述符
7 不中断服务,实现平滑升级,升级失败进行回滚处理
8编译和处理perl脚本
prel 脚本就是正则表达式
以上是master 进程的功能 master就一个 就是老板 老板只能有一个
worker 进程功能 worker 就是干活的小兵
正常处理请求的进程 正常去访问一个网站 去京东 去淘宝 去百度 我们是从本地发起一个请求 去到淘宝服务器 我们发请求给我们响应 正常给我们响应的是 就是worker 进程 所以worker进程会很多
比如说 1万个人 2万个人 同时去连接服务器 worker 进程越多处理能力越强 但是首先cpu资源够用
worker 进程主要是
1 接受处理客户的请求
2 将请求以此送入各个功能模块进行处理
本身nginx 是模块形式的 就是不同的功能会送到不同的模块来处理
3 IO调用 获取响应数据
就是我们正常去网站 去任何一个网站去搜索一个东西 那个东西放在哪里 他放在它对应服务器上的一块磁盘上 访问一个文件 访问一个图片 放在一块磁盘上 这个磁盘是我们要发起的IO请求 IO请求就是从我当前 应用什么东西 到磁盘上 最终放在内存里 响应给我们客户端 这叫IO请求 所以worker 进程负载IO调用 获取响应数据

比如我们访问nginx 官网 他会给我们显示一个页面出来 他显示download.html 页面 这个页面肯定放在 他服务器上的一块磁盘上面 就一个分区上 一个磁盘上 它通过这种方式 从磁盘上 拿出来 拿到内存上运行 这个过程叫IO 请求 从硬盘上拿到内存上 然后从内存上传给我们 这个就是一次简单的io 请求
4 与后端服务器通信 接受后端服务器的处理结果
5 缓存数据 访问缓存索引 查询和调用缓存数据
nginx 本身是有缓存的能力的
6 发送请求结果 响应客户端的请求
我们去访问网站的时候 给我们响应的是worker 进程
7 接受主进程指令 比如重启 升级 和退出等
比如我master 发出一个请求 关闭服务 这时候master接受这个指令 关闭master 之前先把worker 关闭掉 master告诉worker 进程关闭
nginx 模块介绍
核心模块:core module
标准模块:
HTTP模块: ngx_http_*
HTTP Core nidykes 默认功能
HTTP optional modules 需编译时指定
Mail 模块 ngx_mail_*
Stream 模块 ngx_stream_*
第三方模块
核心模块:是 Nginx 服务器正常运行 必不可少 的模块,提供 错误日志记录 、 配置文件
解析 、 事件驱动机制 、 进程管理 等核心功能 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、HTTP响应头设置 等等 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比 如: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等 邮件服务模块:主要用于支持Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持 第三方模块:是为了扩展 Nginx 服务器 应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等

我们去看下官网

documentation 这里就是所有nginx 模块
nginx 配置文件介绍:

第二个worker进程 一般根据cpu核心数来确定的 如果确定不了那么就些 auto 自动确定

错误日志和级别 这是相对路径 在nginx 目录下的
会记录info 级别开始记录
nginx 错误日志有7个级别

每个程序启动后都会有一个进程号 这个进程号保存在logs目录下nginx.pid目录
nginx 配置段分为 全局配置 就是在大括号外 没有大括号围起来的 配置是对全局生效的

有一层大括号围起来的 叫顶级配置
顶级配置里面还有一些大括号 叫二级配置 大括号内套大括号 二级配置
还会有三级配置

这是其中一个顶级配置 叫4键配置
worker 进程的数量默认为1 但这项的意思 是 一个worker 进程同时能处理的请求 客户端连接有多少 默认是1024个
如果是10个worker 进程 就是10*1024 一个worker 进程同时接受客户端的连接数有多少个 通常改为10240

http配置 是最主要的配置 nginx最主要的功能http 服务器
http 的功能都在这里 http配置 这里面不光可以配置http的配置 还可以 配置http的反向代理也可以在这里配置
http 配置就是我们默认在里面启动一个http 服务 http服务默认端口号是80
nginx 配置的每一行的结尾必须是分号; 不然报错
http {
include mime.types;
# include 是加载的意思 加载 mime.types 这个文件 就是把一个外部不是nginx.conf 里面的其他文件给加载到里面来 直接些 mime.types这个文件名 说明这个文件和 nginx.conf同一个目录下 级别是一样的 mime.types 这个文件定义的是 各种各样的文件类型mime意思 是多用途互联网邮件扩展 就是当前互联网上 能够识别的所有文件类型 就是这些文件 在我们互联网传输过程直接能识别的
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
#log_format是访问日志的格式 就是我们正常一个ip请求一个web 服务 会留下访客记录
以后排查问题可以用log_format是定义了默认的访问日志的类型格式 log_format 叫日志字段 main是我们取的名字 可以随便改 后面这些都是变量
$remote_addr 远程ip 就是远程地址客户端地址是谁
$remote_user 客户用户是什么
[$time_local] 本地的时间 这个请求来的时间是什么
$request 请求的要求是什么
# '$status $body_bytes_sent "$http_referer" '
$status状态
$body_bytes_sent 请求包头大小
$http_referer记录了 我当前访问网站的上一跳是谁 (非常重要)
# '"$http_user_agent" "$http_x_forwarded_for"';
# $http_user_agent" 客户端请求是谁 用的啥浏览器 都给你记录下来
$http_x_forwarded_for 跳转地址
以上是 nginx 默认使用的日志格式 还可以自定义其他的 把#注释去掉
#access_log logs/access.log main;
# 默认的访问日志的路径 它定义你的访问日志在哪里访问日志格式是哪个默认路径是啥
main 格式就是main 这个是格式的名字 因为就这一个格式 我们自己定义格式 然后在这里选择 使用的格式的名字


keepalive_timeout 65;
# 长连接 为65我们正常一个访问ip 请求 是一个tcp 服务 首先要进行三次握手
是要消耗时间的 比如我们访问一次淘宝 访问一次京东 访问完了就给我们断了 下次再访问 是不是还要建立三次连接? 这个字段是保证连接的时间 正常情况下 如果我们发起一次请求 时间段内 65秒内 保持65秒不断 如果65秒内再访问 那就可以不用再建立三次握手 而是直接使用这个已有连接 连续65秒没有数据传输 就会断 一般设置为60-65秒
HTTP协议 主流版本 :1.0 1.1 2.0 几乎再用1.0 和1.1 1.0 也很少用了 1.1已经退出20多年了 从9几年就出来了
1.0 和1.1 版本的比较大区别就是这个 keepalive_timeout 65; 从1.1 开始推出的 长连接
支持长连接 所以1.0 的性能没有 1.1 好

这个server 就是nginx 的虚拟主机
里面定义了 80端口号
一个虚拟主机 前后大括号要对应
server {
#server 是二级配置
listen 80;
#代表的我监听的端口号
server_name localhost;
#虚拟主机的名字 就是域名是什么 localhost是本机的意思
location / {
localtion / 这个/ 的意思是
#一个server 里面可以配置多个location 一个http里面也可以配置多个server
一个nginx里面可以配置多个虚拟主机
一个server 里面最少得有一个 location
root html;
#root 是根路径是哪里 这个html目录再当前nginx 目录下的 这个目录是可以更改的
#下图_temp 是启动nginx 产生的临时目录 所有结尾是_temp的都是临时目录
这个html是目录 因为他是相对路径 所以看着不太像路径

html/ 里面有他的前端页面

<!DOCTYPE html>
<html>
#html 是个大括号 大字段 对应结尾的
<head>
#头的意思 Welcome to nginx!对应的nginx 测试页
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
#以上定义了字体 宽度大小
}
</style>
</head>
<body>
#body 下面是具体的代码
<h1>Welcome to nginx!</h1>
#h1 是最大的标题 内容是Welcome to nginx!
<p>If you see this page, the nginx web server is successfully installed and
#p是一段的意思
working. Further configuration is required.</p>
#<p>到</p>是一段
<p>For online documentation and support please refer to
#这又是一段
<a href="http://nginx.org/">nginx.org</a>.<br/>
这一段 加了个<a 这个是超链接 就是
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
#链接到这里面http://nginx.com/
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
index index.html index.htm;
#根目录默认找index.html 或index.htm
}
我们按着这个方式再定义一个server

加到这里面

server {
        listen 80;
        server_name ;
        location / {
        root /data/webdir;
        index index.html index.htm;
   }            
        }保存退出
nginx -t
查询下配置文件 语法是否错误
因为我们server 里面写了 的网站根目录是在/data/webdir
index.html 或index.htm所以我们需要去创建这个目录 以及文件
mkdir /data/webdir而且我们要解析这个域名
找到hosts 文件
添加一条
192.168.80.131 nginx -s reload启动

返回403 的意思是 要么没有权限 要么没有首页
因为我们没有创建index.html 所以找不到首页
我们自己创建一个把
vim /data/webdir/index.html123

以上是创建了个虚拟主机
但是通常情况下 我们会把虚拟主机指向一个目录
把虚拟主机写到那个文件里面
我们把刚才再nginx.conf 里面写的虚拟主机删掉
然后加入
include vhost/*.conf;

然后我们在当前目录下 /apps/nginx/conf/ 创建vhost/这个目录
mkdir /apps/nginx/conf/vhost/然后进去写一个 .conf
vim /apps/nginx/conf/vhost/.confserver {
        listen 80;
        server_name ;
        location / {
        root /data/webdir;
        index index.html index.htm;
   }            
        }nginx -t测试配置文件是否正确
nginx -s reload不关闭 让配置文件生效
然后去访问
就ok了
未来我们生产上建的所有虚拟主机 都是这种方式来
因为我们生产上虚拟主机建的非常多 可能一个nginx 几百个 上千个都很正常
如果都写到配置文件里面 会特别特别长 有问题 也不容易排查
所以我们要每个虚拟主机 单独建一个 文件 一看就知道 虚拟主机名称不一样
那个有问题 直接去看 指定的文件就可以了
比如我们 搞个破坏 把.conf 给改一下
然后
nginx -t
他会告诉你.conf 第九行出错了
这样一看就能看到 很方便
include vhost/*.conf;
这个需要添加到 http 字段才可以 如果在server 字段里面 是不可以的
 
 
                     
            
        













 
                    

 
                 
                    