目录
一、nginx概述
nginx是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。nginx是由伊戈尔~赛索耶夫开发的。其源代码以类BSD许可证的形式发布,因其稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。Nginx是一款轻量级的web服务器/反向代理服务器及电子邮件代理服务器,并在一个BSD-like协议下发行。
其特点是占有内存小,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
二、nginx特性
1、nginx特性
nginx是一个高性能的web和反向代理服务器,具有非常优越的特性:
(1)作为web服务器
可以作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持过滤功能,支持ssl等;相比于apache,nginx使用更少的资源,支持更多的并发连接,体现更高的效率。
(2)作为负载均衡器
可以自定义配置,支持虚拟主机,支持URL重定向,支持网络监控,支持流媒体传输等。nginx既可以在内部直接支持Rails和PHP,也可以支持作为HTTP代理服务器对外进行服务。
(3)作为邮件代理服务器
nginx同时也是一个非常优秀的邮件代理服务器,支持IMAP/POP3代理服务功能,支持内部SMTP代理服务器。
(4)nginx的安装非常简单,配置文件非常简洁(还能够支持Perl语法),bugs非常少的服务器
nginx启动特别容易,并且几乎可以做到全周不间断运行。
2、Nginx和apache的对比
(1)内核和功能上的比较
特性 | Nginx | Apache |
---|---|---|
请求管理 | 事件驱动模型,使用异步套接字处理,较少的内存和CPU开销 | 同步套接字,进程和线程,每个请求都要使用一个单独的进程或线程,使用同步套接字 |
设计语言 | c语言 | c、c++ |
可移植性 | 多平台 | 多平台 |
诞生时间 | 2002 | 1994 |
(2)一般功能比较
功能 | nginx | apache |
---|---|---|
HTTPS支持 | 作为模块使用 | 作为模块使用 |
虚拟主机 | 原生支持 | 原生支持 |
CGI支持 | 仅支持FastCGI | 支持CGI和FastCGI |
系统模块 | 静态模块系统 | 动态模块系统 |
(3)nginx相比较apache的优点
-
轻量级,同样web服务器比apache占用更少的内存及资源;
-
静态处理,nginx静态处理性能比apache高3倍以上;
-
抗并发,nginx处理请求是异步非阻塞的,而apache则是阻塞型的。在高并发下nginx能保持低资源低消耗高性能;
-
高度模块化的设计,编写模块相对简单;
-
社区活跃,各种高性能模块出品迅速。
三、nginx IO多路复用
1、I/O模型
同步阻塞I/O(blocking IO):即传统的IO模型
用户发起read IO读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作;用户需要等待read将socket中的数据读取到buffer后,才能继续处理接收的数据。整个IO请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够。
同步非阻塞I/O
用户线程发起IO请求时立即返回,但并未读取到任何数据,用户线程需要不断地发起IO请求,知道数据到达后,才能真正读取到数据,继续执行;用户需要不断的调用read,尝试读取socket中的数据,才继续处理接收的数据。整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断轮询,重复请求,消耗了大量的CPU的资源。
I/O多路复用
用户在发起请求建立起socket,首先将需要进行IO操作的socket添加到事件驱动模型中,然后等待驱动模型系统调用返回。当数据到达时,socket被激活,驱动模型函数返回。用户线程正式发起read请求,读取数据并继续执行。但是使用函数以后最大的优势是可以在一个线程内同时使用多个socket的IO请求。用户可以注册多个socket,然后不断地调用驱动模型读取被激活的socket,即可达到同一线程同时处理多个IO请求的目的。
四、nginx的内部技术架构
nginx服务器,以其处理网络请求的高并发、高性能及高效率,获得了行业内的广泛应用,并广泛应用于反向代理和负载均衡。
1、nginx启动时,会生成两种类型的进程,一种是主进程(Master),一种是工作进程(worker);主进程负责调度工作进程,主要是三项:加载配置,启动工作进程,及非停升级。
2、服务器实际处理网络请求及响应的是工作进程,在Linux系统上,nginx可以配置多个worker,而每个worker进程都可以同时处理数以千计的网络请求。
3、模块化设计。nginx将各个功能模块组织成一条链,当请求到达时候,请求依次经过这条链上的部分或者全部模块,进行处理。每个模块实现特定的功能。
五、nginx虚拟主机
1、虚拟主机
虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立多外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响
配置位置
此章内容,既可以在七层代理服务层配置,也可以在业务逻辑层配置。但七层代理层配置的虚拟主机常配合nginx的ngx_http_proxy_module模块使用。而业务逻辑层配置的虚拟主机常配合nginx的ngx_http_fastcgl_moudle
nginx支持的三种类型虚拟主机配置
基于域名的虚拟主机
基于Ip的虚拟主机
基于端口的虚拟主机
2、基于域名的虚拟主机
server:192.168.40.143
web:192.168.40.141
(1)配置通过域名区分的虚拟机
安装并查看nginx服务状态
[root@localhost /]# yum -y install nginx
[root@localhost /]# systemctl status nginx
查看主配置文件
[root@localhost ~]#vim /etc/nginx/nginx.conf
写入配置:
[root@localhost ~]#vim /etc/nginx/conf.d/test.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
#load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
#虚拟主机1
server {
listen 80 ;
server_name www.eryuan01.com;
root /usr/share/nginx/web1;
access_log /var/log/www.eryuan01.com.log main;
error_log /var/log/www.eryuan01.com.error.log;
location /{
index index.html;
}
}
#虚拟主机2
server {
listen 80 ;
server_name www.eryuan02.com;
root /usr/share/nginx/html;
access_log /var/log/www.eryuan02.com.log main;
error_log /var/log/www.eryuan02.com.error.log;
location / {
index index.html;
}
location /test {
index index.html;
}
}
(2)准备页面
在www.eryuan01.com的虚拟服务器1的页面:
[root@localhost ~]# cd /usr/share/nginx/
[root@localhost nginx]# ll
总用量 0
drwxr-xr-x 3 root root 136 8月 5 15:38 html
drwxr-xr-x 2 root root 6 10月 19 2021 modules
在里面创建一个web1目录,在web1里面创建一个index.html,并在index.html里面写www.eryuan01.com
[root@localhost nginx]# mkdir web1
[root@localhost web1]# touch index.html
[root@localhost web1]# ls
index.html
[root@localhost web1]# vim index.html
[root@localhost web1]# cat index.html
www.eryuan01.com
在域名为www.eryuan02.com的虚拟服务器2的页面:
打开/usr/share/nginx/html/目录,编写index.html,并新建test,编写内容
[root@localhost web1]# cd /usr/share/nginx/html/
[root@localhost html]# vim index.html
[root@localhost html]# cat index.html
编写测试页面
[root@localhost nginx]# cd /usr/share/nginx/html/
[root@localhost html]# mkdir test
[root@localhost html]# cd test/
[root@localhost test]# ll
总用量 0
[root@localhost test]# touch index.html
[root@localhost test]# ll
总用量 0
-rw-r--r-- 1 root root 0 8月 13 19:11 index.html
[root@localhost test]# vim index.html
[root@localhost test]# cat index.html
this is test.index.html
(3)启动nginx服务
[root@localhost /]# systemctl start nginx
[root@localhost /]# ps aux|grep nginx
root 13060 0.0 0.1 39304 1116 ? Ss 17:38 0:00 nginx: master process /usr/sbin/nginx
nginx 13061 0.0 0.1 41792 1952 ? S 17:38 0:00 nginx: worker process
root 57146 0.0 0.0 112824 980 pts/1 R+ 19:53 0:00 grep --color=auto nginx
(4)测试:
在web虚拟机上,编写hosts文件:
[root@localhost ~]# vim /etc/hosts
192.168.40.143 www.eryuan01.com 192.168.40.143 www.eryuan02.com
然后进行如下测试: