当你意识到自己想和某人共度余生时,你希望余生尽快开始。
当你意识到自己想共度余生时与某人共度余生当人们一起度过余生时,他们会迫不及待地等待下半生立即开始。——《当哈利遇到莎莉》1989基本概述或许80端口和443端口进阶了,我们就能想到对应的Http访问【基于HTTP协议】和Https访问【基于HTTP协议+SSL证书】。记忆深刻的是,在开发微信小程序时,对应的域名配置要求必须是通过备案认证的Https服务。因此,在配置之前,我们需要了解Nginx包含哪些模块和配置规则,以及它是如何工作的,以便更好地使用Nginx和理解Nginx。Nginx由内核和模块组成。其中内核的设计非常小巧简洁,完成的工作也非常简单。只需查找配置文件,客户端请求就会被映射到一个location块(location是Nginx配置中的一条指令,用于URL匹配),在这个location配置的每条命令都会启动不同的模块来完成相应的工作。Nginx模块在结构上分为核心模块、基础模块和第三方模块。HTTP模块、EVENT模块和MAIL模块是核心模块。HTTPAccess模块??、HTTPFastCGI模块、HTTPProxy模块和HTTPRewrite模块是基础模块。HTTPUpstreamRequestHash模块、Notice模块和HTTPAccessKey模块属于第三方模块,用户根据自己的需求开发的模块均为第三方模块。正是有了这么多模块的支持,Nginx的功能才会如此强大。Nginx由内核和模块组成。其中内核的设计非常小巧简洁,完成的工作也非常简单。只需查找配置文件,客户端请求就会被映射到一个location块(location是Nginx配置中的一条指令,用于URL匹配),在这个location配置的每条命令都会启动不同的模块来完成相应的工作。Nginx结构分析以nginx-1.19.8版本为例:Nginx的源码主要分布在src/目录下,src/目录下主要包含三个重要模块:core:基础核心的核心源码libraryandframeworkNginx,包括常用的数据结构和Nginx内核实现的核心代码。event:事件驱动模型Nginx事件驱动模型,以及实现定时器的相关代码。http:Nginx的HTTP模块,实现了http服务器相关的代码。mail:Nginx的邮件服务模块,实现了邮件代理服务器相关的代码。misc:集成模块辅助代码,测试C++头文件兼容性,支持Google_PerfTools。os:对系统模块不同系统结构所提供的系统功能的封装,对外提供统一的系统调用接口。stream:流处理模块Nginx(tcp/udp)反向代理,与上游通信的基础模块。Nginx事件驱动模型Nginx支持的模型主要有Select库、Eventport库、Poll库、Epoll库、Kqueue库、Devpoll库、Eventport库。select库:linux和windows平台基本支持的事件驱动模型库,接口定义基本一致,只是部分参数含义略有不同,最大并发限制为1024,仅最早的事件驱动模型。poll库:在Linux的基本驱动模型中,windows不支持该驱动模型。是select的升级版,取消了最大并发限制。编译nginx时可以使用--with-poll_module和--without-poll_module指定是否编译select库。epoll库:Nginx服务器支持的最高性能的事件驱动库之一。是公认的非常好的事件驱动模型。它与select和poll有很大不同。epoll是poll的升级版,但是效率和poll不同。有一个很大的不同。epoll的处理方式是创建一个待处理的事件列表,然后将这个列表发送给内核。返回时,轮流检查此表以确定是否发生事件。epoll支持一个进程打开的最大事件描述符的上限是系统可以打开的最大文件数。同时,epoll库的IO效率不会随着描述符数量的增加而线性下降,因为它只对内核上报的“活跃”描述符进行操作。kqueue库:用于支持BSD系列平台的大学事件驱动模型,主要用于FreeBSD4.1及以上、OpenBSD2.0及以上、NetBSD以上及MacOSX平台,该模型也是poll库的变种,所以与epoll没有本质区别,都是通过避免轮训操作来提供效率的。Devpoll库:用于支持unix衍生平台的高效事件驱动模型,主要在Solaris平台和HP/UX上。该模型是sun公司在开发Solaris系列平台时为了完成事件驱动机制而提出的解决方案。它使用虚拟/dev/poll设备。开发人员将他们想要查看的文件描述符添加到这个设备中,然后调用ioctl()来获取事件通知。因此,在上述系列平台上运行时,请使用/dev/poll事件驱动机制。Eventport库:是Sun公司在开发Solaris时提出的事件驱动库。它只是Solaris10以上的版本。该驱动库用于防止内核崩溃等情况。Nginx工作原理Nginx模块按功能分为三类,即:Handlers(处理器模块):直接处理请求,进行输出内容、修改headers信息等操作。handlers处理器模块一般只有一个。Filters->过滤器模块:主要修改其他处理器模块输出的内容,最终由Nginx输出。Proxies->proxy模块:NginxHTTPUpstream等模块,这些模块主要与一些后端服务交互如fastcgi等操作,实现服务代理、负载均衡等功能。Nginx模块下,一个常规的HTTP请求和响应流程:在工作方式上,Nginx分为单工作进程和多工作进程两种模式:在单工作进程模式下,除了主进程外,还有还有一个Work进程,工作进程是单线程的。在多工作进程模式下,每个工作进程包含多个线程。Nginx默认为单工作进程模式。Nginx模块直接编译成Nginx,属于静态编译方式。启动Nginx后,会自动加载Nginx模块,不像Apache先将模块编译成so文件,然后在配置文件中指定是否加载。Nginx的每个模块在解析配置文件时,可能会处理某个请求,但同一个处理请求只能由一个模块完成。NginxHttp模块Nginx常用模块:ngx_http_access_module模块:只有allow[允许访问]和deny[拒绝访问]一般用于设置和控制IP请求,类似于网络黑名单的功能。位置/{根html;indexindex.htmlindex.htm;允许127.0.0.1;##允许127.0.0.1访问拒绝127.0.0.1;##拒绝127.0.0.1访问}ngx_http_auth_basic_module模块:实现基于用户的访问控制,使用Basic机制进行用户认证location/{roothtml;indexindex.htmlindex.htm;auth_basic“管理员”;##认证对话框的提示字符串显示内容auth_basic_user_file/etc/nginx/conf/htpasswd;##Storeauthentication使用的用户名和文件需要用htpasswd命令生成}应用htpasswd需要安装httpd-tools:yuminstallhttpd-tools使用命令生成:htpasswd-c/etc/nginx/conf/htpasswdnginx[root@cotos-pivotalnginx]#htpasswd-c/etc/nginx/conf/htpasswdnginxNewpassword:Re-typenewpassword:添加用户密码nginxngx_http_stub_status_module模块:用于查看http的状态信息,直接在location中使用,加上stub_statuslocation/{roothtml;indexindex.htmlindex.htm;auth_basic“管理员”;##认证对话框提示字符串显示的内容auth_basic_user_file/etc/nginx/conf/htpasswd;##存储用于认证的用户名和文件,需要使用htpasswd命令Generatestub_status;}Status参数分析:Activeconnections:活跃连接数;接受:接受的客户请求总数;handled:已处理的客户端请求总数;requests:客户端发送的请求总数;Reading:正在读取客户端请求报文头部的连接数;Writing:客户端连接数Waiting:等待客户端发送请求的空闲连接数;ngx_http_log_module模块:日志模块ngx_http_gzip_module模块:压缩模块,有利于减少传输数据的大小,但CPU占用率会变高,因为要压缩传输数据gzipon;gzip_comp_level6;gzip_min_length64;gzip_proxiedany;gzip_typestext/xml文本/css应用程序/javascript;ngx_http_ssl_module模块:设置https连接模块服务器{listen443ssl;server_namewww.ice.com;根/var/www/html;SSL开启;ssl_certificate/usr/local/nginx/ssl/ssl.crt;ssl_certificate_key/usr/local/nginx/ssl/ssl.key;ssl_session_cache共享:sslcache:20m;location/{indexindex.htmlindex.htm;}}}ngx_http_rewrite_module模块:rewrite指令rewriteregexreplacement[flag]:根据regex描述的pattern检查用户请求的URI,匹配则替换为replacement指定的新URI;如果rewrite规则中有多个同级的配置块,从下到下逐一检查;被条件规则替换后,会进行新一轮的替换检查,因此隐含了循环机制;[flag]表示的标志位,用来控制这个循环机制;其中:last:如果有很多条规则。改写完成一次后,会重新开始匹配规则,直到最后一条。那是。规则写不好,很容易造成死循环,规则不断改写。break:改写完成后,规则不再从头匹配。直接跳出循环重定向:重写完成后,将重写后生成的新URI以临时重定向的方式直接返回给客户端,客户端重新发起请求;不能以http://或https://开头;permanent:重复写入完成后,将重写后生成的新URI以永久重定向的形式直接返回给客户端,客户端重新发起请求;ngx_http_referer_module模块:反盗链定义了referer头的合法可用值:none:请求消息头没有referer头blocked:请求消息的referer头没有值server_names:参数,可以有作为主机名或主机名模式的值arbitrary_string:直接字符串,但*可用作通配符正则表达式:由指定的正则表达式模式字符串匹配;使用~启动valid_referersnoneblockserver_names*.pivotal.com;如果($invalid_referer){返回403;}ngx_http_headers_module模块:在代理服务器发送给客户端的响应消息中添加自定义配置完整的Nginx配置文件:#SettingNginxUserGroupuserroot;#设置Nginx进程worker_processes1;#设置Nginx最大Nofileworker_rlimit_nofile51200;#SettingNginx事件events{worker_connections51200;}#SettingNginxHttphttp{includemime.types;default_type#Settingapplication/octNginxFastCGI[避免使用504、502等]fastcgi_connect_timeout600s;fastcgi_send_timeout600s;fastcgi_read_timeout600s;fastcgi_buffer_size256k;fastcgi_buffers16256k;fastcgi_busy_buffers_size512k;fastcgi_temp_file_write_size512k;发送超时60000;client_header_buffer_size64k;large_client_header_buffers464k;发送文件;tcp_nopush上;tcp_nodelayon;#keepalive_timeout0;keepalive_timeout120;#文件上传最大限制50M默认为1mclient_max_body_size100m;#gzip上;#SettingNginxGzipgzipon;gzip_min_length1k;gzip_buffers416k;gzip_http_version1.0;gzip_comp_level2;gzip_types文本/纯应??用程序/x-javascript文本/css应用程序/xml;gzip_vary开启;配置负载均衡】#后台系统web层tomcat端口monitor-8090upstreammonitor.com{ip_hash;服务器本地主机:8090;}#前台界面web层tomcat端口proscenium-8091upstreamproscenium.com{ip_hash;服务器本地主机:8091;}#移动接口web层tomcat端口mobile-8092upstreammobile.com{ip_hash;服务器本地主机:8092;}#后台系统web层tomcat端口schedule-8093upstreamschedule.com{ip_hash;服务器本地主机:8093;}服务器{听80;服务器名称本地主机;#Processwebsocketrequestlocation/monitor{#请求重定向到定义的服务器列表proxy_passhttp://monitor.com/智萌;add_header访问控制允许来源*;add_headerAccess-Control-Allow-HeadersX-Requested-With;add_headerAccess-Control-Allow-MethodsGET、POST、OPTIONS;proxy_set_header主机$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;#超时设置默认300sproxy_read_timeout300s;proxy_send_timeout300s;}location/proscenium{#请求重定向到定义的服务器列表proxy_passhttp://proscenium.com;add_headerAccess-Control-Allow-Origin*;add_headerAccess-Control-Allow-HeadersX-Requested-With;add_header访问控制ol-Allow-MethodsGET、POST、OPTIONS;proxy_set_header主机$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;#超时设置默认300sproxy_read_timeout300s;proxy_send_timeout300s;#请求重定向到定义的服务器列表proxy_passhttp://mobile.com;add_header访问控制允许来源*;add_headerAccess-Control-Allow-HeadersX-Requested-With;add_headerAccess-Control-Allow-MethodsGET、POST、OPTIONS;proxy_set_header主机$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;#超时设置默认300sproxy_read_timeout300s;proxy_send_timeout300s;proxy_passhttp://schedule.com/;add_header访问控制允许来源*;add_header访问控制允许标头X-请求-With;add_headerAccess-Control-Allow-MethodsGET、POST、OPTIONS;proxy_set_header主机$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;#超时设置默认300sproxy_read_timeout300s;proxy_send_timeout300s;}error_page500502503504/50x.html;location=/50x.html{根html;}location/staticFile{别名/root/repository/staticFile;自动索引;autoindex_exact_size开启;autoindex_localtime开启;}}}版权声明:本文为博主原创文章,遵循相关版权协议。如需转载或分享,请附上原文出处链接和链接出处
