运维教程WEB集群技术之Nginx部署
【摘要】 WEB集群之Nginx技术目标理解常见的WEB服务理解Nginx的作用掌握nginx常见的配置文件搭建web站点ngx处理用户请求流程ngx常用功能与模块一、WEB服务WEB服务:网站服务,部署并启动了这个服务,你就可以搭建一个网站. WEB中间件: 等同于WEB服务 中间件:范围更加广泛,指的负载均衡之后的服务. 数据库中间件:数据库缓存,消息对列 常见网站服务 网站服务说明官网Nginx...
技术目标
-
理解常见的WEB服务
-
理解Nginx的作用
-
掌握nginx常见的配置文件
-
-
ngx处理用户请求流程
-
ngx常用功能与模块
一、WEB服务
WEB服务:网站服务,部署并启动了这个服务,你就可以搭建一个网站.
WEB中间件: 等同于WEB服务
中间件:范围更加广泛,指的负载均衡之后的服务.
数据库中间件:数据库缓存,消息对列
常见网站服务
网站服务 | 说明 | 官网 |
---|---|---|
Nginx | 大部分使用nginx,Engine X | http://nginx.org/en/docs/ |
Tengine | 基于Nginx二开 ,淘宝开源 ,更多内置模块 | https://tengine.taobao.org/ |
Openresty | 基于Nginx二开 ,加强Lua功能与模块 | |
...... | ||
Tomcat/Jboss/Jetty/Weblogic | 运行java环境的,web服务 | |
PHP | 运行php环境 ,需要ngx(LNMP) | |
...... |
二、Nginx概述
Nginx是一款轻量级和高性能的 Web 服务器、反向代理服务器、电子邮件(IMAP/POP3/SMTP)代理服务器,是带有 BSD-like 协议的开源产品
Nginx(发音同 engine x)是一款基于异步框架的轻量级/高性能的Web 服务器/反向代理服务器/缓存服务器[静态文件服务]/电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔·赛索耶夫)所开发,最初供俄国大型网站Rambler.ru及搜寻引擎Rambler使用。
2.1Nginx特点
优点:
-
高并发量:基于 epoll/kqueue 模型开发,支持高并发量,官方说其支持高达 5w 并发连接数的响应
-
内存消耗少:善于处理静态文件,相较于其他web(比如:apache),占用更少的内存及资源
-
简单稳定:配置简单(一个conf文件),运行简单(nginx命令),而且运行稳定
-
模块化程度高:功能模块插件化设计,可以自由配置相应的功能。[如:负载均衡]
-
支持Rwrite重写规则:能够根据域名、URL等请求关键点,实现定制化的高质量分发。
-
低成本:Nginx的负载均衡功能很强大而且免费开源,相较于几十万的硬件负载均衡器成本相当低。
-
支持多系统:Nginx代码完全用C语言从头写成,可以在各系统上编译并使用。
缺点:
-
动态处理差:nginx善于处理静态文件,但是处理动态页面相较于Apache之类重量级的web软件能力稍欠缺。
-
rewrite弱:虽然nginx支持rewrite功能多,但是相较于Apache之类重量级的web软件能力稍欠缺。
2.2 反向代理
Reverse Proxy
-
位于服务器端和客户端之间,主要用于服务器端的负载均衡、缓存静态内容、加密和SSL加速、安全防护等。
-
服务器主动使用代理服务器,客户端不知道实际提供服务的服务端。
-
常用于网站后端,将客户端的请求转发到内部服务器,然后将响应返回给客户端,对外表现为统一的服务地址。
当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是无感的。
2.3 负载均衡
负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是达到高性能,解决单点故障(高可用),增加扩展性(水平伸缩)的终极解决方案。
举个事例,在早高峰乘地铁时候,紧挨小区的地铁口人特别多,一般会有限流,还会有个地铁工作人员用大喇叭在喊“着急的人员请走B口,B口人少车空”。那么,地铁工作人员就是负责负载均衡的。
为了提升网站的各方面能力,我们一般会把多台机器组成一个集群对外提供服务。然而,一般网站对外提供的访问入口都是一个。比如 www.taobao.com,当用户在浏览器输入 www.taobao.com 的时候如何将用户的请求分发到集群中不同的机器上呢?这就是负载均衡在做的事情。
如下图中的代理,就可以是 nginx 服务器,接收到请求后,分配给服务集群:
三、极速上手指南
3.1.配置yum源
[root@web01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
安装一下:
yum install -y nginx
3.2.检查安装
[root@web01 yum.repos.d]# rpm -qa nginx
nginx-1.26.1-2.el7.ngx.x86_64
[root@web01 yum.repos.d]# rpm -ql 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.26.1
/usr/share/doc/nginx-1.26.1/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
3.3 目录结构
*目录结构* | *说明* |
---|---|
/etc/nginx/ | nginx各种配的目录 |
/etc/nginx/nginx.conf | 主配置文件 |
/etc/nginx/conf.d/ | 子配置文件(网站) |
/etc/nginx/conf.d/default.conf | 默认的子配置文件 |
/usr/sbin/nginx | ngx命令 |
/usr/share/nginx/html/ | ngx默认的站点目录 ,网站的根目录 |
*/var/log/nginx/* | ngx日志 :访问日志 ,错误日志,跳转日志 |
*其他目录和文件* | *说明* |
---|---|
/etc/logrotate.d/nginx | 日志切割(防止文件过大) |
/etc/nginx/mime.types | 媒体类型 |
/etc/nginx/fastcgi_params | ngx+php |
/etc/nginx/uwsgi_params | ngx+python |
/usr/lib/systemd/system/nginx.service | systemctl配置文件 |
/var/cache/nginx/ | 缓存目录 |
3.4 指令操作
systemctl enable nginx
systemctl start nginx
#检查服务状态
systemctl status nginx
#检查端口
ss -lntup |grep 80
#检查进程
ps -ef |grep nginx
"master process"表示nginx的主进程。主进程负责管理和控制nginx服务器的工作,包括启动、停止和重启子进程等操作。它通常以root用户身份运行,并监听特定的端口来接收来自客户端的请求。
#命令行访问
curl 192.168.3.7
curl -v 192.168.3.7
四、Nginx核心功能详解
4.1配置文件
/etc/nginx/nginx.conf 约定: nginx配置文件中每一行结尾要加上; 如果有{}或()的时候,不加; user叫做ngx中的指令; server{#称为区域,server区域}
[root@web01 ~]# cat /etc/nginx/nginx.conf
#指定nginx所属用户(虚拟用户)
user nginx;
#工具人进程数量 处理用户请求的进程,当前数量是自动
worker_processes auto;
#nginx错误日志位置
error_log /var/log/nginx/error.log notice;
#pid文件
pid /var/run/nginx.pid;
events {
#工具人进程可以处理多少个连接(每个工具人进程最大的连接数)
worker_connections 1024;
}
http {
#引用的媒体类型
include /etc/nginx/mime.types;
#默认的媒体类型
default_type application/octet-stream;
#指定nginx访问日志格式,名字叫main
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#使用main格式,记录访问日志
access_log /var/log/nginx/access.log main;
#提高nginx性能
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#文件包含或引用,用于在nginx配置文件中调取其他文件,引用nginx子配置文件
include /etc/nginx/conf.d/*.conf;
}
4.2.子配置文件
在nginx配置目录下存在可以设置可以各个子项目的文件,也称为子配置文件
[root@web01 ~]# egrep -v '^$|#' /etc/nginx/conf.d/default.conf
server {
#监听指定端口,一般是80端口
listen 80;
#网站的域名
server_name localhost;
#用于匹配用户请求的uri,location /表示默认
location / {
#用于指定站点目录
root /usr/share/nginx/html;
#指定首页文件,只输入域名的时候展示的页面
index index.html index.htm;
}
#指定出现500 502 503 504错误的时候显示50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
网站中常用必会指令 | 说明 |
---|---|
listen | 指定监听端口 |
server name | 指定域名 ,多个通过空格分割,最后记得加; |
location(区域) | 匹配请求中的uri(资源地址) |
root | 指定站点目录(网站的根目录)root /app/code/www; www.baidu.com/lidao/lidao.txt → /app/code/www/lidao/lidao.txt |
index | 指定站点的首页文件 . 用户访问的时候不加上任何的文件 ,展示首页文件 . |
error_log | 指定错误状态码与对应的错误页面 . |
nginx:必会问题:
如果删除首页文件,进行(不指定文件)访问会发生什么? 403首页文件不存在
*小结
-
nginx.conf主配置文件
-
conf.d/*.conf 子配置文件 掌握子配置文件中的指令
-
重启: 配置修改了,重启ngx
4.3部署第1个cxk网站
*网站要求* | *说明* |
---|---|
域名 | cxk.playgame.cn |
站点目录 | /app/code/cxk |
代码来源 | bird .zip |
配置文件
[root@web01 ~]# cat /etc/nginx/conf.d/cxk.playgame.cn.conf
server{
listen 80;
server_name cxk.playgame.cn;
root /app/code/cxk;
location /{
index index.html;
}
}
#检查配置:使用`nginx -t`检查配置文件是否有误
[root@web01 /etc/nginx/conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf
syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test
is successful
[root@web01 /etc/nginx/conf.d]# systemctl reload nginx
4.4业务代码部署
#创建目录
[root@web01 ~]# mkdir -p /app/code/cxk
#解压代码
[root@web01 ~]# unzip cxk.zip -d /app/code/cxk/
#配置linux或windows hosts解析
#windows:C:\Windows\System32\drivers\etc\hosts
#linux: /etc/hosts
#也可以写多个网址,以空格隔开或在写一行
192.168.3.7 cxk.playgame.cn
五、Nginx处理用户请求流程
5.1.案例与思考
思考之前搭建的cxk.com网站,使用域名访问或ip访问都是没有问题的.
如果把配置文件名改为 game.cxk.com.conf使用域名或ip访问或怎么样?
结果:
-
域名访问没有任何问题
-
使用ip访问则显示静态页面,另外一个网页了;
5.2详细原理
使用域名访问网站流程:
-
DNS解析:域名--->IP地址
-
连接80端口,tcp3次握手与网站的80端口建立连接
-
http请求报文:请求方法,URI,HOST等信息
-
Nginx处理
-
http请求,http区域处理
-
不同的server{} 区域(子配置文件)处理
-
端口
-
域名:用户请求的域名与子配置文件server_name进行匹配
-
匹配成功,就让对应的子配置文件进行处理
-
根据自配置文件的root,location规则,index进行处理查找文件
-
把找到的文件发回给用户
-
-
-
http响应报文
-
状态码:200 ok
-
server信息
-
其他信息
-
文件内容
-
-
客户收到文件内容,浏览器解析,进行展示
ip访问或不存在的域名
-
看看是否有默认的server处理 listen 80 default_server;
-
如果有则返回对应的server{}
-
如果没有则按照配置文件的顺序进行选择第一个处理
-
-
六、虚拟主机
虚拟主机:相当于是1个网站,在nginx中通过server{}区域实现
nginx中虚拟主机有不同的类型
1.概述与分类
虚拟主机的分类 | 说明 | 应用场景 |
---|---|---|
基于域名的虚拟主机 | 不同的域名访问不同的站点 | 生产环境最常用的 |
基于端口的虚拟主机 | 不同的端口访问不同的站点 | 保护,设置特殊端口,一般1024以上 |
基于ip的虚拟主机 | 不同的ip访问不同的站点 | 保护,用户只能通过某个ip连接进来,用来限制网站只能通过指定的ip进行访问 |
2.基于域名的虚拟主机
不同的域名访问不同的主机
#创建bird.com网站,站点目录/app/code/bird
[root@web01 /etc/nginx]# cat conf.d/bird.com.conf
server{
listen 80;
server_name bird.com;
root /app/code/bird;
error_log /var/log/nginx/bird.com-error.log notice;
access_log /var/log/nginx/bird.com-access.log main;
location / {
index index.html;
}
}
curl -H Host:bird.com http://192.168.3.7
#1.完成后不创建站点目录进行访问看看报什么错误
提示404
#2.创建站点目录后再访问看看报什么错误.
提示403
#3.创建首页文件和内容,访问看看显示什么
访问正常
-H:修改请求头里面的内容
[root@web01 conf.d]# grep server_name *.conf
bird.com.conf: server_name bird.com;
cxk.playgame.conf: server_name cxk.playgame.cn;
default.conf: server_name localhost;
3. 基于端口的虚拟主机
不同的端口访问不同的网站
#修改bird.com端口为81
server{
listen 81;
server_name bird.com;
root /app/code/bird;
error_log /var/log/nginx/bird.com-error.log notice;
access_log /var/log/nginx/bird.com-access.log main;
location / {
index index.html;
}
}
#访问
curl -H Host:bird.com http://192.168.3.7:81/index.html
#浏览器
http://192.168.3.7:81/index.html
4.基于ip的虚拟主机
#buy.com/admin 只能内网访问
[root@web01 /etc/nginx]# cat conf.d/buy.com.conf
server{
listen 80;
server_name buy.com;
root /app/code/buy;
location /{
index index.html;
}
location /admin/{
allow 172.16.1.0/24;
deny all;
index index.html;
}
}
[root@web01 /etc/nginx]# curl -H Host:buy.com http://10.0.0.7
welcom to buy page!!!!
[root@web01 /etc/nginx]# curl -H Host:buy.com http://10.0.0.7/admin/
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.22.1</center>
</body>
</html>
[root@web01 /etc/nginx]# curl -H Host:buy.com http://172.16.1.7/admin/
welcom to admin !!!!
#地址的最后没有加/
[root@web01 /etc/nginx]# curl -H Host:buy.com http://172.16.1.7/admin
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.22.1</center>
</body>
</html>
总结
通过本次Linux综合实训进一步巩固、深化和扩展了我们的专业技能,培养了我们获取信息和处理信息的能力,此次课程设计遇到以下问题,最终通过网查找资料并且组员之间讨论与实践操作得到了解决。
- Nginx只是起到分发请求的作用,具体的处理是在应用服务器中,比如
Tomcat
,Nginx根据不同的策略将请求分发给不同应用服务器处理 - 这些不同的应用服务器可以连接同一个远程数据库,那么就可以实现数据共享,不会导致数据错乱
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)