这是一个免费知识系列,有图文版和视频版,您现在看到的是图文版。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
穿甲兵技术社区