Nginx (engine x) 是一款轻量级的HTTP服务器软件,优点:稳定性好、丰富的功能集、简单的配置文件和低系统资源的消耗,以及占有内存少,并发能力强(单台物理服务器可支持30000~50000个并发请求)相比apache并发请求没有nginx高,apache的并发在2万左右
Nginx 的应用场景(或功能)
静态处理:不管是httpd还是nginx默认只能处理静态页面
反向代理:不直接处理客户端的请求,而是将请求转交给其它服务器
负载均衡:跟反向代理相结合,负责将客户端的请求转交给其它压力较小的服务器
资源缓存:对客户端经常访问的数据进行缓存,从而加快客户端的访问的速度
安全防护:nginx对自己本身有一定的防护措施
访问限制:类似于apache的order deny,allow
访问认证:对所访问的网站,进行添加用户名和密码
一、 I/O(输入/输出)的简介
每次I/O,都要经由两个阶段:
1、将数据从磁盘文件先加载至内核空间(缓冲区),等待数据准备完成,时间较长
2、将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
同步/异步关注是被调用者消息通信机制
同步:调用者等待被调用者返回消息,才能继续执行
例如:老板布置你任务,一直向你询问有没有完成,完成了老板做下一件事,这种通信机制成为同步
异步:被调用者通过状态、通知或者回调机制主动通知被调用者的运行状态
例如:老板分配你任务,任务进度状态你会向老板汇报,老板做自己的事情,不会向你问询结果
同步和异步的区别 | |
同步 | 被调用者不会返回任务的状态,需要调用者不停的询问 |
异步 | 被调用者会向调用者返回任务的状态,不需要调用者不停的询问 |
阻塞/非阻塞:关注调用者在等待结果返回之前的状态
阻塞(blocking):指I/O操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起
例如:手洗衣服,没洗完之前你都是被占用的状态。
非阻塞(nobloking):指I/O操作被调用后立刻返回一个用户状态,无需等IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起
例如:全自动洗衣机,不需要占用你时间,洗完会通知你,在期间你没有因为洗衣服被占用时间
I/O的模型有:同步阻塞、同步非阻塞、异步阻塞(IO多路复用select)、异步半阻塞(信号驱动型apache)、异步非阻塞(异步IO模型nginx)
二、 nginx的模式
nginx有两个工作模式:master-worker模式和单进程模式
master-worker:在该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)
模式的优点 | |
1、稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master 进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率 | |
2、配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能 | |
3、处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务 |
单进程模式:nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。所以,该模式一般只在开发阶段和调试时使用,生产环境下不会使用
三、nginx的安装
安装方法一:网络yum安装
保证可以ping通外网
[root@C7--01 ~]# ping www.baidu.com
PING www.a.shifen.com (183.232.231.174) 56(84) bytes of data.
64 bytes from ptr.cq.chinamobile.com (183.232.231.174): icmp_seq=1 ttl=51 time=380 ms
64 bytes from ptr.cq.chinamobile.com (183.232.231.174): icmp_seq=2 ttl=51 time=114 ms
64 bytes from ptr.cq.chinamobile.com (183.232.231.174): icmp_seq=3 ttl=51 time=106 ms
64 bytes from ptr.cq.chinamobile.com (183.232.231.174): icmp_seq=4 ttl=51 time=108 ms
在:nginx: 利诺克斯包 网站可以使用网络yum安装 :
安装过程按照上面的步骤就可完成
启动命令 : nginx
安装完成后查看端口
安装方法二:源代码安装;在官网下载nginx软件包
官网路径 :nginx: 下载nginx: downloadnginx: 下载
本次下载nginx-1.18.0版本
上传 nginx-1.18.0.tar.gz 软件包
[root@C7--01 ~]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel #安装相关软件包
[root@C7--01 ~]# ls
anaconda-ks.cfg nginx-1.18.0.tar.gz yum.sh
[root@C7--01 ~]# useradd -M -s /sbin/nologin nginx
[root@C7--01 ~]# tar -zxvf /root/nginx-1.18.0.tar.gz -C /usr/src
......
...
[root@C7--01 ~]# cd /usr/src/nginx-1.18.0/
[root@C7--01 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_dav_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-http_ssl_module --with-http_gzip_static_module
........
....
[root@C7--01 nginx-1.18.0]# make && make install
....
..
.
[root@C7--01 nginx-1.18.0]# /usr/local/nginx/sbin/nginx -t #测试安装是否成功
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@C7--01 nginx-1.18.0]# /usr/local/nginx/sbin/nginx #启动
[root@C7--01 nginx-1.18.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
访问
安装完成
四、nginx的配置文件介绍及操作
注意:安装方法不同路径也不相同
1、配置文件介绍
模块 | 功能 |
---|---|
main(全局设置) | 设置的指令将影响其他所有设置 |
events(nginx工作模式) | 设置工作模式和连接数 |
http(http设置) | 设置超时时间等等等等 |
sever(主机设置) | 主要用于指定主机和端口 |
location(URL匹配) | 用于匹配网页位置 |
1.Main位于nginx.conf配置文件的最高层
2.Main层下可以有Event、HTTP层
3.HTTP层下面有允许有多个Server层,用于对不同的网站做不同的配置
4.Server层也允许有多个Location
[root@C7--01 ~]# vim /usr/local/nginx/conf/nginx.conf #进入配置文件
----------------------------以下是全局配置端(main)
1
2 #user nobody; #设置master进程启动后,fork出的worker进程运行在哪个用户和用户组下;默认由nobody账号运行
3 worker_processes 4(或auto); #指定工作衍生进程数(一般等于CPU的总核数或总核数的两倍)
worker_cpu_affinity 0001 0010 0100 1000 #将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的
4 worker_cpu_affinity auto #自动绑定设置
5 #error_log logs/error.log; #指定错误日志存放的路径
6 #error_log logs/error.log notice; #错误日志记录级别
7 #er nobody;
8 # 3 worker_processes 1;
9 # 4
10 # rror_log logs/error.log info;
11
12 #pid logs/nginx.pid; #指定进程pid的存储文件位置
13
14 worker_rlimit_nofile 512000; #工作进程最大打开文件数
15 events { #事件模块
16 use epoll; #使用的网络I/O模型,Linux推荐使用epoll模式;默认为epoll模式
17 worker_connections 1024; #用于定义Nginx每个进程的最大连接数,默认是1024
18 }
19
20 http {
21 include mime.types; #导入支持的文件类型
22 default_type application/octet-stream; #设置默认的类型,会提示下载不匹配的类型文件
23
24 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用
25 # '$status $body_bytes_sent "$http_referer" '
26 # '"$http_user_agent" "$http_x_forwarded_for"';
27
28 #access_log logs/access.log main;
29
30 sendfile on; #用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞
31 #tcp_nopush on; #在开启了sendfile的情况下,合并请求后统一发送给客户端
32
33 #keepalive_timeout 0;
34 keepalive_timeout 65; #设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接;单位是秒
35
36 #gzip on; #开启文件压缩
37
38 server { #定义作为web服务器的相关属性 可以有多个
39 listen 80; #监听的端口
40 server_name localhost; #设置server name,可以以空格隔开写多个,支持正则表达式,如 *.aaa.com,www.aaa.* ~^www\d+\.aaa\.com$ default_server
41
42 #charset koi8-r; #设置编码格式,默认是俄语格式,可以改为utf-8
43
44 #access_log logs/host.access.log main; #设备访问日志
45
46 location / { #定义一个虚拟主机的属性,所有的web服务必须定义成一个虚拟主机
47 root html; #指定网站目录
48 index index.html index.htm; #指定默认网页文件,此指令由ngx_http_index_module模块提供
49 }
50
51 #error_page 404 /404.html;
52
53 # redirect server error pages to the static page /50x.html
54 #
55 error_page 500 502 503 504 /50x.html; #当发生错误的时候能够显示一个预定义的uri(相对路径)
56 location = /50x.html {
57 root html;
58 }
59
2、nginx的相关操作
nginx -h # 查看帮助信息
nginx -v # 查看nginx版本
nginx start # 启动nginx
nginx -s quit # 关闭nginx,完整有序的停止nginx,保存相关信息
nginx -s stop # 关闭nginx,快速停止nginx,可能不保存相关信息
nginx -s reload # 重新载入nginx,当配置信息需要重新加载配置时使用
nginx -t -c filename # 测试nginx配置文件是否正确
nginx -s reopen # 重新打开日志文件
3、yum安装的nginx的路径位置
[root@C7--01 ~]# rpm -ql nginx #查看所有nginx路径
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.21.4
/usr/share/doc/nginx-1.21.4/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx
源代码:安装在哪里文件就在哪里也可以使用上面的命令查看
4、nginx访问日志介绍
先看一下http的请求和返回
[root@C7--01 ~]# curl -v 192.168.2.1
* About to connect() to 192.168.2.1 port 80 (#0) #请求行
* Trying 192.168.2.1...
* Connected to 192.168.2.1 (192.168.2.1) port 80 (#0) #请求头
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.2.1
> Accept: */* #请求数据
>
< HTTP/1.1 200 OK #状态码
< Server: nginx/1.18.0
< Date: Fri, 19 Nov 2021 14:48:37 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Fri, 19 Nov 2021 14:33:40 GMT
< Connection: keep-alive
< ETag: "6197b5c4-264"
< Accept-Ranges: bytes #单位bytes
<
<!DOCTYPE html> #响应正文
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
* Connection #0 to host 192.168.2.1 left intact
nginx的文件与apache的文件有一点不一样
nginx的文件是acces.log、error.log
apache的文件是access_log、error_log
[root@C7--01 ~]# vim /usr/local/nginx/conf/nginx.conf
21 #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
22 # '$status $body_bytes_sent "$http_referer" '
23 # '"$http_user_agent" "$http_x_forwarded_for"';
24
25 #access_log logs/access.log main;
26
格式基本和apache相同但是nginx使用的是内部的变量下面是变量的介绍
[root@C7--01 ~]# vim /usr/lcoal/nginx/logs/access.log
192.168.2.1 - - [19/Nov/2021:22:48:37 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0"
$remote_addr | 远程请求IP地址 |
远程用户邮箱 | 默认没有显示 为 - |
$remote_user | 客户端用户的名称,没有时用-符合代替 |
$time_local | 本地时间戳 |
$request | 请求具体URI文件,例如网页中的JPG图片 |
$status | http请求状态码 |
$body_bytes_sent | 请求文件大小 |
$http_refer | 网页url跳转来源,源地址,可以伪造。例如一个HTML网页然后调用图片URI资源 |
$http_user_agent | 用户终端浏览器UserAgent的相关信息 |
$http_x_forwarded_for | 是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项 |