nginx与apache的对比
nginx优点
nginx中INPUT OUTPUT模型
零拷贝技术
原理:减少内核空间和用户空间的拷贝次数,增加INPUT OUTPUT的效率
网络I/O 模型
同步,异步 : 消息反馈机制
阻塞和非阻塞
阻塞型I/O模型:不利于处理高并发
非阻塞型I/O 虽然可以在等待的时间内,去接待其他的应用程序,但是不会告诉nginx什么时候结束没有反馈机制,需要nginx不停的去访问,反而一直消耗资源。
多路复用I/O模型,是nginx使用的模型,多出来select应用进程,nginx不直接与内核交流,而由select程序交流
select poll epoll区别
select性能最差,epoll性能最好 在nginx中如果是linux平台则默认为epoll,而windows不支持,所以nginx默认采用哪种连接模型,视情况而定!
nginx工作逻辑
nginx模块
nginx使用场景
编译安装nginx过程
第一步
第二步 新建nginx用户便于管理
第三步切换到/opt下,下载软件包wget http://nginx.org/download/nginx-1.18.0.tar.gz
第四步解压
./configure --prefix=/apps/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_module
第五步 make make install
第六步 做软连接,为了让系统识别nginx 能使用起来
第七步 修改权限,因为新建立的nginx用户
这边其实可以直接启动nginx了,但是如果想停止的话,只能杀死nginx这个进程
第八步,所以要自启动nginx
配置文件的内容
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000[Install]
WantedBy=multi-user.target
最后启动nginx即可 systemctl start nginx
注意因为是新版的安装包,必须安装openssl-devel
表明nginx交给systemctl这个进程来管理,如果停止则 systemctl stop nginx
解释说明:
做一个软连接 为了让系统识别nginx
没做软连接之前,系统识别不了nginx
补充说明:如果正确使用sbin 或bin
查看第三方程序在哪个里面 pwd可以查看,如果在sbin就用sbin 如果在bin,就用bin
解析为什么软连接的的路径 make install生成安装目录 才会有nginx
有两种方法可以识别nginx
1.echo $PATH,将nginx的路径加入到此文件中
2.做软连接
指定配置,不以配置文件中的为准
nginx -g
修改一下 nginx -g 进程数
在改之前,停止nginx运行 然后在配置文件中,将文件中的配置文件工作进程数注释掉,随后再nginx -g 指定配置即可成功
查看语法是否有误
开启nginx进程 并且查看
master process:是nginx的主进程,用来管理worker process进程,并且可以读取配置文件
worker process:工作进程,用来处理客户的连接请求
停止nginx
1.先查看nginx的pid号 pid号在logs目录里面
pid号与主进程号是一样的
杀除进程号
killall -3 nginx中killall是根据进程名杀除,但是会出现误杀。
重载
或者使用nginx的-s选项 可以通过--help查看
如果要停止nginx,可以使用nginx -s quit 随后使用lsof -i :80 去检验
如果想使用重载,则使用nginx -s reload
平滑升级:就是在不关闭nginx的情况下,升级nginx
举例说明,先在官网下载一个最新版本的nginx,1.25
随后,查看自己的nginx版本号,nginx -v ./nginx -v 可以看见25版本
将最新版本的nginx挪到xshell中
然后使用./configuer 跟make 即可 不需要使用make install (怕会被覆盖)
./configure --prefix=/apps/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_module
随后查看一下,会生成objs的文件夹,此文件夹中,就存在25版本的文件
接下来要做替换,先找到24版本的nginx,改个名字
改完名字之后,再切换到25版本中的objs(因为里面有25版本的nginx的二进制文件)
接着,去24版本的路径中去查看
接着,继续切换到25版本的路径中
最后证实一下
或者通过客户端去访问服务端
回滚
日志分割
kill -USR1 <pid号> = nginx -s reopen
举例说明,日志分割,每天都要生成新的日志 怎么才能让nginx知道新日志的产生,并且将日志内容写入新的日志里面
打开第二个终端去curl第一个终端,然后再次访问logs 再次查看
访问之后,再进入第一个终端里面,可以查看到此时日志是有记录的
模拟日志分割 将原来的文件改名,然后再建立一个新日志文件
再次利用第二个终端去访问curl一下,然后观察ll logs的日志情况
可以观察到日志文件的内容还是在旧文件里面,并没有在新文件里面产生日志
所以要nginx知道,要把内容加载到新日志文件里面
然后第二终端再curl 在观察ll,此时nginx已经知道并且把内容传到新日志里面
这边还可以使用kill - USR1 <pid号> ,这边必须要找到主进程pid号
查看更多的信号
认识nginx里的主配置文件
修改版本 或者关闭版本
在没关闭版本之前,使用另外一个curl -I 查看头部信息 查看一下
在nginx主配置文件中修改,并且要在http配置中修改,因为版本跟网页相关 所以在http配置中修改
随后在另外一台终端再curl -I 因此看不见版本号了
自定义版本号
第一步,去修改源码包里面的文件 core为核心代码
改完之后为
第二步 去改头部信息
第三步 再从头编译安装nginx
然后 make make install
然后重启nginx
最后,在另外一个终端再curl
这边为什么是lucky,因为在主配置文件中 server_tokens 0ff了
如果想看nihao/9527,则在主配置文件中修改即可 改成on
随后重载
在另外一个终端curl
cpu与work进程绑定(cpu的亲缘性)
进程运行时,会改变cpu的地点,比如一开始运行在第一块cpu上,下面运行会在第二块进程上,来回切换会有进程消耗,想把进程固定绑在一个cpu上面
实际配置在主配置文件中添加
worker_cpu_affinity 00000001 00000010 00000100 00001000
然后再次观察一下主进程 所以绑定起来
pid路径
在nginx主配置文件中修改即可
nginx进程的优先级 优先级区间为-20 ~ 19 (有个0)
在ps elf中可以查看 这两个相加取小的值,为优先 nginx如果是web网页,优先级应该高
nginx优先级默认为0
如果让nginx的进程高点,可以提高效率
在主配置文件中修改 加上worker_priority (数字)即可
服务器是否后台还是前台运行
一般来说,服务器都是后台运行,服务器一旦运行,则一直运行,除非人为停止
如果想修改,则在配置文件中修改
daemon on:表示后台运行
daemon off:表示前台运行
只有master模式没有worker模式
全局配置
在全局配置中的文件数要跟event配置中的进程处理连接数要相同!!
补充:如果要向提高每个工作进程的连接数,上面文件数跟连接数只是在程序上面设置,系统也要设置。
临时修改 ulimit -n 数字
缺点:服务器重启之后,就会还原变成默认值1024
永久修改: 进入、etc/security/ (进入重要的配置文件中)
验证:
重启服务器
验证一下,成功
问题展示:
如果想要服务器添加5万并发,该如何设置(服务器有2个cpu) 系统设置(设置最大能打开的文件数)+程序设置
第一步:先查看cpu数量 (有两个,所以五万除以2,所以每个进程的文件数跟连接数改为25000,五万的一半)
第二步 在nginx主配置文件中修改 主进程数、文件数、连接数、use epoll
以上步骤为在程序中设置最大的进程数,同时系统也要设置
第三步 在/etc/security/中配置最大打开的文件数
要重启
第四步保存后退出,并且重启nginx服务
验证一下:
打开第二终端(相同)查看进程号
查看max open files 为25000成功
正常的并发数量:文件数*连接数 此时nginx为网站服务器
反向代理=文件数*连接数 /2 此时nginx为代理服务器
nginx要处理 客户端过来的连接 还有 给客户端服务器发来的连接
http配置
例如,当在网页中访问自己的主页,
这个里面的格式就是因为http中main决定的。
web服务监听设置
访问前缀为ky33时,就是从/var/www/html中去找到abc.html文件
访问前缀为ky35时,就是从/var/www/root中去找到abc.html文件
root是路径
解析 :先把ky33当做文件去看,会优先访问这个目录有没有ky33这个文件,如果有直接返回,如果没有,则把ky33当做目录,去目录里面找index.html文件,如果还是没有则出现404报错
举例说明
在nginx.conf配置文件中修改内容
在conf配置文件中建立var文件夹,再分别在www web里面建立ky33 ky35的目录,并且写入文件内容
最后重启一下nginx服务
进入网页中输入网址
成功
server块构建虚拟主机 实际只有1台, 好像有多台主机(建立独立的配置文件 构建不同虚拟主机 PC端和手机端 ) 基于域名
一般是在自配置文件配置,因为构建的是网端,所以在httpd里面修改
在主配置文件里面的子配置http里面设置include,inclide 为加载的意思,配置include,是为了只要在 以.conf结尾的文件会读取http网页
第二步,去nginx建立文件夹
切换到conf.d的文件夹中去,然后去修改文件里面的配置内容
去建立一个/opt/html的路径
将一写内容传给/opt/html/index.html网页文件
第三步再重新建立一个m.conf的文档
第四步打开另外一台主机,修改一下host,让域名得到解析
第五步 再去curl 成功
利用端口号 IP地址同样的步骤只需要在listen 分别加入 端口号或者ip地址即可
location
追踪你的URL,可以根据客户访问的不同URL 访问不同的目录,可以写多个location
location的局部设置优先级高于全局配置的root路径 例如:这边会访问/data
再去第二终端去curl,证实location优先级高
如果要访问不同的url 可以设置多个location
如果m.conf与pc.conf设置的内容一样,那么先访问那个配置
根据abcd...前面的字母排序,m在p前面 则先访问m.conf
location的语法规则
=的优先级最高
案例:
~* 用来对用户请求的uri做模糊匹配,uri中无论都是大写、都是小写或者大小写混合,此模式也都会匹配,通常使用此模式匹配用户request中的静态资源并继续做下一步操作,此方式使用较多注意: 此方式中,对于Linux文件系统上的文件仍然是区分大小写的,如果磁盘文件不存在,仍会提示404 ~* 虽然 不区分大小写 但是系统的文件系统区分大小写
进入static1中,拖一个图片进入
图片拖进来之后,要改一改名字,static2 static3都是以上操作,(托照片+改名字)
static2 static3 分别拖两张图片
先匹配static1 然后匹配static3 再匹配static2
access 模块 四层控制
deny:表示拒绝访问
allow:表示同意访问
本机访问:
其他机器访问(在另一个终端访问)
alias别名
举例说明,在ky35中,将root改为alias,然后去访问网页,会显示错误,在nginx.logs里面看一下错误日志
因此,只需要在web文件夹中在建立一个abc.html的文件即可
然后再访问网页,成功
root与alias
nginx访问状态统计设置 (nginx是一个网站,要看当前并发量、处理多少连接、多少人访问)
第一步查看模块是否下载
nginx -V
模块设置
如果想关闭模块前面加without 想开启 加 with
第二步 开启模块
进入到nginx.conf的配置文件中修改