赞
踩
公司项目里的静态资源是用Nginx加载的,一直想学习下,网上找了些视频。好坏参差不齐,看了看,继而找了这本书看,只看了第一部分内容。学习基本的配置方式,了解Nginx基本概念,第二部分编写HTTP模块,和第三部分深入Nginx以后有机会看。之后会补充一些常见的运维场景,生活加油。
笔记分为三部分:
Web服务器的基本功能:基于REST架构风格 ,以统一资源描述符(Uniform Resource Identifier,URI)或者统一资源定位符(Uniform Resource Locator,URL)作为沟通依据,通 过HTTP为浏览器等客户端程序提供各种网络服务。
来自俄罗斯的Igor Sysoev在为Rambler Media(http://www.rambler.ru/ )工作期间,使用C 语言开发了Nginx。
Nginx是一个跨平台的Web服务器,可运行在Linux、FreeBSD、Solaris、AIX、Mac OS、 Windows等操作系统上,并且它还可以使用当前操作系统特有的一些高效API来提高自己的 性能。
对于高效处理大规模并发连接,它支持Linux上的epoll(epoll是Linux上处理大并发网络连接的利器。对于Linux,Nginx支持其独有的sendfile系统调用,这个系统调用可以高效地把硬 盘中的数据发送到网络上(不需要先把硬盘数据复制到用户态内存上再发送),这极大地减 少了内核态与用户态数据间的复制动作。
更快:
高扩展性:
高可靠性
低内存消耗
单机支持10万以上的并发连接
热部署
最自由的BSD许可协议
在低并发压力下,用户可以获得高速 体验,而在高并发压力下,更多的用户都能接入,可能访问速度会下降。
Nginx先天的事件驱动型设计、全异步的 网络I/O处理机制、极少的进程间切换以及许多优化设计,都使得Nginx天生善于处理高并发 压力下的互联网请求,同时Nginx降低了资源消耗,可以把服务器硬件资源“压榨”到极致。
- #######需要将lnmp_soft.tar.gz 拷贝到虚拟机的 /root 目录下
- ##解压二阶段软件包
- [root@web1 ~]# tar -xf lnmp_soft.tar.gz
- ##将nginx的源码包,解压到 /root 目录下
- [root@web1 ~]# tar -xf /root/lnmp_soft/nginx-1.16.1.tar.gz -C /root/
安装nginx 源码安装相关软件包
- ##安装nginx 源码安装相关软件包
- [root@web1 ~]# yum -y install gcc pcre-devel openssl-devel
- [root@web1 ~]# useradd nginx #创建nginx 登录用户
- [root@web1 ~]# cd /root/nginx-1.16.1/
- [root@web1 nginx-1.16.1]# ./configure \
- > --prefix=/usr/local/nginx \ #指定安装目录
- > --user=nginx \ #指定账户名称
- > --group=nginx \ #指定组名称
- > --with-http_ssl_module #支持加密功能
- ##编译并且安装
- [root@web1 nginx-1.16.1]# make && make install
- [root@web1 nginx-1.16.1]# ls /usr/local/nginx/
- conf html logs sbin
- ##conf 存放配置文件
- ##html 存放网页文件
- ##logs 存放日志文件
- ##sbin 存放主程序
使用yum安装,使用systemclt start |enable|stop|restart nginx 的启动方式
使用编译安装 ,启动方式方式使用 /usr/sbin/nginx的方式启动,或者配置环境变量。具体可以使用命令行控制。
启动之后的欢迎页:阿里云yum安装默认是centoS 的欢迎页
把原来的欢迎页干掉。把我csdn的主页copy进去
- [root@liruilong ~]# cat /dev/null > /usr/share/nginx/html/index.html
- [root@liruilong ~]# vim /usr/share/nginx/html/index.html
- [root@liruilong ~]#
部署Nginx时都是使用一个master进程来管理多个worker 进程,一般情况下,worker进程的数量与服务器上的CPU核心数相等。每一个worker进程都 是繁忙的,它们在真正地提供互联网服务,master进程则很“清闲”,只负责监控管理worker 进程。worker进程之间通过共享内存、原子操作等一些进程间通信机制来实现负载均衡等功能
master进程不会对用户请求提供服务,只用于管理真正提供服务的worker进程, 所以master进程可以是唯一的,它仅专注于自己的纯管理工作,为管理员提供命令行服务, 包括诸如启动服务、停止服务、重载配置文件、平滑升级程序等。master进程需要拥有较大 的权限,当任意一个worker进程出现错误从而导 致coredump时,master进程会立刻启动新的worker进程继续服务。
多个worker进程处理互联网请求不但可以提高服务的健壮性(一个worker进程出错 后,其他worker进程仍然可以正常提供服务),最重要的是,这样可以充分利用现在常见的 SMP多核架构,从而实现微观上真正的多核并发处理。
为什么要把worker进程数量设置得与CPU核心数量 一致呢?
这正是Nginx与Apache服务器的不同之处。在Apache上每个进程在一个时刻只处理 一个请求,因此,如果希望Web服务器拥有并发处理的请求数更多,就要把Apache的进程或 线程数设置得更多,通常会达到一台服务器拥有几百个工作进程,这样大量的进程间切换将带来无谓的系统资源消耗。而Nginx则不然, 一个worker进程可以同时处理的请求数只受限于 内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入睡眠状态,因此,当Nginx上的进程数与CPU核心数相等时(最好每一个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的。
nginx目录
- [root@liruilong ~]# cat /etc/nginx/nginx.conf
- # For more information on configuration, see:
- # * Official English Documentation: http://nginx.org/en/docs/
- # * Official Russian Documentation: http://nginx.org/ru/docs/
-
- user nginx;
- worker_processes auto;
- error_log /var/log/nginx/error.log;
- pid /run/nginx.pid;
-
- # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
- include /usr/share/nginx/modules/*.conf;
-
- events {
- worker_connections 1024;
- }
-
- http {
- log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for"';
-
- access_log /var/log/nginx/access.log main;
-
- sendfile on;
- tcp_nopush on;
- tcp_nodelay on;
- keepalive_timeout 65;
- types_hash_max_size 2048;
-
- include /etc/nginx/mime.types;
- default_type application/octet-stream;
-
- # Load modular configuration files from the /etc/nginx/conf.d directory.
- # See http://nginx.org/en/docs/ngx_core_module.html#include
- # for more information.
- include /etc/nginx/conf.d/*.conf;
-
- server {
- listen 80 default_server;
- listen [::]:80 default_server;
- server_name _;
- root /usr/share/nginx/html;
-
- # Load configuration files for the default server block.
- include /etc/nginx/default.d/*.conf;
-
- location / {
- }
-
- error_page 404 /404.html;
- location = /404.html {
- }
-
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- }
- }
-
- # Settings for a TLS enabled server.
- #
- # server {
- # listen 443 ssl http2 default_server;
- # listen [::]:443 ssl http2 default_server;
- # server_name _;
- # root /usr/share/nginx/html;
- #
- # ssl_certificate "/etc/pki/nginx/server.crt";
- # ssl_certificate_key "/etc/pki/nginx/private/server.key";
- # ssl_session_cache shared:SSL:1m;
- # ssl_session_timeout 10m;
- # ssl_ciphers HIGH:!aNULL:!MD5;
- # ssl_prefer_server_ciphers on;
- #
- # # Load configuration files for the default server block.
- # include /etc/nginx/default.d/*.conf;
- #
- # location / {
- # }
- #
- # error_page 404 /404.html;
- # location = /404.html {
- # }
- #
- # error_page 500 502 503 504 /50x.html;
- # location = /50x.html {
- # }
- # }
-
- }
-
- [root@liruilong ~]#
块配置项:块配置项由一个块配置项名和一对大括号组成。
块配置项之 后是否如“location / {...}”那样在后面加上参数,取决于解析这个块配置项的模块。块配置项可以嵌套。内层块直接继承外层块
- events {
- worker_connections 1024;
- }
- location / {
- }
配置项的语法格式 : 在行首的是配置项名,配置项名输入结束后,将以空格作为分隔符,其次是配置项值,它可以是数字或字符串(当然也包括正则表达式),配置项值之间仍然由空格符来分隔,每行配置的结尾需要加上分号。
- log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $bytes_sent "$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for"';
Nginx在运行时,至少必须加载几个核心模块和一个事件类模块。这些模块运行时所支持的配置项称为基本配置——所有其他模块执行时都依赖的配置项。
基本配置项的用法:
在Linux系统中,当进程发生错误或收到信号而终止时,系统会将进程执行时的内存内 容(核心映像)写入一个文件(core文件),以作为调试之用,这就是所谓的核心转储 (core dumps)。当Nginx进程出现一些非法操作(如内存越界)导致进程直接被操作系统强 制结束时,会生成核心转储core文件,可以从core文件获取当时的堆栈、寄存器等信息,从 而帮助我们定位问题
- [root@liruilong ~]# openssl engine -t
- (rdrand) Intel RDRAND engine
- [ available ]
- (dynamic) Dynamic engine loading support
- [ unavailable ]
- [root@liruilong ~]#
静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现.
- http {
- gzip on;
- upstream {
-
- }
- server {
- listen localhost: 80;
-
- location /webstatic {
- if {
-
- }
- root optwebresource;
- }
- location ~* .(jpg|jpeg|png|jpe|gif)$ {
-
- }
- }
- server{
-
- }
- }
所有的HTTP配置项都必须直属于http块、server块、location块、upstream块或if块等 (HTTP配置项自然必须全部在http{}块之内.,Nginx为配置一个完整的静态Web服务器提供了非常多的功能,下面会把这些配置项分为 以下8类进行详述:
虚拟主机与请求的分发、文件路径的定义、内存及磁盘资源的分配、网 络连接的设置、MIME类型的设置、对客户端请求的限制、文件操作的优化、对客户端请求 的特殊处理。
在nginx.conf中就可以按照server_name(对应用户请求中的主机域名)并通过server块来定义 虚拟主机,每个server块就是一个虚拟主机,它只处理与之相对应的主机域名请求。
监听端口 语法: listen address:port[default|default_server[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|bind|ipv6only=[on|off]|ssl]]; 默 认: listen 80;
- listen 127.0.0.1:8000;
- listen 127.0.0.1; #注意:不加端口时,默认监听80端口
- listen 8000;
- listen *:8000;
- listen localhost:8000;
- # 如果服务器使用IPv6地址,那么可以这样使用:
- listen [::]:8000;
- listen [fe80::1];
- listen [:::a8c9:1234]:80;
- # 在地址和端口后,还可以加上其他参数
- listen 443 default_server ssl;
- listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
主机名称 语法: server_name name[...]; 默认: server_name"";
在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的 server_name进行匹配,有可能一个Host与 多个server块中的server_name都匹配,会根据匹配优先级来选择。匹配优先级如下:
如果Host与所有的server_name都不匹配,这时将会按下列顺序选 择处理的server块。
Nginx正是使用server_name配置项针对特定Host域名的请求提供不同的服务, 以此实现虚拟主机功能
server_names_hash_bucket_size 语法: server_names_hash_bucket_size size; 默认: server_names_hash_bucket_size 32|64|128;
为了提高快速寻找到相应server name的能力,Nginx使用散列表来存储server name。 server_names_hash_bucket_size设置了每个散列桶占用的内存大小。
server_names_hash_max_size 语法: server_names_hash_max_size size; 默认: server_names_hash_max_size 512;
server_names_hash_max_size会影响散列表的冲突率。server_names_hash_max_size越大, 消耗的内存就越多,但散列key的冲突率则会降低,检索速度也更快。 server_names_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能增高。
重定向主机名称的处理 语法: server_name_in_redirect on|off; 默认: server_name_in_redirect on;
该配置需要配合server_name使用。在使用on打开时,表示在重定向请求时会使用 server_name里配置的第一个主机名代替原先请求中的Host头部,而使用off关闭时,表示在重 定向请求时使用请求本身的Host头部。
location 语法: location[=|~|~*|^~|@]/uri/{...}
location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择 location{}块中的配置来处理用户请求。当然,匹配方式是多样的,下面介绍location的匹配 规则。
location = / {#只有当用户请求是/时,才会使用该location下的配置}
location ^~ images {# 以images开始的请求都会匹配上…}
@表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请 求。 当然,在uri参数里是可以用正则表达
location ~* \.(gif|jpg|jpeg)$ {# 匹配以.gif、.jpg、.jpeg结尾的请求}
以root方式设置资源路径 语法: root path; 默认: root html; 类似于拼接一个前缀
- #定义资源文件相对于HTTP请求的根目录。
- location /download/ {
- root optwebhtml;
- #如果有一个请求的URI是/download/index/test.html,那么Web服务器将会返回服务器上optwebhtml/download/index/test.html文件的内容
- }
以alias方式设置资源路径 语法: alias path; alias也是用来设置文件资源路径的,类似于别名
它与root的不同点主要在于如何解读紧跟location后 面的uri参数,顾名思义,alias后面还可以添加正则表达式。
- location conf {
- alias usr/local/nginx/conf/; #当访问conf下的资源的时候,实际目录为usr/local/nginx/conf/
- }
访问首页 语法: index file...; 默认: index index.html;
访问站点时的URI是/,用ngx_http_index_module模块提供的index配置实现。index后可以跟多个文件参数,Nginx 将会按照顺序来访问这些文件。Nginx首先会尝试访问path/index.php文件,如果可以访问,就直接返回文 件内容结束请求,否则再试图返回path/htmlindex.php文件的内容,
- location {
- root path;
- index index.html htmlindex.php /index.php;
- }
根据HTTP返回码重定向页面 语法: error_page code[code...][=|=answer-code]uri|@named_location
当对于某个请求返回错误码时,如果匹配上了error_page中设置的code,则重定向到新 的URI中。例如:
- error_page 404 404.html;
- error_page 502 503 504 50x.html;
- error_page 403 http://example.com/forbidden.html;
- #通过“=”来更改返回的错误码
- error_page 404 = @fetch;
- error_page 404 =200 empty.gif;
- error_page 404 =403 forbidden.gif;
- #也可以不指定确切的返回错误码,而是由重定向后实际处理的真实结果来决定.
- error_page 404 = /empty.gif;
如果不想修改URI,只是想让这样的请求重定向到另一个location中进行处理,返回404的请求会被反向代理到http://backend 上游服务器中处理。
- location / {
- #如果不想修改URI,只是想让这样的请求重定向到另一个location中进行处理,
- error_page 404 @fallback;
- }
- location @fallback {
- proxy_pass http://backend;
- }
是否允许递归使用error_page 语法: recursive_error_pages[on|off]; 默认: recursive_error_pages off;
确定是否允许递归地定义error_page。
try_files 语法: try_files path1[path2]uri;
try_files后要跟若干路径,如path1 path2...,尝试 按照顺序访问每一个path,如果可以有效地读取,就直接向用户返回这个path对应的文件结 束请求,否则继续向下访问。如果所有的path都找不到有效的文件,就重定向到最后的参数 uri上。因此,最后这个参数uri必须存在,而且它应该是可以有效重定向的。
- try_files systemmaintenance.html $uri $uri/index.html $uri.html @other;
- location @other {
- proxy_pass http://backend;
- }
- #还可以用指定错误码的方式与error_page配合使用
- location {
- try_files $uri $uri /error.phpc=404 =404;
- }
HTTP包体只存储到磁盘文件中 语法: client_body_in_file_only on|clean|off; 默认: client_body_in_file_only off;
当值为非off时,用户请求中的HTTP包体一律存储到磁盘文件中,即使只有0字节也会存储为文件。当请求结束时,如果配置为on,则这个文件不会被删除(该配置一般用于调试、 定位问题),但如果配置为clean,则会删除该文件。
HTTP包体尽量写入到一个内存buffer中 语法: client_body_in_single_buffer on|off; 默认:client_body_in_single_buffer off;
用户请求中的HTTP包体一律存储到内存buffer中。当然,如果HTTP包体的大小超过了 下面client_body_buffer_size设置的值,包体还是会写入到磁盘文件中。
存储HTTP头部的内存buffer大小 语法: client_header_buffer_size size; 默认: client_header_buffer_size 1k;
上面配置项定义了正常情况下Nginx接收用户请求中HTTP header部分(包括HTTP行和 HTTP头部)时分配的内存buffer大小。有时,请求中的HTTP header部分可能会超过这个大 小,这时large_client_header_buffers定义的buffer将会生效。
配置块: http、server
存储超大HTTP头部的内存buffer大小 语法: large_client_header_buffers number size; 默认: large_client_header_buffers 48k;
large_client_header_buffers定义了Nginx接收一个超大HTTP头部请求的buffer个数和每个 buffer的大小。如果HTTP请求行(如GET/index HTTP/1.1)的大小超过上面的单个buffer,则 返回"Request URI too large"(414)。请求中一般会有许多header,每一个header的大小也不能超 过单个buffer的大小,否则会返回"Bad request"(400)。当然,请求行和请求头部的总和也不可 以超过buffer个数*buffer大小。
存储HTTP包体的内存buffer大小 语法: client_body_buffer_size size; 默认: client_body_buffer_size 8k/16k;
定义了Nginx接收HTTP包体的内存缓冲区大小。也就是说,HTTP包体会先 接收到指定的这块缓存中,之后才决定是否写入磁盘。
HTTP包体的临时存放目录 语法: client_body_temp_path dir-path[level1[level2[level3]]] 默认: client_body_temp_path client_body_temp;
在接收HTTP包体时,如果包体的大小大于 client_body_buffer_size,则会以一个递增的整数命名并存放到client_body_temp_path指定的目 录中。后面跟着的level1、level2、level3,是为了防止一个目录下的文件数量太多,从而导 致性能下降,因此使用了level参数,这样可以按照临时文件名最多再加三层目录
connection_pool_size 语法: connection_pool_size size; 默认: connection_pool_size 256;
Nginx对于每个建立成功的TCP连接会预先分配一个内存池,上面的size配置项将指定这 个内存池的初始大小(即ngx_connection_t结构体中的pool内存池初始大小
request_pool_size 语法: request_pool_size size; 默认: request_pool_size 4k;
Nginx开始处理HTTP请求时,将会为每个请求都分配一个内存池,size配置项将指定这 个内存池的初始大小(即ngx_http_request_t结构体中的pool内存池初始大小)用于减少内核对于小块内存的分配次数。TCP连接关闭时会销毁 connection_pool_size指定的连接内存池,HTTP请求结束时会销毁request_pool_size指定的 HTTP请求内存池,但它们的创建、销毁时间并不一致,因为一个TCP连接可能被复用于多 个HTTP请求。
读取HTTP头部的超时时间 语法: client_header_timeout time(默认单位:秒); 默认: client_header_timeout 60;
客户端与服务器建立连接后将开始接收HTTP头部,在这个过程中,如果在一个时间间 隔(超时时间)内没有读取到客户端发来的字节,则认为超时,并向客户端返回 408("Request timed out")响应。
读取HTTP包体的超时时间 语法: client_body_timeout time(默认单位:秒); 默认: client_body_timeout 60;
此配置项与client_header_timeout相似,只是这个超时时间只在读取HTTP包体时才有 效。
发送响应的超时时间 语法: send_timeout time; 默认: send_timeout 60;
这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户 端一直没有去接收这个数据包。如果某个连接超过send_timeout定义的超时时间,那么Nginx 将会关闭这个连接。
reset_timeout_connection 语法: reset_timeout_connection on|off; 默认: reset_timeout_connection off;
连接超时后将通过向客户端发送RST包来直接重置连接。这个选项打开后,Nginx会在某 个连接超时后,不是使用正常情形下的四次握手关闭TCP连接,而是直接向用户发送RST重 置包,不再等待用户的应答,直接释放Nginx服务器上关于这个套接字使用的所有缓存(如 TCP滑动窗口)。相比正常的关闭方式,它使得服务器避免产生许多处于FIN_WAIT_1、 FIN_WAIT_2、TIME_WAIT状态的TCP连接。
lingering_close 语法: lingering_close off|on|always; 默认: lingering_close on;
该配置控制Nginx关闭用户连接的方式。
lingering_time 语法: lingering_time time; 默认: lingering_time 30s;
lingering_close启用后,这个配置项对于上传大文件很有用。上文讲过,当用户请求的 Content-Length大于max_client_body_size配置时,Nginx服务会立刻向用户发送413(Request entity too large)响应。但是,很多客户端可能不管413返回值,仍然持续不断地上传HTTP body,这时,经过了lingering_time设置的时间后,Nginx将不管用户是否仍在上传,都会把连 接关闭掉。
lingering_timeout 语法: lingering_timeout time; 默认: lingering_timeout 5s;
lingering_close生效后,在关闭连接前,会检测是否有用户发送的数据到达服务器,如果 超过lingering_timeout时间后还没有数据可读,就直接关闭连接;否则,必须在读取完连接缓 冲区上的数据并丢弃掉后才会关闭连接。
对某些浏览器禁用keepalive功能 语法: keepalive_disable[msie6|safari|none]... 默认: keepalive_disablemsie6 safari
HTTP请求中的keepalive功能是为了让多个请求复用一个HTTP长连接,这个功能对服务 器的性能提高是很有帮助的。但有些浏览器,如IE 6和Safari,它们对于使用keepalive功能的 POST请求处理有功能性问题。因此,针对IE 6及其早期版本、Safari浏览器默认是禁用
keepalive超时时间 语法: keepalive_timeout time(默认单位:秒); 默认: keepalive_timeout 75;
一个keepalive连接在闲置超过一定时间后(默认的是75秒),服务器和浏览器都会去关 闭这个连接。当然,keepalive_timeout配置项是用来约束Nginx服务器的,Nginx也会按照规范 把这个时间传给浏览器,但每个浏览器对待keepalive的策略有可能是不同的。
一个keepalive长连接上允许承载的请求最大数 语法: keepalive_requests n; 默认: keepalive_requests 100;
一个keepalive连接上默认最多只能发送100个请求。
tcp_nodelay 语法: tcp_nodelay on|off; 默认: tcp_nodelay on;
确定对keepalive连接是否使用TCP_NODELAY选项。
tcp_nopush 语法: tcp_nopush on|off; 默认: tcp_nopush off;
在打开sendfile选项时,确定是否开启FreeBSD系统上的TCP_NOPUSH或Linux系统上的 TCP_CORK功能。打开tcp_nopush后,将会在发送响应时把整个响应包头放到一个TCP包中 发送。
MIME type与文件扩展的映射 语法: type{...};
定义MIME type到文件扩展名的映射。多个扩展名可以映射到同一个MIME type。
- types {
- text/html html;
- text/html conf;
- image/gif gif;
- image/jpeg jpg;
- }
·默认MIME type 语法: default_type MIME-type; 默认: default_type text/plain;
当找不到相应的MIME type与文件扩展名之间的映射时,使用默认的MIME type作为 HTTP header中的Content-Type。
·types_hash_bucket_size 语法: types_hash_bucket_size size; 默认: types_hash_bucket_size 32|64|128;
为了快速寻找到相应MIME type,Nginx使用散列表来存储MIME type与文件扩展名。 types_hash_bucket_size设置了每个散列桶占用的内存大小。
·types_hash_max_size 语法: types_hash_max_size size; 默认: types_hash_max_size 1024;
types_hash_max_size影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内 存,但散列key的冲突率会降低,检索速度就更快。types_hash_max_size越小,消耗的内存就 越小,但散列key的冲突率可能上升。
按HTTP方法名限制用户请求 语法: limit_except method...{...}
Nginx通过limit_except后面指定的方法名来限制用户请求。方法名可取值包括:GET、 HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、PROPFIND、 PROPPATCH、LOCK、UNLOCK或者PATCH。
- limit_except GET { #禁止GET方法和HEAD方法,但其他HTTP方法是允许的。
- allow 192.168.1.0/32;
- deny all;
- }
HTTP请求包体的最大值 语法: client_max_body_size size; 默认: client_max_body_size 1m;
浏览器在发送含有较大HTTP包体的请求时,其头部会有一个Content-Length字段, client_max_body_size是用来限制Content-Length所示值的大小的。因此,这个限制包体的配置 非常有用处,因为不用等Nginx接收完所有的HTTP包体——这有可能消耗很长时间——就可 以告诉用户请求过大不被接受
对请求的限速 语法: limit_rate speed; 默认: limit_rate 0;
此配置是对客户端请求限制每秒传输的字节数。speed可以使用2.2.4节中提到的多种单 位,默认参数为0,表示不限速。
- server {
- if ($slow) {
- set $limit_rate 4k;
- }
- }
limit_rate_after 语法: limit_rate_after time; 默认: limit_rate_after 1m;
此配置表示Nginx向客户端发送的响应长度超过limit_rate_after后才开始限速
sendfile系统调用 语法: sendfile on|off; 默认: sendfile off;
可以启用Linux上的sendfile系统调用来发送文件,它减少了内核态与用户态之间的两次 内存复制,这样就会从磁盘中读取文件后直接在内核态发送到网卡设备,提高了发送文件的 效率。
AIO系统调用 语法: aio on|off; 默认: aio off;
此配置项表示是否在FreeBSD或Linux系统上启用内核级别的异步文件I/O功能。注意, 它与sendfile功能是互斥的。
directio 语法: directio size|off; 默认: directio off;
此配置项在FreeBSD和Linux系统上使用O_DIRECT选项去读取文件,缓冲区大小为size, 通常对大文件的读取速度有优化作用。注意,它与sendfile功能是互斥的。
directio_alignment 语法: directio_alignment size; 默认: directio_alignment 512;
它与directio配合使用,指定以directio方式读取文件时的对齐方式。一般情况下,512B 已经足够了,但针对一些高性能文件系统,如Linux下的XFS文件系统,可能需要设置到4KB 作为对齐方式
打开文件缓存 语法: open_file_cache max=N[inactive=time]|off; 默认: open_file_cache off;
文件缓存会在内存中存储以下3种信息:
检验缓存中元素有效性的频率 语法: open_file_cache_valid time; 默认: open_file_cache_valid 60s;
默认为每60秒检查一次缓存中的元素是否仍有效。
不被淘汰的最小访问次数 语法: open_file_cache_min_uses number; 默认: open_file_cache_min_uses 1;
它与open_file_cache中的inactive参数配合使用。如果在inactive指定的时间段内,访问次 数超过了open_file_cache_min_uses指定的最小次数,那么将不会被淘汰出缓存。
是否缓存打开文件错误的信息 语法: open_file_cache_errors on|off; 默认: open_file_cache_errors off;
此配置项表示是否在文件缓存中缓存打开文件时出现的找不到路径、没有权限等错误信 息。
忽略不合法的HTTP头部 语法: ignore_invalid_headers on|off; 默认: ignore_invalid_headers on;
设置为off,当出现不合法的HTTP头部时,Nginx会拒绝服务,并直接向用 户发送400(Bad Request)错误。如果将其设置为on,则会忽略此HTTP头部。
HTTP头部是否允许下划线 语法: underscores_in_headers on|off; 默认: underscores_in_headers off;
默认为off,表示HTTP头部的名称中不允许带“_”(下划线)。
对If-Modified-Since头部的处理策略 语法: if_modified_since[off|exact|before]; 默认: if_modified_since exact;
出于性能考虑,Web浏览器一般会在客户端本地缓存一些文件,并存储当时获取的时 间。这样,下次向Web服务器获取缓存过的资源时,就可以用If-Modified-Since头部把上次获 取的时间捎带上,而if_modified_since将根据后面的参数决定如何处理If-Modified-Since头部.
文件未找到时是否记录到error日志 语法: log_not_found on|off; 默认: log_not_found on;
此配置项表示当处理用户请求且需要访问文件时,如果没有找到文件,是否将错误日志 记录到error.log文件中。这仅用于定位问题。
merge_slashes 语法: merge_slashes on|off; 默认: merge_slashes on;
此配置项表示是否合并相邻的“//”,例如,/test///a.txt,在配置为on时,会将其匹配为 location/test/a.txt;如果配置为off,则不会匹配,URI将仍然是//test///a.txt。
DNS解析地址 语法: resolver address...;
设置DNS名字解析服务器的地址
DNS解析的超时时间 语法: resolver_timeout time; 默认: resolver_timeout 30s;
此配置项表示DNS解析的超时时间。
返回错误页面时是否在Server中注明Nginx版本 语法: server_tokens on|off; 默认: server_tokens on;
表示处理请求出错时是否在响应的Server头部中标明Nginx版本,这是为了方便定位问 题。
- 参数名称 注释
- $arg_PARAMETER HTTP 请求中某个参数的值,如/index.php?site=www.ttlsa.com,可以用$arg_site取得www.ttlsa.com这个值.
- $args HTTP 请求中的完整参数。例如,在请求/index.php?width=400&height=200 中,$args表示字符串width=400&height=200.
- $binary_remote_addr 二进制格式的客户端地址。例如:\x0A\xE0B\x0E
- $body_bytes_sent 表示在向客户端发送的http响应中,包体部分的字节数
- $content_length 表示客户端请求头部中的Content-Length 字段
- $content_type 表示客户端请求头部中的Content-Type 字段
- $cookie_COOKIE 表示在客户端请求头部中的cookie 字段
- $document_root 表示当前请求所使用的root 配置项的值
- $uri 表示当前请求的URI,不带任何参数
- $document_uri 与$uri 含义相同
- $request_uri 表示客户端发来的原始请求URI,带完整的参数。$uri和$document_uri未必是用户的原始请求,在内部重定向后可能是重定向后的URI,而$request_uri 永远不会改变,始终是客户端的原始URI.
- $host 表示客户端请求头部中的Host字段。如果Host字段不存在,则以实际处理的server(虚拟主机)名称代替。如果Host字段中带有端口,如IP:PORT,那么$host是去掉端口的,它的值为IP。$host 是全小写的。这些特性与http_HEADER中的http_host不同,http_host只取出Host头部对应的值。
- $hostname 表示 Nginx所在机器的名称,与 gethostbyname调用返回的值相同
- $http_HEADER 表示当前 HTTP请求中相应头部的值。HEADER名称全小写。例如,示请求中 Host头部对应的值 用 $http_host表
- $sent_http_HEADER 表示返回客户端的 HTTP响应中相应头部的值。HEADER名称全小写。例如,用 $sent_ http_content_type表示响应中 Content-Type头部对应的值
- $is_args 表示请求中的 URI是否带参数,如果带参数,$is_args值为 ?,如果不带参数,则是空字符串
- $limit_rate 表示当前连接的限速是多少,0表示无限速
- $nginx_version 表示当前 Nginx的版本号
- $query_string 请求 URI中的参数,与 $args相同,然而 $query_string是只读的不会改变
- $remote_addr 表示客户端的地址
- $remote_port 表示客户端连接使用的端口
- $remote_user 表示使用 Auth Basic Module时定义的用户名
- $request_filename 表示用户请求中的 URI经过 root或 alias转换后的文件路径
- $request_body 表示 HTTP请求中的包体,该参数只在 proxy_pass或 fastcgi_pass中有意义
- $request_body_file 表示 HTTP请求中的包体存储的临时文件名
- $request_completion 当请求已经全部完成时,其值为 “ok”。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用 HTTP range访问的并不是文件的最后一块,那么其值也是空字符串。
- $request_method 表示 HTTP请求的方法名,如 GET、PUT、POST等
- $scheme 表示 HTTP scheme,如在请求 https://nginx.com/中表示 https
- $server_addr 表示服务器地址
- $server_name 表示服务器名称
- $server_port 表示服务器端口
- $server_protocol 表示服务器向客户端发送响应的协议,如 HTTP/1.1或 HTTP/1.0
- http {
- include /etc/nginx/mime.types; # 配置nginx支持哪些多媒体类型
- default_type application/octet-stream; #默认文件类型
- #配置日志格式
- log_format main '$remote_addr - $remote_user [$time_local
- ] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
- access_log /var/log/nginx/access.log main; #配置访问日志 ,并使用上面的格式
- sendfile on; # 开启高效文件传输模式
- #tcp_nopush on; #开启防止网络阻塞模式
- keepalive_timeout 65; #长连接超时时间,单位秒
- #gzip on; #开启gzip压缩输出
- include /etc/nginx/conf.d/ *.conf;
- # 配置server服务器;可以多个;
- server {
- listen 80; #监听端口
- server_name localhost; # 配置服务名
- #charset koi8-r; #配置字符集
- #access_log /var/log/nginx/host.access.log main; #配置本虚拟主机访问日志
- # 匹配/请求 ,/是根路径请求,会被该location匹配到并且处理
- location / {
- root /usr/share/nginx/html; #root是配置服务器的默认网关根目录位置
- index index.html index.htm; #配置首页文件的名称
- }
- #error_page 404 /404.html; #配置404页面
- # redirect server error pages to the static page /50x.html
- #error_page 500 502 503 504 /50x.html; #配置50x错误页面
- location = /50x.html {
- root /usr/share/nginx/html;
- }
- # proxy the PHP scripts to Apache listening on 127.0.0.1: 80
- #location ~ \.php$ {
- # proxy_pass http: //127.0.0.1;
- #
- }
- # pass the PHP scripts to FastCGI server listening on 127.0.0.1: 9000
- #
- #location ~ \.php$ {
- # root html;
- # fastcgi_pass 127.0.0.1: 9000;
- # fastcgi_index index.php;
- # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
- # include fastcgi_params;
- #
- }
- # deny access to .htaccess files, if Apache's document root
- # concurs with nginx's one
- #
- #location ~ /\.ht {
- # deny all;
- #
- }
- }
- }
反向代理(reverse proxy)方式是指用代理服务器来接受Internet上的连接请求,然后将 请求转发给内部网络中的上游服务器,并将从上游服务器上得到的结果返回给Internet上请求 连接的客户端。充当反向代理服务器也是 Nginx的一种常见用法(反向代理服务器必须能够处理大量并发请求)
反向代理和从定向的区别:
重定向:
反向代理:
由于Nginx具有“强悍”的高并发高负载能力,因此一般会作为前端的服务器直接向客户 端提供静态文件服务。但也有一些复杂、多变的业务不适合放到Nginx服务器上,这时会用 Apache、Tomcat等服务器来处理。于是,Nginx通常会被配置为既是静态Web服务器也是反向 代理服务器。
与Squid等其他反向代理服务器相比,Nginx的反向代理功能有自己的特点:
当客户端发来HTTP请求时,Nginx并不会立刻转发到上游服务器,而是先把用户的请求 (包括HTTP包体)完整地接收到Nginx所在服务器的硬盘或者内存中,然后再向上游服务器 发起连接,把缓存的客户端请求转发到上游服务器。而Squid等代理服务器则采用一边接收客户端请求,一边转发到上游服务器的方式。
Nginx的这种工作方式有什么优缺点呢?
作为代理服务器,一般都需要向上游服务器的集群转发请求。这里的负载均衡是指选择 一种策略,尽量把请求平均地分布到每一台上游服务器上。
(1)upstream块 语法: upstream name{...}
upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用
- upstream backend {
- server backend1.example.com;
- server backend2.example.com;
- server backend3.example.com;
- }
- server {
- location / {
- proxy_pass http: //backend;
- }
- }
(2)server 语法: server name[parameters];
server配置项指定了一台上游服务器的名字,这个名字可以是域名、IP地址端口、UNIX 句柄等,在其后还可以跟下列参数:
- upstream backend {
- server backend1.example.com weight=5;
- server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
- server unix:/tmp/backend3;
- }
配置块: upstream
(3)ip_hash 语法: ip_hash;
来自某一个用户的请求始终落到固定的一台上游服务器 中,假设上游服务器会缓存一些信息,如果同一个用户的请求任意地转发到集群中的 任一台上游服务器中,那么每一台上游服务器都有可能会缓存同一份信息,这既会造成资源 的浪费,也会难以有效地管理缓存信息。ip_hash首先根据客户端的IP地址计算出一个key,将key按照upstream集群里的上游服务器数量进行取模,然后以取模后的结果把请求转发到相应的上游服务器中。确保了同一个客户端的请求只会转发到指定的上游服务器中。
ip_hash与weight(权重)配置不可同时使用。如果upstream集群中有一台上游服务器暂 时不可用,不能直接删除该配置,而是要down参数标识,确保转发策略的一贯性。
- upstream backend {
- ip_hash;
- server backend1.example.com;
- server backend2.example.com;
- server backend3.example.com down;
- server backend4.example.com;
- }
(4)记录日志时支持的变量 如果需要将负载均衡时的一些信息记录到access_log日志中,那么在定义日志格式时可 以使用负载均衡功能提供的变量
- log_format timing '$remote_addr - $remote_user [$time_local] $request '
- 'upstream_response_time $upstream_response_time '
- 'msec $msec request_time $request_time';
- log_format up_head '$remote_addr - $remote_user [$time_local] $request '
- 'upstream_http_content_type $upstream_http_content_type';
(1)proxy_pass 语法: proxy_pass URL;
此配置项将当前请求反向代理到URL参数指定的服务器上,
- upstream backend {
- …
- }
- server {
- location / {
- proxy_pass http: //backend
- proxy_pass http://localhost:8000/uri/;
- proxy_pass http://unix:/path/to/backend.socket:/uri/;
- proxy_pass https://192.168.0.1;
- ;
- }
- }
默认情况下反向代理是不会转发请求中的Host头部的。如果需要转发,那么必须加上配 置:
proxy_set_header Host $host;
(2)proxy_method 语法: proxy_method method;
此配置项表示转发时的协议方法名。例如设置为:
proxy_method POST;#客户端发来的GET请求在转发时方法名也会改为POST。
配置块: http、server、location
(3)proxy_hide_header 语法: proxy_hide_header the_header;
Nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP头部字段: Date、Server、X-Pad和X-Accel-*。使用proxy_hide_header后可以任意地指定哪些HTTP头部 字段不能被转发
- proxy_hide_header Cache-Control;
- proxy_hide_header MicrosoftOfficeWebServer;
(4)proxy_pass_header 语法: proxy_pass_header the_header;
与proxy_hide_header功能相反,proxy_pass_header会将原来禁止转发的header设置为允许 转发。例如
proxy_pass_header X-Accel-Redirect;
(5)proxy_pass_request_body 语法: proxy_pass_request_body on|off; 默认: proxy_pass_request_body on;
作用为确定是否向上游服务器发送HTTP包体部分。
(6)proxy_pass_request_headers 语法: proxy_pass_request_headers on|off; 默认: proxy_pass_request_headers on;
作用为确定是否转发HTTP头部。
(7)proxy_redirect 语法: proxy_redirect[default|off|redirect replacement]; 默认: proxy_redirect default;
当上游服务器返回的响应是重定向或刷新请求(如HTTP响应码是301或者302)时, proxy_redirect可以重设HTTP头部的location或refresh字段。例如,如果上游服务器发出的响 应是302重定向请求,location字段的URI是http://localhost:8000/two/some/uri/ ,那么在下面的 配置情况下,实际转发给客户端的location是http://frontendonesome/uri/
proxy_redirect http://localhost:8000/two/ http://frontendone;
(8)proxy_next_upstream 语法: proxy_next_upstream[error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off]; 默认: proxy_next_upstream error timeout;
此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这 个请求
proxy_next_upstream的参数用来说明在哪些情况下会继续 选择下一台上游服务器转发请求。
Nginx是什么:Nginx是一款轻量级的Web服务器,也是一款轻量级的反向代理服务器。
Nginx能干什么:Nginx能干的事情很多,这里简要罗列一些:
示例如下:
编译参数可能会根据版本的不同进行变化,./configure --help查看编译参数列表,常见的选项如下:
见上面读书笔记
默认启动Nginx时,使用的配置文件是: 安装路径/conf/nginx.conf 文件可以在启动nginx的时候,通过-c来指定要读取的配置文件,常见的配置文件有如下几个:
Nginx的进程结构:启动Nginx的时候,会启动一个Master进程,这个进程不处理任何客户端的请求,主要用来产生worker进程,一个worker进程用来处理一个request。
Nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模块、第三方模块和补丁等
常见的核心模块指令,大部分都是放置在配置文件的顶部具体的指令,请参看nginx的官方文档,非常详细,参见:
常见的events模块指令,大部分都是放置在配置文件的顶部
具体的指令,在上面那个文档里面,命令的context为events的就是events模块指令,只能在events里面使用
见上面读书笔记中的配置项
核心模块指令,重点看看:error_log、include、pid、user、worker_cpu_affinity、worker_processes
error_log
日志有6个级别:debug|info|notice|warn|error|crit,
注意:error_log off不是禁用日志,而是创建一个名为off的日志,要禁用日志,可以这么写:error_log /dev/null crit;
Nginx支持将不同的虚拟主机的日志记录在不同的地方,如下示例:
http{ error_log logs/http_error.log error; server{ server_name one; access_log logs/one_access.log; error_log logs/one_error.log error; } server{ server_name two; access_log logs/two_access.log; error_log logs/two_error.log error; } }
Nginx的HTTP配置主要包括三个区块,结构如下:
http { //这个是协议级别 include mime.types; default_type application/octet-stream; keepalive_timeout 65; gzip on; server { //这个是服务器级别 listen 80; server_name localhost; location / { //这个是请求级别 root html; index index.html index.htm; } } }Nginx的HTTP核心模块,包括大量的指令和变量,大都很重要,具体参见http: //nginx.org/en/docs/http/ngx_http_core_module.html
Location区段,见读书笔记,Location区段匹配示例
location = / { # 只匹配 / 的查询. [ configuration A ] } location / { # 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。 [ configuration B ] } location ^~ /images/ { # 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。 [ configuration C ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有 /images/ 目录的请求将在Configuration C中处 理。 [ configuration D ] }
- / → configuration A
- /documents/document.html → configuration B
- /images/1.gif → configuration C
- /documents/1.jpg → configuration D
Nginx通常被用作后端服务器的反向代理,这样就可以很方便的实现动静分离,以及负载均衡,从而大大提高服务器的处理能力。
Nginx通过upstream模块来实现简单的负载均衡,在upstream块内,定义一个服务器列表,默认的方式是轮询,如果要确定同一个访问者发出的请求总是由同一个后端服务器来处理,可以设置ip_hash,如:
upstream cctest1.com { server 127.0.0.1: 9080 weight=5; server 127.0.0.1: 8080 weight=5; server 127.0.0.1: 1111; }请注意:这个方法本质还是轮询,而且由于客户端的ip可能是不断变化的,比如动态ip,代理,翻墙等等,因此ip_hash并不能完全保证同一个客户端总是由同一个服务器来处理。
这两个模块主要用于做全局的负载均衡,可以根据不同的客户端ip来访问不同的 服务器,根据IP地址范围匹配生成新变量:geo模块
http{ geo $geo{ default default; 202.103.10.1/24 A; 179.9.0.3/24 B; } upstream default.server{ server 192.168.0.100; } upstream A.server{ server 192.168.0.101; } upstream B.server{ server 192.168.0.102; } server{ listen 80; location / { proxy_pass http: //$geo.server$request_uri; } } }当访问 http: //202.103.10.1/24.server/$URl时,会走upstream A.server的负载均衡块
Rewrite模块:用来执行URL重定向。这个机制有利于去掉恶意访问的url,也有利于搜索引擎优化(SEO)。关于负载均衡和重定向的区别,可以看读书笔记那一块
Nginx使用的语法源于Perl兼容正则表达式(PCRE)库,基本语法如下:
捕获子表达式,可以捕获放在()之间的任何文本,比如:^(.*)(hello|sir)$ 字符串为“hi sir” 捕获的结果: $1=hi $2=sir这些被捕获的数据,在后面就可以当变量一样使用了
内部请求,外部请求是客户端的url,内部请求是Nginx通过特殊的指令触发。比如:error_page、index、rewrite、try_files、include等等
内部请求分成两种类型
- server {
- server_name sishuok.com;
- location /abc/ {
- rewrite ^/abc/(.*)$ /bcd/$1
- }
- location /bcd/{
- internal;
- root pages;
- }
- }
- if {}
- if($request_method = POST){…
- }
- if($uri ~* “\.jsp$”){…
- }
- if(-f $request_filename){…
- }
-
- #server配置为监听ip和端口
- server{
- listen 127.0.0.1: 9080;
- server_name 127.0.0.1;
- }
- #server配置为监听域名和端口
- server{
- listen 80;
- server_name www.sishuok.com sishuok.com *.sishuok.com;
- }
- #向后台服务器传递客户端的真实ip
- location ~ \.(jsp|action|mvc)$ {
- proxy_set_header Host $host;
- proxy_set_header X-Forwarded-For $remote_addr;
- proxy_pass http: //sishuok.com;
- }
- #在负载均衡里面,实现后端服务器故障转移的配置
- location ~ \.(jsp|action|mvc)$ {
- proxy_next_upstream http_502 http_504 timeout;
- proxy_set_header Host $host;
- proxy_set_header X-Forwarded-For $remote_addr;
- proxy_pass http: //server_pool;
- }
- #简单的防盗链
- location / {
- ……
- valid_referers blocked sishuok.com *.sishuok.com;
- if($invalid_referer){
- rewrite ^/ http: //sishuok.com;
- }
- }
- #简单的限制下载速度
- location / {
- limit_rate 256K;
- }
- 使用proxy_cache的配置
- http{
- #下面这两个path指定的路径必须在同一个分区
- proxy_temp_path /cachetemp/proxy_temp_path;
- #设置名称为mycache,内存缓存100m,自动清除1天未使用的内容,硬盘缓存空间1g
- proxy_cache_path /cachetemp/proxy_cache_path levels=1: 2 keys_zone=mycache: 100m
- inactive=1d max_size=1g;
- server{
- location ~ .*\.(gif|jpg|html|js|css)$ {
- proxy_cache mycache; #使用名称为mycache的缓存
- #对不同的Http状态码设置不同的缓存时间
- proxy_cache_valid 200 304 24h;
- proxy_cache_valid 301 302 10m;
- proxy_cache_valid any 1m;
- #设置缓存的key值
- proxy_cache_key $host$uri$is_args$args;
- }
- }
- }
如果没有足够的实力和必要去自己改写Nginx,那么Nginx的优化主要就是:优化Nginx的配置,做到合理高效的使用,优化的方向和目标:
- * soft nofile 65535
- * hard nofile 65535
- * soft nproc 65535
- * hard nproc 65535
worker_connections:每个进程允许的最多连接数,默认是1024,可以设置大一些。理论上并发总数是worker_processes和worker_connections的乘积,worker_connections值的设置跟物理内存大小有关,因为系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右,所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置。
keepalive_timeout:设置到65左右就可以
client_header_buffer_size:设置请求的缓存,设置为4k,通常为系统分页大小的整数倍,可以通过getconf PAGESIZE 来查看系统分页大小。
对打开文件设置缓存
- open_file_cache max=建议设置成和每个进程打开的最大文件数一致 inactive=60s;
- open_file_cache_valid 90s;
- open_file_cache_min_uses 2;
- open_file_cache_errors on;
尽量开启Gzip压缩,gzip_comp_level通常设置成3-5,高了浪费CPU
Error日志优化:运行期间设置为crit,可以减少I/O
access日志优化:如果使用了其他统计软件,可以关闭日志,来减少磁盘写,或者写入内存文件,提高I/O效率。
sendfile指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,通常应设置成on,如果是下载等应用磁盘IO重负载应用,可设置为 off
Buffers size优化:如果buffer size太小就会到导致nginx使用临时文件存储response,这会引起磁盘读写IO,流量越大问题越明显。client_body_buffer_size 处理客户端请求体buffer大小。用来处理POST提交数据,上传文件等。client_body_buffer_size 需要足够大以容纳需要上传的POST数据。同理还有后端的buffer数据。
worker_priority进程优先级设置:Linux系统中,优先级高的进程会占用更多的系统资源,这里配置的是进程的静态优先级,取值范围-20到+19,-20级别最高。因此可以把这个值设置小一点,但不建议比内核进程的值低(通常为-5)
合理设置静态资源的浏览器缓存时间,尽量用浏览器缓存
负载均衡锁accept_mutex,建议开启,默认就是开启的
如果使用SSL的话,而且服务器上有SSL硬件加速设备的话,请开启硬件加速
- [root@liruilong ~]# ps aux | grep nginx
- root 5152 0.0 0.0 112812 972 pts/1 S+ 20:46 0:00 grep --color=auto nginx
- root 29684 0.0 0.1 105500 2132 ? Ss Mar07 0:00 nginx: master process /usr/sbin/nginx
- nginx 29685 0.0 0.1 105968 3360 ? S Mar07 0:00 nginx: worker process
- [root@liruilong ~]# ss -nutlpa | grep nginx
- tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=29685,fd=6),("nginx",pid=29684,fd=6))
- tcp LISTEN 0 128 [::]:80 [::]:* users:(("nginx",pid=29685,fd=7),("nginx",pid=29684,fd=7))
- [root@liruilong ~]# ps aux | grep nginx
获得一个来访的URL请求,然后改写成服务器可以处理的另一个 URL。
rewrite 旧的地址(可使用正则) 新的地址 标签(可忽略)
在配置文件中添加一个location,更新配置文件
- [root@liruilong ~]# vim /etc/nginx/nginx.conf
-
- [1]+ Stopped vim /etc/nginx/nginx.conf
- [root@liruilong ~]# fg
- vim /etc/nginx/nginx.conf
- [root@liruilong ~]# /usr/sbin/nginx -s reload
- location /demo {
- proxy_pass https://blog.csdn.net/sanhewuyang/article/details/112384415;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。