写在前面Nginx是高性能轻量级WEB服务器的优秀代表,因为它提供了HTTP代理和反向代理、负载均衡、缓存等一系列重要特性,所以在当今互联网的Web后端服务中被广泛使用,各大互联网公司也大量使用它,所以作为开发者,学习如何使用和配置Nginx是很有必要的。在本文中,我们将从一个示例配置列表入手,简单梳理一下Nginx服务器各种常用配置命令的作用和用法。话不多说,上菜吧!本文已收录在GitHub开源仓库《编程之路》https://github.com/rd2coding/Road2Coding,里面包含了6大编程方向(帖子)+知识点整理的自学路线,面试考点,还有我的欢迎欣赏我的简历,几本硬核pdf笔记,还有我的程序员生活。这里直接画图可以一目了然Nginx配置文件的整体结构,几个大的配置模块可以看的一清二楚。从图中可以看出,主要包括以下几个部分:1.全局块这部分的配置主要影响Nginx的全局,通常包括以下几个部分:配置运行Nginx服务器用户的worker进程数(群)Nginx进程PID存储路径错误日志存储路径配置文件介绍...2.events块的配置主要影响Nginx服务器与用户之间的网络连接,主要包括:设置是否序列化网络连接允许同时接收多个网络连接事件驱动模型的选择最大连接数的配置...3.http块定义了MIMI-Type自定义服务日志是否允许sendfile方式的文件传输Connectiontimeouttimelimitfornumberofsingleconnectionrequests...4.服务器块配置网络端口以监视访问日志和错误页面基于名称的虚拟主机配置基于IP的虚拟主机配置位置块配置...5。locationblocklocationconfigurationrequestrootdirectoryconfigurationchangelocationURIwebsitedefaulthomepageconfiguration...aconfigurationlistexampleanalysis这里有一个简单的Nginx配置列表示例:配置代码如下:usernobodynobody;worker_processes3;error_loglogs/error.log;pidlogs/nginx.pid;events{使用epoll;worker_connections1024;}http{包括mime.types;default_type应用程序/八位字节流;log_formatmain'$remote_addr-$remote_user[$time_local]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x_forwarded_for"';access_log日志/access.logmain;发送文件;keepalive_timeout65;服务器{听8088;server_name代码羊;access_log/codesheep/webserver/server1/log/access.log;error_page404/404.html;位置/server1/location1{root/codesheep/webserver;索引index.server2-location1.htm;}location/server1/location2{root/codesheep/webserver;索引index.server2-location2.htm;}}服务器{听8089;服务器名称192.168.31.177;access_log/codesheep/webserver/server2/log/access.log;error_page404/404.html;位置/server2/location1{root/codesheep/webserver;索引index.server2-location1.htm;}location/srv2/loc2{别名/codesheep/webserver/server2/location2/;索引index.server2-location2.htm;}location=/404.html{root/codesheep/webserver/;索引404.html;下面我们将根据这个示例配置列表来详细分析配置文件中几个主要命令的含义和用法。Nginx用户(组)配置配置项格式:user用户[组];用户组:指定可以运行Nginx的用户组(可选)。如果没有配置user命令或者配置为usernobodynobody,默认所有用户都可以启动Nginx进程。Worker进程数配置这是Nginx服务器实现并发处理的关键配置。配置项的格式为:worker_processesnumber;number:Nginx进程可以产生的最大worker进程数。如果设置为auto,Nginx会根据上面配置列表的实验自动检测,我们为worker_processes配置的数量为:3。启动Nginx服务器后,我们可以查看一下Nginx进程后台主机:ps-aux|grepnginx很明显,也很容易理解worker_processes命令的意思errorlogpathconfiguration配置项格式:error_logfile[optionalloglevel];file:指定日志输出到一个文件,常见的可选日志级别包括:info、debug、warn、error...等。Nginx进程PID存储路径配置由于Nginx进程作为系统守护进程在后台运行,因此该选项用于自定义配置的PID文件的存储路径。配置项格式:pid文件;file:指定其存放路径+文件名如果不指定,将放在默认路径logs/nginx.pid事件驱动模型配置配置项格式:usemodel;model模型可选项包括:select、poll、kqueue、epoll、rtsig等...最大连接数配置配置项格式:worker_connectionsnumber;number默认值为512,表示每个worker进程可以同时打开的最大连接数。配置文件引入该配置主要用于将其他或第三方的Nginx配置文件引入到当前主配置文件中。配置项格式:includeconf_file;serializationconfiguration网络连接的配置项格式:accept_mutexon;该配置默认为onStatus,表示多个Nginxworker进程将接收序列化的连接,以防止多个worker进程竞争连接。说到这个指令,首先要说明什么是所谓的“惊群问题”。就Nginx场景而言,大意是:当一个新的网络连接到来时,多个worker进程会同时被唤醒,但只有一个进程能真正拿到连接并进行处理。如果每次唤醒的进程数过多,其实会影响一部分性能。所以这里如果accept_mutex开启,那么多个worker会被串行处理,一个worker会被唤醒;否则,如果accept_mutex关闭,那么所有的worker都会被唤醒,但只有一个worker可以获得新的连接,其他worker将重新进入休眠状态。这个值是否切换取决于具体的场景,一定程度上会影响系统的吞吐量。Nginx默认开启accept_mutex,这也是一种保守的做法。多网连接接收配置配置项格式:multi_acceptoff;此配置默认关闭,这意味着每个工作进程一次只能接收一个新到达的网络连接。如果希望每个Nginxworker进程同时接收多个网络连接,则需要启用该配置。MIME-Type定义MIME-Type是指网络资源的媒体类型,即前端请求的资源类型。配置项格式:包括mime.types;default_type类型类型;include配置用于包含mime.types文件。您可以使用catmime.types查看mime.types文件的内容。我们发现是一个types结构体,里面包含了各种浏览器识别的MIME类型,对应的文件扩展名如下:accesslogconfiguration配置项格式:access_logpath[format];路径:自定义访问日志路径+名称格式:自定义服务日志格式(可选)。connectiontimeoutconfiguration配置项的格式:keepalive_timeout超时[header_timeout];timeout表示服务器保持连接的时间。header_timeout表示在响应消息头的Keep-Alive字段中设置的超时时间,可选。sendfileconfiguration配置项格式:sendfileon;sendfile配置用于启用或禁用使用sendfile()系统调用来传输文件,默认是关闭注意:在很多WebServer中,引入sendfile机制来实现高性能的文件传输。网络地址监听配置配置项格式:第一种:配置监听IP地址:listenIP[:PORT];第二种:配置监听端口:listenPORT;实例:监听192.168.31.177:8080;#监听IP和端口上的特定连接listen192.168.31.177;#监听特定IP上所有端口的连接listen8080;#监听特定端口上所有IP的连接NameorIP-basedvirtualhostconfiguration配置项格式:server_namename1name2...name可以有多个并列的名字,这里的名字支持正则表达式写法。实际例子:server_name~^www\.codesheep\d+\.com$;至于基于IP的虚拟主机配置就更简单了:配置项格式:server_nameIP地址location配置配置项的格式为:location[=|~|?*|^~]/uri/{...}这里的uri可以包含正则表达式的模糊匹配。uri前面方括号中的内容是可选的,常见的几种情况如下:"=":用于标准uri,用于精确字符串匹配"~":用于常规uri,表示区分大小写匹配"~*":用于正则uri,表示不区分大小写匹配"^~":用于标准uri,^表示前缀匹配,~表示区分大小写Rootdirectoryconfiguration配置项格式:根路径;path:表示Nginx收到请求后,找到资源的根目录路径。当然你也可以通过alias命令改变location接收到的URI请求路径。命令为:别名路径;#path是修改后的根路径。默认主页配置配置项格式:indexindex_file......index_file可以包含多个文件名,用空格隔开,先找到的页面用于响应。后记本文已收录于GitHub开源仓库《编程之路》https://github.com/rd2coding/Road2Coding,包含6大编程方向(帖子)+知识点梳理的自学路线,面试考点,欢迎欣赏我的简历,几篇硬核pdf笔记,以及我的程序员生活。下次见!
