当前位置: 首页 > Linux

NGINX入门到企业级应用实战-基础

时间:2023-04-06 21:35:51 Linux

这是一个免费知识系列,有图文版和视频版,您现在看到的是图文版。NGINX系列课程分为基础、进阶和企业实践三个部分。您现在正在阅读的是基础部分。视频版发布在我自己的社区。喜欢看视频的朋友可以去社区,微信扫描二维码或者微信授权登录播放。写在前面的基础章节学习目的:了解NGINX,并能自己动手,能独立完成负载均衡配置,并绑定域名,从而通过域名访问后端服务。学习NGINX系列课程的目的:了解NGINX,能够独立完成负载均衡配置,能够搭建高可用的企业级生产环境,能够对NGINX进行监控。听过视频课的小伙伴,已经可以独立完成负载均衡配置,也交了作业。在过去的六个月里,我们会输出很多公开课,包括图文版和视频版。重要的是这些都是免费的!!!你来的时候可以听听。课程列表如下,其中绿色标记为已经发布的内容,红色标记为正在准备资料的内容。NGINX基础图文版不错,正题来了,开始吧。平时接触后端或者服务器比较少的朋友可能会问,什么是NGINX?关于它是什么,可以参考NGINX官网和百度百科上的介绍。NGINX是一个高性能的HTTP服务器,也是一个反向代理服务器(NGINX官网原文叫反向代理服务器)。除了支持HTTP协议外,还支持邮件协议、TCP/UDP等,它能做什么呢?在我看来,它实际上是一个网关。角色1是请求转发,角色2是限流,角色3是认证,角色4是负载均衡。上述的反向代理反向代理服务器可以归类为请求转发。正向代理,反向代理???原因我们就不多说了,大家可以看看其他平台对这个问题的解读https://zhuanlan.zhihu.com/p/...这里简单总结一下,正向代理的对象是客户端,反向代理代理的对象是服务器。做爬虫的朋友,你们平时使用的IP代理是正向代理,爬虫程序通过代理将请求转发到后端。我们提到的NGINX反向代理将客户端的请求转发给后端。是不是有很多公司借用上面文章的几张图,用的是NGINX?大多数公司都在使用NGINX,从GoogleMeta(Facebook)AmazonAlibabaTencentHuawei到世界上小到70%+(我猜,实际上不止于此)的互联网公司。社区也使用NGINX安装NGINX,安装基于Ubuntu20.04,云服务器。会先快速安装基础章节,方便我们操作和学习一些基础知识,后续的高级章节会编译安装。打开Terminal,执行sudoaptinstallnginx-y,等待命令执行完成安装。安装完成后会自行启动。你可以访问你自己的服务器地址。比如我的服务器IP是101.42.137.185,那么我访问的是http://101.42.137.185。如果页面显示Welcometonginx,说明服务正常。如果没有,请查看安装时Terminal输出的错误信息,或者查看自己的防火墙、安全组策略等(不明白,或者不会操作的,可以参考linux之前社区发布的云服务器公开课)NGINX基本工作原理及模块关系简介NGINX有一个master进程和多个worker进程。主进程用于维护自身的操作,如读取配置、解析配置、维护工作进程、重载配置等;工作进程是专门响应请求的进程。可以在配置文件中调整工作进程的数量。NGINX由由配置文件中的配置管理的模块组成,这意味着配置文件决定NGINX的工作方式。这里还有其他文章的参考资料,就不一一写了。NGINX的原理和架构可以参考https://zhuanlan.zhihu.com/p/...。其实一开始我们需要注意的地方只有一个,那就是模块部分。随便看看,大概了解一下。无需深入。NGINX的signal信号,这里指的是控制信号。Signal是控制NGINX工作状态的模块。信号语法格式为nginx-ssignal。常用的信号有stop、quickshutdown、quit、normalshutdown、reload、reloadconfiguration、reopen、reopenthelogfile。NGINX的正确关闭是nginx-squit它允许NGINX在退出之前完成它已经启动的处理工作。NGINX配置说明是基于之前的社区公开课,在正式讲NGINX配置之前可以先看看它的应用管理配置。通过status命令找到NGINXServer配置文件>systemctlstatusnginx查看NGINXServer配置[Unit]Description=AhighperformancewebserverandareverseproxyserverDocumentation=man:nginx(8)After=network.target[Service]Type=forkingPIDFile=/run/nginx.pidExecStartPre=/usr/sbin/nginx-t-q-g'daemonon;master_processon;'ExecStart=/usr/sbin/nginx-g'daemonon;master_processon;'ExecReload=/usr/sbin/nginx-g'daemonon;master_processon;'-sreloadExecStop=-/sbin/start-stop-daemon--quiet--stop--retryQUIT/5--pidfile/run/nginx.pidTimeoutStopSec=5KillMode=mixed[Install]WantedBy=multi-user.target当你看到ExecStart选项,可以确认NGINX安装在/usr/sbin/nginx。这个配置文件与我们之前公开课Linux云服务器公开课提到的知识相呼应。在这里提一下。找到默认的主配置文件配置文件部分正式开始。NGINX有一个主配置文件和一个辅助配置文件。主配置文件默认名称为nginx.conf,默认保存在/etc/nginx/nginx.conf中。辅助配置文件的路径受主配置文件控制,具体路径通过主配置文件设置。辅助配置文件的文件名和路径可以更改,文件名一般以conf结尾。安装完成后,如果不知道主配置文件在哪里,可以通过默认路径找到,也可以通过find命令搜索。>sudofind/-namenginx.conf/etc/nginx/nginx.conf主要配置文件的基本结构和功能。使用cat/etc/nginx/nginx.conf列出文件内容。不懂的可以通过社区发布的Linux云服务器公开课学习具体的Linux文件查看说明。用户www数据;#用户worker_processes自动;工作进程数pid/run/nginx.pid;#进程文件包括/etc/nginx/modules-enabled/*.conf;#插件模块配置事件{worker_connections768;#允许同时连接的连接数#multi_accepton;}http{sendfileon;tcp_nopush上;tcp_nodelayon;keepalive_timeout65;types_hash_max_size2048;ssl_protocolsTLSv1TLSv1.1TLSv1.2TLSv1.3;#删除SSLv3,参考:POODLEssl_prefer_server_cipherson;访问日志/var/log/nginx/access.log;错误日志/var/log/nginx/error.log;包括/etc/nginx/conf.d/*.conf;#辅助配置文件路径include/etc/nginx/sites-enabled/*;}#示例#mail{...#}这里列出的配置文件我做了适当的调整,删除了注释的内容,保留了有效的内容。重要项目的含义以中文注释的形式标注在上面。看到配置你肯定有点懵,这些都是什么东西。接下来,我们来学习一下NGINX配置文件的基本语法。NGINX配置文件基本语法NGINX配置文件中的配置项成为指令,分为简单指令和块指令。简单指令由指令名和参数组成,以空格分隔,以英文分号结束,如worker_processesauto;其中worker_processes是一条指令,这条指令的作用是设置worker进程数。auto表示进程数,可以是数字,也可以是auto(根据CPU个数按照固定的数学公式计算,通常是CPU+1)。块指令的语法格式类似于简单指令。比较简单的指令用花括号括起来,比如http{server{...}}Context/Context上下文有些地方也叫context。如果一条块指令中包含其他指令,那么这条块指令就称为上下文。eventshttpserverlocation等常见上下文有一个隐藏的上下文指令main。它不需要显式声明,所有指令的最外层是main的范围。main作为其他上下文的引用,例如事件和http必须在main范围内;服务器必须在http中;位置必须在服务器中;以上限制是固定的,不能随意放置,否则NGINX程序无法运行,但可以在日志中看到错误信息。说了这么多,你肯定累了,我们动手吧!使用NGINX为后台程序配置一个简单的WEB服务。例如下面的flask应用fromflaskimportFlaskfromflask_restfulimportResource,Apiapp=Flask(__name__)api=Api(app)classHelloWorld(Resource):defget(self):app.logger.info("收到请求,响应'穿甲兵科技社区'")return{'message':'穿甲兵科技社区',"address":"https://chuanjiabing.com"}api.add_resource(HelloWorld,'/')if__name__=='__main__':app.run(debug=True,host="127.0.0.1",port=6789)将内容写入服务器上的一个文件,例如/home/ubuntu/ke.py。在开始之前,记得安装相关的Python库。pip3installflask-restful在Ubuntu20.04上默认有新版Python,不用担心环境问题。运行web后端服务python3/home/ubuntu/ke.py完成后端启动后,我们来配置NGINX从前面查看主配置文件可以看出,辅助配置文件的目录为/etc/nginx/conf.d,所以现在我们在辅助配置文件目录下添加一个新的配置文件>sudovim/etc/nginx/conf.d/ke.confserver{listen8000;服务器名称本地主机;位置/{proxy_passhttp://localhost:6789;}}检查配置文件是否正确>sudonginx-tnginx:配置文件/etc/nginx/nginx.conf语法是否正确nginx:配置文件/etc/nginx/nginx.conf测试是否成功reload配置>sudonginx-sreload浏览器访问http://ip:port比如我的服务器http://101.42.137.185:8000/可以看到后台的输出。NGINX日志文件默认分为正常日志和内部错误日志。日志路径可以在主配置文件/var/log/nginx/access.log/var/log/nginx/error.log中设置查看正常日志>cat/var/log/nginx/access.log117.183.211。177--[19/Nov/2021:20:18:46+0800]"GET/HTTP/1.1"200107"-""Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/537.36(KHTML,like壁虎)Chrome/94.0.4606.71Safari/537.36"117.183。211.177--[19/Nov/2021:20:18:48+0800]"GET/favicon.icoHTTP/1.1"404209"http://101.42.137.185:8000/""Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/537.36(KHTML,likeGecko)Chrome/94.0.4606.71Safari/537.36"官方文档-日志格式http://nginx.org/en/docs/http...默认日志格式log_formatcompression'$remote_addr-$remote_user[$time_local]''"$request"$status$bytes_sent'ioipra'"$http_referer""$http_userg_agent";你可以自己在主配置文件中配置,具体配置项参考官方文档使用NGINX为前端程序配置代理一个简单的HTML文档>vim/home/ubuntu/index.html穿甲兵技术社区

穿甲兵技术社区

https://chuanjiabing.com

无论是大型前端项目还是中小型前端项目,一般来说,都需要编译成一个HTML文档,然后使用像NGINX这样的应用程序来提供无障碍服务。注意:一些Vue/React服务可能会做服务端渲染部署,但大部分还是编译成HTML。这里的简单例子和那些前端工程项目在配置上没有区别。举个例子,别担心,学习NGINX才是最重要的。>sudovim/etc/nginx/conf.d/page.confserver{听1235;服务器名称本地主机;字符集utf-8;位置/{root/home/ubuntu/;indexindex.htmlindex.htm;负载均衡想象一个场景。比如你服务器上的后端服务主要是用来格式化时间的,很多爬虫需要调用它,也需要保证服务稳定可用。场景扩展:假设你逆向了一个JS算法,现在所有的爬虫在发起请求前都需要调用这个算法生成一个sign值,并带着这个值去请求。如果将JS代码放在Python/Golang等代码中进行本地调用执行,那么改算法的时候需要改/重新部署所有的爬虫程序,而做一个WEB服务,只需要改/重启WEB服务。.现在一个后端服务的情况有两个明显的缺点:1.服务性能不够,请求过多会导致程序卡顿,响应速度慢,影响整体效率;2.整体服务不稳定。一旦进程退出或服务器崩溃,服务将无法访问;使用负载均衡的好处1、启动多个后端服务,配置负载均衡,让请求转发给它们按需处理(比如轮流处理),这样就可以承担更多的工作需求;2、一台NGINX加载多个后端服务。当一个服务或几个服务退出进程时,还有其他服务在工作;NGINX只需要引入proxy_pass命令和对应的上游上下文就可以实现负载均衡。一个简单的负载均衡配置如??实验前请启动多个后端程序。可以把刚才的Flask代码复制到另一个文件(比如/home/ubuntu/main.py,但是记得改里面的端口号,建议按照教程改成6799),如果你想看网页负载,可以在响应内容中使用6789/6799来区分具体的后端程序。#/etc/nginx/conf.d/ke.conf内容改为upstreambackend{serverlocalhost:6789;服务器本地主机:6799;}服务器{听8000;服务器名称本地主机;位置/{proxy_passhttp://backend;}}保存并重新加载配置>sudonginx-sreload多次访问http://101.42.137.185:8000/,可以看到页面显示的内容是6789和6799,这两个后端服务返回信息交替。这表示负载均衡配置成功。域名解析及配置实践打开云服务商控制台(后面会以腾讯云为例,因为教程录制使用的是腾讯云轻量级服务器)。其他云服务商接口不同,请见机行事。在搜索框里搜索域名解析(腾讯的是DNSPOD)然后回车找到要解析的域名(这里的前提是你已经买了域名并做了备案,如果没有那我来做),点击解析,点击添加记录,在主机记录处输入子域名(如ke),在记录值处输入服务器IP地址,然后选择保存。其他选项默认。云服务器控制台设置完成后,仍然无法通过域名访问我们服务器上的应用程序去服务器更改NGINX辅助配置文件,更改端口,绑定域名>sudovim/etc/nginx/conf.d/ke.conf#更改服务器上下文中的listen和server_namelisten80;server_nameke.chuanjiabing.com;记得reloadconfiguration>sudonginx-sreload然后就可以通过域名http://ke.chuanjiabing.com/来访问和服务作业了:把社区课程下后台程序的NGINX负载均衡配置截图贴出来帖子,3张图片。一张是配置截图;另外两张是浏览器访问时加载配置生效的截图。后续进阶篇和企业实践篇的课程大纲如下。后续课程学习目的:能够在工作中很好的应用NGINX,完成企业级生产环境部署和NGINX监控告警高级篇NGINX负载均衡策略理论编译安装NGINX基于权限验证的实现NGINX基于NGINX的访问限制基于NGINX的简单反爬虫基于NGINX实现不间断更新企业级实战篇NGINXHTTPS配置实战NGINX插件安装NGINX数据监控实战NGINX生产环境高可用部署实战