Nginx (engine x) 是一款轻量级的HTTP服务器软件,优点:稳定性好、丰富的功能集、简单的配置文件和低系统资源的消耗,以及占有内存少,并发能力强(单台物理服务器可支持30000~50000个并发请求)相比apache并发请求没有nginx高,apache的并发在2万左右
Nginx 的应用场景(或功能)
静态处理:不管是httpd还是nginx默认只能处理静态页面
反向代理:不直接处理客户端的请求,而是将请求转交给其它服务器
负载均衡:跟反向代理相结合,负责将客户端的请求转交给其它压力较小的服务器
资源缓存:对客户端经常访问的数据进行缓存,从而加快客户端的访问的速度
安全防护:nginx对自己本身有一定的防护措施
访问限制:类似于apache的order deny,allow
访问认证:对所访问的网站,进行添加用户名和密码
每次I/O,都要经由两个阶段:
1、将数据从磁盘文件先加载至内核空间(缓冲区),等待数据准备完成,时间较长
2、将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
同步/异步关注是被调用者消息通信机制
同步:调用者等待被调用者返回消息,才能继续执行
例如:老板布置你任务,一直向你询问有没有完成,完成了老板做下一件事,这种通信机制成为同步
异步:被调用者通过状态、通知或者回调机制主动通知被调用者的运行状态
例如:老板分配你任务,任务进度状态你会向老板汇报,老板做自己的事情,不会向你问询结果
同步和异步的区别 | |
同步 | 被调用者不会返回任务的状态,需要调用者不停的询问 |
异步 | 被调用者会向调用者返回任务的状态,不需要调用者不停的询问 |
阻塞/非阻塞:关注调用者在等待结果返回之前的状态
阻塞(blocking):指I/O操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起
例如:手洗衣服,没洗完之前你都是被占用的状态。
非阻塞(nobloking):指I/O操作被调用后立刻返回一个用户状态,无需等IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起
例如:全自动洗衣机,不需要占用你时间,洗完会通知你,在期间你没有因为洗衣服被占用时间
I/O的模型有:同步阻塞、同步非阻塞、异步阻塞(IO多路复用select)、异步半阻塞(信号驱动型apache)、异步非阻塞(异步IO模型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的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。所以,该模式一般只在开发阶段和调试时使用,生产环境下不会使用
保证可以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: 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
........
....
[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/
访问
安装完成
注意:安装方法不同路径也不相同
模块 | 功能 |
---|---|
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
nginx -h # 查看帮助信息
nginx -v # 查看nginx版本
start nginx # 启动nginx
nginx -s quit # 关闭nginx,完整有序的停止nginx,保存相关信息
nginx -s stop # 关闭nginx,快速停止nginx,可能不保存相关信息
nginx -s reload # 重新载入nginx,当配置信息需要重新加载配置时使用
nginx -t -c filename # 测试nginx配置文件是否正确
nginx -s reopen # 重新打开日志文件
[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
源代码:安装在哪里文件就在哪里也可以使用上面的命令查看
先看一下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
<
#响应正文
Welcome to nginx!
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
* 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 代理或者负载均衡服务器时才会添加该项 |