web服务器-Nginx

一讲在Nginx之前

同步与异步: 同步与异步的重点在消息通知的方式上,也就是调用结果的通知方式不同。
同步:当一个同步调用发出去后,调用者要一直等待调用的结果通知后,才能进行后续的执行。
异步:当一个异步调用发出去后,调用者不必一直等待调用结果的返回,异步调用,要想获得结果,
一般有两种方式:
1、主动轮询异步调用的结果;
2、被调用方通过callback(回调通知)来通知调用方调用结果。
实例解释:
同步取快递:小明收到快递将送达的短信,在楼下一直等到快递送达。
异步取快递:小明收到快递将送达的短信,快递到楼下后,小明再下楼去取。
异步取快递,小明知道快递到达楼下有两种方式:
1、不停的电话问快递小哥到了没有,即主动轮询;
2、快递小哥到楼下后,打电话通知小明,然后小明下楼取快递,即回调通知。
阻塞与非阻塞:
阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂
起状态,还是非挂起状态。
阻塞:调用在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才
会被激活
非阻塞:调用在发出去后,不会阻塞当前进/线程,而会立即返回。
实例解释:
阻塞取快递:小明收到快递即将送达的信息后,什么事都不做,一直专门等快递。
非阻塞取快递:小明收到快递即将送达的信息后,等快递的时候,还一边敲代码、一边刷微信。
同步与异步,重点在于消息通知的方式;阻塞与非阻塞,重点在于等消息时候的行为。
所以,就有了下面4种组合方式
⚫同步阻塞:小明收到信息后,啥都不干,等快递;
⚫同步非阻塞:小明收到信息后,边刷微博,边等着取快递;
⚫异步阻塞:小明收到信息后,啥都不干,一直等着快递员通知他取快递;
⚫异步非阻塞:小明收到信息后,边刷着微博,边等快递员通知他取快递。

大部分程序的I/O模型都是同步阻塞的,单个进程每次只在一个文件描述符上执行I/O操作,每次I/O
系统调用都会阻塞,直到完成数据传输。传统的服务器采用的就是同步阻塞的多进程模型。一个server采用一个进程负责一个request的方式,一个进程负责一个request,直到会话结束。进程数就是并发数,而操作系统支持的进程数是有限的,且进程数越多,调度的开销也越大,因此无法面对高并发。
Nginx采用了异步非阻塞的方式工作。我们先来先了解一下I/O多路复用中的epoll模型。
epoll模型: 当连接有I/O事件产生的时候,epoll就会去告诉进程哪个连接有I/O事件产生,然后进程就去处理
这个事件。
例如:小明家楼下有一个收发室,每次有快递到了,门卫就先代收并做了标记;然后通知小明去取送
给小明的快递。

为什么Nginx比其他web服务器并发高(Nginx工作原理):
Nginx配置use epoll后,以异步非阻塞方式工作,能够轻松处理百万级的并发连接。
处理过程:每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到可能发生
阻塞的地方。比如向后端服务器转发request,并等待请求返回。那么,这个处理的worker不会这么
傻等着,他会在发送完请求后,注册一个事件:“如果后端服务器返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有新的request 进来,他就可以很快再按这种方式处理。而一旦后端服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。

二.Nginx详解

1、概述

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP
服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本
0.1.0发布于2004年10月4日。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在
BSD-like 协议下发行。其特点是占有内存少,并发能力强。

2、工作模式

nginx有两种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程
和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。
master-worker:
该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责
处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为这种模式有以下优点:

  1. 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。
  2. 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能
  3. 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)

单进程模式:
单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,
因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理
都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。
因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。(了解)

三、安装 Nginx

[root@server ~]# yum install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel
[root@server ~]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@server ~]# tar -xf nginx-1.18.0.tar.gz 
[root@server ~]# useradd -r -s /sbin/nologin nginx
[root@server ~]# cd nginx-1.18.0/
[root@server nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
[root@server nginx-1.18.0]# make && make install

实验一、 Nginx 状态统计

[root@server ~]# cd /usr/local/nginx/
[root@server nginx]# vim conf/nginx.conf
...
server {
        location / {
            root   html;
            index  index.html index.htm;
        }
        #添加如下内容
		location /nginx_status{
			stub_status on;
			access_log  off;
	}

3.1.1 编写 Nginix 启动脚本

[root@server nginx]# vim /etc/init.d/nginx

#!/bin/bash
#Author:liu
#chkconfig: 2345 99 33
#description: nginx server control tools

ngxc="/usr/local/nginx/sbin/nginx"  #nginx启动命令
pidf="usr/local/nginx/logs/nginx.pid"
ngxc_fpm="/usr/local/php/sbin/php-fpm" #fpm启动命令
pidf_fpm="/usr/local/php/var/run/php-fpm.pid"

case "$1" in
#$1,输入的第一个参数
	start)  #输入的参数为start,启动nginx和fpm
		 $ngxc -t &> /dev/null
		 if [ $? -eq 0 ];then
			 $ngxc
			 $ngxc_fpm
			 echo "nginx service start success!"
		 else
		 	 $ngxc -t
		 fi
		 ;;
	stop)
		 kill -s QUIT $(cat $pidf)
		 kill -s QUIT $(cat $pidf_fpm)
		 	echo "nginx service stop success!"
		 ;;
	restart)
		 $0 stop
		 $0 start
		 ;;
	reload)
		 $ngxc -t &> /dev/null
		 if [ $? -eq 0 ];then
			 kill -s HUP $(cat $pidf)
			 kill -s HUP $(cat $pidf_fpm)
			 echo "reload nginx config success!"
		 else
			$ngxc -t
		 fi
		 ;;
	*)
		 echo "please input stop|start|restart|reload."
		 exit 1
esac
[root@server nginx]# chmod +x /etc/init.d/nginx
[root@server nginx]# service nginx start

3.1.2 访问测试

http://服务器IP地址/nginx_status
在这里插入图片描述

实验二、目录保护

[root@server nginx]# vim conf/nginx.conf
#再 location /nginx_status 标签中添加两行
        location /nginx_status{
		……
        auth_basic "welcome to nginx_status!";
        auth_basic_user_file /usr/local/nginx/html/htpasswd.nginx;
        }

[root@server nginx]# yum -y install httpd
[root@server nginx]# htpasswd -c /usr/local/nginx/html/htpasswd.nginx user
#设置第二个账户与密码 使用 -m
[root@server nginx]# service nginx restart

访问测试

在这里插入图片描述

实验三、基于 IP 的身份验证(访问控制)

[root@server nginx]# vim conf/nginx.conf
#在 location /nginx_status{ 标签中添加
    allow 192.168.154.1;
    #允许某一个IP地址或网段
    deny 192.168.154.0/24;
    #拒绝某一个IP或网段
    
[root@server nginx]# service nginx restart

实验四、 Nginx 的虚拟主机(基于域名)

4.1.1 域名准备

提前准备好两个网站的域名,并且规划好两个网站网页存放目录 搭建 DNS 服务器并把 Nginx 服务器地址指向 DNS 服务器地址 或者在 /etc/hosts 文件中写入解析

192.168.154.20 www.dal.com
192.168.154.20 blog.dal.com

4.1.2 配置 Nginx

在Nginx主配置文件中并列编写两个server标签,并分别写好各自信息 写在 server }结尾的后面,千万不要写到 server 里面或者 http 外面

[root@server nginx]# vim conf/nginx.conf
#添加以下内容
server {
        listen       80;
        server_name  www.dal.com;
        index index.html index.htm index.php;
        root html/www;
        access_log logs/www-access.log main;
}
server {
        listen       80;
        server_name  blog.dal.com;
        index index.html index.htm index.php;
        root html/blog;
        access_log logs/blog-access.log main;
        
}

[root@server nginx]# mkdir html/www
[root@server nginx]# vim html/www/index.html 
#添加内容
www.dal.com
[root@server nginx]# mkdir html/blog
[root@server nginx]# vim html/blog/index.html
#添加内容
blog.dal.com

[root@server nginx]# systemctl restart nginx

4.1.3 访问测试

在这里插入图片描述

实验五、 Nginx 反向代理

代理和反向代理?
代理:找别人代替你去完成一件你完不成的事(代购),代理的对象是客户端
反向代理:替厂家卖东西的人就叫反向代理(烟酒代理),代理的对象是服务器端

5.1.1 安装 httpd 启动并自启动

在另一台服务器安装 apache 启动并填写测试页面

[root@dal ~]# yum -y install httpd
[root@dal ~]# vim /var/www/html/index.html
192.168.154.60
[root@dal ~]# systemctl start httpd && systemctl enable httpd
[root@dal ~]# systemctl stop firewalld
[root@dal ~]# sestatus 0

#[root@dal ~]# iptables -F(centos 6)

5.1.2 配置 Nginx

在 nginx 服务器的配置文件中添加(卸载某一个网站(www)的 server 标签内)

[root@server nginx]# vim conf/nginx.conf
  location / {
        proxy_pass http://192.168.154.60:80;
        }

5.1.3 重启 nginx 并访问测试

[root@server nginx]# systemctl restart nginx
在这里插入图片描述

实验六、负载调度(负载均衡)

负载均衡(Load Balance)其意思就是将任务分摊到多个操作单元上进行执行,例如Web服务器、FTP
服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

6.1.1 在配置一台 apache 服务器

[root@server ~]# yum -y install httpd
[root@server ~]# vim /var/www/html/index.html
192.168.154.10
[root@server ~]# systemctl stop firewalld
[root@server ~]# systemctl start httpd && systemctl enable httpd

6.1.2 默认使用 rr 轮询算法,修改 nginx 配置文件

[root@server nginx]# vim conf/nginx.conf
#在 server(www) 标签上写
upstream www {
        server 192.168.154.10:80;
        server 192.168.154.60:80;
        }
#在 www 的 server 标签内把原来的
proxy_pass http://192.168.154.60:80;
#替换成并添加一行
proxy_pass http://www;	#添加反向代理,代理地址填 upstream 声明的名字
proxy_set_header Host $host;	#重写请求头部,保证网站所有页面都可访问成功

6.1.3 重启 nginx 并访问测试

在这里插入图片描述
拓展补充:rr算法实现加权轮询

[root@server nginx]# vim conf/nginx.conf
#添加 weight=
upstream www {
server 192.168.88.100:80 weight=1;
server 192.168.88.200:80 weight=2;
}

重启并访问测试

[root@server nginx]# systemctl restart nginx
在这里插入图片描述

实验七、 Nginx 实现 https (证书 & rewrite )

7.1.1 模块开启

安装nginx时,需要将--with-http_ssl_module 模块开启,按照上面步骤来的就对了

7.1.2 生成证书文件

[root@server ssl]# mkdir ssl && cd ssl
[root@server ssl]# openssl granrsa -out dal.key 2048
[root@server ssl]# openssl req -new -key dal.key -out dal.csr
#需要依次输入国家,省,城市,组织,组织单位,通用名称(您的名称或服务器的主机名),email,后面的挑战密码和公司名称可不写。最重要的是有一个 common name,可以写你的名字或者域名。如果为了 https 申请,这个必须和域名吻合
[root@server ssl]# openssl x509 -req -days 365 -sha256 -in dal.csr -signkey dal.key -out dal.crt

7.1.3 开启对应的 ssl

在对应进行加密的 server 标签中添加以下内容开启 SSL

[root@server ssl]# cd ..
[root@server nginx]# vim conf/nginx.conf
#在 www.dal.com 的 server 标签末尾添加并把 80 端口修改称 443端口
server {
        listen       443;
        server_name  www.dal.com;
        index index.html index.htm index.php;
		……………………
	 #ssl on;
	 #
	 ssl_certificate /usr/local/nginx/conf/ssl/dal.crt;
	 ssl_certificate_key /usr/local/nginx/conf/ssl/dal.key;
	 ssl_session_timeout 5m;
	 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	 ssl_prefer_server_ciphers on;
	 ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
}
#在此标签下面再添加以下标签(利用虚拟主机+rewrite的功能)
server{
	listen 80;
	server_name www.dal.com;
	rewrite ^(.*)$ https://www.dal.compermanent;
	root html/www;
	index index.html index.htm;
}

7.1.4 重启并测试

[root@server nginx]# systemctl restart nginx
在windows 的 C:\Windows\System32\drivers\etc/hosts 文件添加
Nginx 服务器地址 对应域名
例如: 192.168.154.20 www.dal.com
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值