Loading... # 前言 > 首先我们需要具有docker的基础,因为nginx是用的docker镜像 ## docker 安装 nginx ### 拷贝文件 ```nginx docker run --name nginx -p 9090:80 -d nginx mkdir /data/nginx/html /data/nginx/logs /data/nginx/conf -p docker cp nginx:/usr/share/nginx/html /data/nginx/www/ docker cp nginx:/var/log/nginx /data/nginx/logs/ docker cp nginx:/etc/nginx/conf.d /data/nginx/conf/ docker cp nginx:/etc/nginx/nginx.conf /data/nginx/conf/ ``` ### 正式安装 ```xml docker run --network host \ --name nginx \ -v /data/nginx/www/:/usr/share/nginx/html \ -v /data/nginx/logs/:/var/log/nginx \ -v /data/nginx/conf/conf.d/:/etc/nginx/conf.d \ -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ --restart=on-failure \ -d nginx ``` ## 命令解释: <div class="tip inlineBlock info"> --network host:设置容器内端口和宿主机端口互通 --name xxx:设置容器名称 -v 容器内目录:宿主机目录:容器卷挂载 --restart=on-failure:设置容器自启 -d:后台运行 </div> # nginx教程: ## nginx基本命令: nginx -t :检查conf文件是否有错误 nginx -s reload:重新加载nginx配置文件 nginx -v:查看nginx版本 ## nginx核心配置文件结构 ```nginx #user指令可以指定启动运行工作进程的用户及用户组,这样对于系统的权限访问控制得更加精细,也更加安全。 user nginx; #用于配置Nginx生成工作进程的数量,这个是Nginx服务器处理服务的关键所在。理论上来说这个值越大,可以支持的并发也越多 #但是事实上这个值的设定是需要受到来自服务器自身的限制,建议将该值和服务器CPU的内核数保存一致。 worker_processes auto; #设定Nginx是否以守护进程的方式启动 #daemon on #用来配置错误日志的文件路径 error_log /var/log/nginx/error.log notice; #用来配置Nginx当前master进程的进程号ID存储的文件路径 pid /var/run/nginx.pid; events { #用来设置是否允许同时接受多个网络连接 multi_accept on; #用来配置单个worker进程最大的连接数 worker_connections 1024; } http { #mime.types 是网络资源的媒体类型 include /etc/nginx/mime.types; #默认下载二进制文件 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; #开启可以提高Nginx处理静态资源的性能 sendfile on; #提高网络包的传输效率 tcp_nopush on; #提高网络包传输的实时性 tcp_nodelay on; #设置长连接超时时间 keepalive_timeout 65; #设置一个keep-alive连接使用的次数 keepalive_requests 100; #开启资源压缩 gzip on; #资源压缩的类型(js、css、html、json) gzip_types application/javascript text/css text/html application/json; #资源压缩级别 级别越高 压缩后内存越小 gzip_comp_level 6; #用来引入其它配置文件,使Nginx更加灵活,这个属性可以在任意位置使用 include /etc/nginx/conf.d/*.conf; } ``` nginx.conf配置文件中默认有三大块:全局块、events块、http块 http块中可以配置多个server块,每个server块又可以配置多个location块 ## 全局块指令: ### user 用于配置运行Nginx服务器的worker进程的用户和用户组。 | 语法 | user user [group] | | -------- | ------------------- | | 默认值 | nobody | | 位置 | 全局块 | 该属性也可以在编译的时候指定,语法如下`./configure --user=user --group=group`,如果两个地方都进行了设置,最终生效的是配置文件中的配置。 ### work process指令 master_process:用来指定是否开启工作进程。 worker_processes:用于配置Nginx生成工作进程的数量,这个是Nginx服务器实现并发处理服务的关键所在。理论上来说workder process的值越大,可以支持的并发处理量也越多,但事实上这个值的设定是需要受到来自服务器自身的限制,**建议将该值和服务器CPU的内核数保存一致。** ### daemon: 设定Nginx是否以守护进程的方式启动。守护式进程是linux后台执行的一种服务进程,特点是独立于控制终端,不会随着终端关闭而停止。 ### pid: 用来配置Nginx当前master进程的进程号ID存储的文件路径。 | **语法** | **pid file;** | | ------------ | -------------------------------------------- | | **默认值** | **默认为:/usr/local/nginx/logs/nginx.pid** | | **位置** | **全局块** | **该属性可以通过**`./configure --pid-path=PATH`来指定 ### **error_log:** 用来配置Nginx的错误日志存放路径 | **语法** | **error_log file [日志级别];** | | ------------ | ------------------------------------- | | **默认值** | **error_log logs/error.log error;** | | **位置** | **全局块、http、server、location** | **该属性可以通过**`./configure --error-log-path=PATH`来指定 其中日志级别的值有:debug|info|notice|warn|error|crit|alert|emerg,翻译过来为试|信息|通知|警告|错误|临界|警报|紧急,这块建议大家设置的时候不要设置成info以下的等级,因为会带来大量的磁盘I/O消耗,影响Nginx的性能。 ### **include:** 用来引入其他配置文件,使Nginx的配置更加灵活 | **语法** | **include file;** | | ------------ | ------------------- | | **默认值** | **无** | | **位置** | **any** | ## events块 ### accept_mutex: | **默认值** | accept_mutex on; | | ------------ | ------------------ | 用来设置Nginx网络连接序列化 > 这个配置主要可以用来解决常说的"惊群"问题。大致意思是在某一个时刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性能。如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。 ### multi_accept: 用来设置是否允许同时接收多个网络连接 如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接 ### worker_connections: 用来配置单个worker进程最大的连接数 | 语法 | **worker_connections number;** | | ------------ | -------------------------------- | | **默认值** | **worker_commections 512;** | | **位置** | **events** | **这里的连接数不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数。另外,number值不能大于操作系统支持打开的最大文件句柄数量。** ### use: 用来设置Nginx服务器选择哪种事件驱动来处理网络消息。 | **语法** | **use method;** | | ------------ | -------------------- | | **默认值** | **根据操作系统定** | | **位置** | **events** | 注意:此处所选择事件处理模型是Nginx优化部分的一个重要内容,method的可选值有select/poll/epoll/kqueue等,之前在准备centos环境的时候,我们强调过要使用linux内核在2.6以上,就是为了能使用epoll函数来优化Nginx。 **另外这些值的选择,我们也可以在编译的时候使用** `--with-select_module`、`--without-select_module`、 `--with-poll_module`、`--without-poll_module`来设置是否需要将对应的事件驱动模块编译到Nginx的内核。 ### 配置实例: ```nginx events{ accept_mutex on; multi_accept on; worker_commections 1024; use epoll; } ``` ## http块: ### 定义MIME-Type 我们都知道浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIME Type。所以说MIME Type是网络资源的媒体类型。Nginx作为web服务器,也需要能够识别前端请求的资源类型。 在Nginx的配置文件中,默认有两行配置 ```nginx include mime.types; default_type application/octet-stream; ``` #### 举例: 有些时候请求某些接口的时候需要返回指定的文本字符串或者json字符串,如果逻辑非常简单或者干脆是固定的字符串,那么可以使用nginx快速实现,这样就不用编写程序响应请求了,可以减少服务器资源占用并且响应性能非常快。 ```nginx location /get_text { #这里也可以设置成text/plain default_type text/html; return 200 "This is nginx's text"; } location /get_json{ default_type application/json; return 200 '{"name":"TOM","age":18}'; } ``` ### 自定义服务日志 Nginx中日志的类型分access.log、error.log。 **access.log:用来记录用户所有的访问请求。** **error.log:记录nginx本身运行时的错误信息,不会记录用户的访问请求。** Nginx服务器支持对服务日志的格式、大小、输出等进行设置,需要使用到两个指令,分别是access_log和log_format指令。 (1)access_log:用来设置用户访问日志的相关属性。 (2)log_format:用来指定日志的输出格式。 ### 其他配置指令 (1)sendfile:用来设置Nginx服务器是否使用sendfile()传输文件,该属性可以大大提高Nginx处理静态资源的性能;语法:sendfile on; (2)keepalive_timeout:用来设置长连接的超时时间。 <div class="tip inlineBlock info"> 为什么要使用keepalive? 我们都知道HTTP是一种无状态协议,客户端向服务端发送一个TCP请求,服务端响应完毕后断开连接。 如何客户端向服务端发送多个请求,每个请求都需要重新创建一次连接,效率相对来说比较多,使用keepalive模式,可以告诉服务器端在处理完一个请求后保持这个TCP连接的打开状态,若接收到来自这个客户端的其他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新连接,提升效率,但是这个连接也不能一直保持,这样的话,连接如果过多,也会是服务端的性能下降,这个时候就需要我们进行设置其的超时时间。 </div> | **语法** | **keepalive_timeout time;** | | ------------ | ----------------------------- | | **默认值** | **keepalive_timeout 75s;** | | **位置** | **http、server、location** | (3)keepalive_requests:用来设置一个keep-alive连接使用的次数。 | **语法** | **keepalive_requests number;** | | ------------ | -------------------------------- | | **默认值** | **keepalive_requests 100;** | | **位置** | **http、server、location** | ## server块 ### listen: 用来配置监听端口。 ```nginx listen 127.0.0.1:8000; // listen localhost:8000 监听指定的IP和端口 listen 127.0.0.1; 监听指定IP的所有端口 listen 8000; 监听指定端口上的连接 listen *:8000; 监听指定端口上的连接 ``` ### server_name: 用来设置虚拟主机服务名称。**127.0.0.1 、 localhost 、域名[**[www.baidu.com](www.baidu.com) | [www.jd.com](www.jd.com)] ```nginx server { listen 80; server_name www.itcast.cn www.itheima.cn; } ``` #### **配置方式一:精确匹配** **如:** ```nginx server { listen 80; server_name www.itcast.cn www.itheima.cn; ... } ``` #### **配置方式二:使用通配符配置** **server_name中支持通配符"*",但需要注意的是通配符不能出现在域名的中间,只能出现在首段或尾段,如:** ``` server { listen 80; server_name *.itcast.cnwww.itheima.*; # www.itcast.cn abc.itcast.cn www.itheima.cn www.itheima.com ... } ``` **下面的配置就会报错** ``` server { listen 80; server_name www.*.cn www.itheima.c* ... } ``` #### **配置三:** **使用正则表达式配置** **server_name中可以使用正则表达式,并且使用**`~`作为正则表达式字符串的开始标记。 **常见的正则表达式** | **代码** | **说明** | | ----------- | ---------------------------------------------------------------- | | **^** | **匹配搜索字符串开始位置** | | **$** | **匹配搜索字符串结束位置** | | **.** | **匹配除换行符\n之外的任何单个字符** | | \ | **转义字符,将下一个字符标记为特殊字符** | | **[xyz]** | **字符集,与任意一个指定字符匹配** | | **[a-z]** | **字符范围,匹配指定范围内的任何字符** | | **\w** | **与以下任意字符匹配 A-Z a-z 0-9 和下划线,等效于[A-Za-z0-9_]** | | **\d** | **数字字符匹配,等效于[0-9]** | | **{n}** | **正好匹配n次** | | **{n,}** | **至少匹配n次** | | **{n,m}** | **匹配至少n次至多m次** | | * | **零次或多次,等效于{0,}** | | **+** | **一次或多次,等效于{1,}** | | **?** | **零次或一次,等效于{0,1}** | **配置如下:** ```nginx server{ listen 80; server_name ~^www\.(\w+)\.com$; default_type text/plain; return 200 $1 $2 ..; } 注意 ~后面不能加空格,括号可以取值 ``` #### 优先级 <div class="tip inlineBlock error"> No1:准确匹配server_name No2:通配符在开始时匹配server_name成功 No3:通配符在结束时匹配server_name成功 No4:正则表达式匹配server_name成功 No5:被默认的default_server处理,如果没有指定默认找第一个server </div> ## location块: ### location 后面: 用来设置请求的URI。 > uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。 **属性介绍:** **不带符号,要求必须以指定模式开始** ```nginx server { listen 80; server_name 127.0.0.1; location /abc{ default_type text/plain; return 200 "access success"; } } 以下访问都是正确的 http://192.168.200.133/abc http://192.168.200.133/abc?p1=TOM http://192.168.200.133/abc/ http://192.168.200.133/abcdef ``` **= : 用于不包含正则表达式的uri前,必须与指定的模式精确匹配** ```nginx server { listen 80; server_name 127.0.0.1; location =/abc{ default_type text/plain; return 200 "access success"; } } 可以匹配到 http://192.168.200.133/abc http://192.168.200.133/abc?p1=TOM 匹配不到 http://192.168.200.133/abc/ http://192.168.200.133/abcdef ``` **~ : 用于表示当前uri中包含了正则表达式,并且区分大小写** ~*: 用于表示当前uri中包含了正则表达式,并且不区分大小写 **换句话说,如果uri包含了正则表达式,需要用上述两个符合来标识** ```nginx server { listen 80; server_name 127.0.0.1; location ~^/abc\w${ default_type text/plain; return 200 "access success"; } } server { listen 80; server_name 127.0.0.1; location ~*^/abc\w${ default_type text/plain; return 200 "access success"; } } ``` **^~: 用于不包含正则表达式的uri前,功能和不加符号的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了。** ```nginx server { listen 80; server_name 127.0.0.1; location ^~/abc{ default_type text/plain; return 200 "access success"; } } ``` ### 设置请求资源的目录root / alias **root:** **设置请求的根目录** | **语法** | **root path;** | | ------------ | ---------------------------- | | **默认值** | **root html;** | | **位置** | **http、server、location** | **path为Nginx服务器接收到请求以后查找资源的根目录路径。** **alias:** **用来更改location的URI** | **语法** | **alias path;** | | ------------ | ----------------- | | **默认值** | **—** | | **位置** | **location** | **path为修改后的根路径。** <div class="tip inlineBlock success"> **以上两个指令都可以来指定访问资源的路径,那么这两者之间的区别是什么?** root的处理结果的资源路径是: root路径+location路径 alias的处理结果的资源路径是: alias路径 如果location路径是以/结尾,则alias也必须是以/结尾,root没有要求 </div> ### index: 设置网站的默认首页。 index后面可以跟多个设置,如果访问的时候没有指定具体访问的资源,则会依次进行查找,找到第一个为止。 ### **error_page:** 设置网站的错误页面 **当出现对应的响应code后,如何来处理。** **举例说明:** **(1)可以指定具体跳转的地址** ```nginx server { error_page 404 http://www.itcast.cn; } ``` **(2)可以指定重定向地址** ```nginx server { error_page 404 /50x.html; error_page 500 502 503 504 /50x.html; location =/50x.html{ root html; } } ``` **(3)使用location的@符合完成错误信息展示** ```nginx server { error_page 404 @jump_to_error; location @jump_to_error { default_type text/plain; return 404 'Not Found Page...'; } } ``` **可选项**`=[response]`的作用是用来将相应代码更改为另外一个 ```nginx server { error_page 404 =200 /50x.html; location =/50x.html{ root html; } } 这样的话,当返回404找不到对应的资源的时候,在浏览器上可以看到,最终返回的状态码是200,这块需要注意下,编写error_page后面的内容,404后面需要加空格,200前面不能加空格 ``` ## 开启资源压缩功能: 我们可以新建一个nginx_gzip.conf文件 ```nginx gzip on; #开启gzip功能 gzip_types *; #压缩源文件类型,根据具体的访问资源类型设定 gzip_comp_level 6; #gzip压缩级别 gzip_min_length 1024; #进行压缩响应页面的最小长度,content-length gzip_buffers 4 16K; #缓存空间大小 gzip_http_version 1.1; #指定压缩响应所需要的最低HTTP请求版本 gzip_vary on; #往头信息中添加压缩标识 gzip_disable "MSIE [1-6]\."; #对IE6以下的版本都不进行压缩 gzip_proxied off; #nginx作为反向代理压缩服务端返回数据的条件 ``` 然后在http块中引入:`include nginx_gzip.conf` ## 解决跨域问题: 使用add_header指令,该指令可以用来添加一些头信息 | **语法** | **add_header name value...** | | ------------ | ------------------------------- | | **默认值** | **—** | | **位置** | **http、server、location** | 此处用来解决跨域问题,需要添加两个头信息,一个是`Access-Control-Allow-Origin`,`Access-Control-Allow-Methods` **Access-Control-Allow-Origin: 直译过来是允许跨域访问的源地址信息,可以配置多个(多个用逗号分隔),也可以使用**`*`代表所有源 **Access-Control-Allow-Methods:直译过来是允许跨域访问的请求方式,值可以为 GET POST PUT DELETE...,可以全部设置,也可以根据需要设置,多个用逗号分隔** ### 具体配置方式: ```nginx location /getUser{ add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE; default_type application/json; return 200 '{"id":1,"name":"TOM","age":18}'; } ``` ## Rewrite地址重写: ### set指令: 该指令用来设置一个新的变量。 | **语法** | **set $variable value;** | | ------------ | -------------------------- | | **默认值** | **—** | | **位置** | **server、location、if** | **variable:变量的名称,该变量名称要用"$"作为变量的第一个字符,且不能与Nginx服务器预设的全局变量同名。** **value:变量的值,可以是字符串、其他变量或者变量的组合等。** ### return指令 该指令用于完成对请求的处理,直接向客户端返回。在return后的所有Nginx配置都是无效的。 | **语法** | **return code [text];** **return code URL;** **return URL;** | | ------------ | -------------------------------------------------------------- | | **默认值** | **—** | | **位置** | **server、location、if** | **code:为返回给客户端的HTTP状态代理。可以返回的状态代码为0~999的任意HTTP状态代理** **text:为返回给客户端的响应体内容,支持变量的使用** **URL:为返回给客户端的URL地址** ```nginx location /testreturn { return 200 success; } location /testreturn { return https://www.baidu.com; // 302重定向到百度 } location /testreturn { return 302 https://www.baidu.com; } location /testreturn { return 302 www.baidu.com;//不允许这么写 } ``` ### Rewrite常用全局变量: | **变量** | **说明** | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | $**args** | 变量中存放了请求URL中的请求指令。比如http://192.168.200.133:8080?arg1=value1&args2=value2中的"arg1=value1&arg2=value2",功能和**query_string一样 | | **$http_user_agent** | **变量存储的是用户访问服务的代理信息(如果通过浏览器访问,记录的是浏览器的相关版本信息)** | | **$host** | **变量存储的是访问服务器的server_name值** | | $**document_uri** | 变量存储的是当前访问地址的URI。比如http://192.168.200.133/server?id=10&name=zhangsan中的"/server",功能和uri一样 | | **$document_root** | **变量存储的是当前请求对应location的root值,如果未设置,默认指向Nginx自带html目录所在位置** | | **$content_length** | **变量存储的是请求头中的Content-Length的值** | | **$content_type** | **变量存储的是请求头中的Content-Type的值** | | **$http_cookie** | **变量存储的是客户端的cookie信息,可以通过add_header Set-Cookie 'cookieName=cookieValue'来添加cookie数据** | | **$limit_rate** | **变量中存储的是Nginx服务器对网络连接速率的限制,也就是Nginx配置中对limit_rate指令设置的值,默认是0,不限制。** | | **$remote_addr** | **变量中存储的是客户端的IP地址** | | **$remote_port** | **变量中存储了客户端与服务端建立连接的端口号** | | **$remote_user** | **变量中存储了客户端的用户名,需要有认证模块才能获取** | | **$scheme** | **变量中存储了访问协议** | | **$server_addr** | **变量中存储了服务端的地址** | | **$server_name** | **变量中存储了客户端请求到达的服务器的名称** | | **$server_port** | **变量中存储了客户端请求到达服务器的端口号** | | **$server_protocol** | **变量中存储了客户端请求协议的版本,比如"HTTP/1.1"** | | **$request_body_file** | **变量中存储了发给后端服务器的本地文件资源的名称** | | **$request_method** | **变量中存储了客户端的请求方式,比如"GET","POST"等** | | **$request_filename** | **变量中存储了当前请求的资源文件的路径名** | | **$request_uri** | **变量中存储了当前请求的URI,并且携带请求参数,比如**[http://192.168.200.133/server?id=10&name=zhangsan](http://192.168.200.133/server?id=10&name=zhangsan)中的"/server?id=10&name=zhangsan" | ### rewrite指令 该指令通过正则表达式的使用来改变URI。可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理。 **URL和URI的区别:** ```nginx URI:统一资源标识符 URL:统一资源定位符 ``` | **语法** | **rewrite regex replacement [flag];** | | ------------ | --------------------------------------- | | **默认值** | **—** | | **位置** | **server、location、if** | **regex:用来匹配URI的正则表达式** **replacement:匹配成功后,用于替换URI中被截取内容的字符串。如果该字符串是以"http://"或者"https://"开头的,则不会继续向下对URI进行其他处理,而是直接返回重写后的URI给客户端。** **flag:用来设置rewrite对URI的处理行为,可选值有如下:** * **last:** * **break** * **redirect** * **permanent** ### 案例: (1)通过Rewrite完成将[www.360buy.com](www.360buy.com)的请求跳转到[www.jd.com](www.jd.com) ```nginx server { listen 80; server_name www.360buy.com; rewrite ^/ http://www.jd.com permanent; } ``` (2)如何在域名跳转的过程中携带请求的URI? ```nginx server { listen 80; server_name www.itheima.com; rewrite ^(.*) http://www.hm.com$1 permanent; } ``` ## 防盗链: 请求的所有(gif|jpg|png|swf|flv|rar|zip)格式设置防盗链: ```nginx server{ listen 80; server_name www.web.com; locatin ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)${ valid_referers none blocked server_names *.web.com; if ($invalid_referer){ rewrite ^/ http://www.web.com/images/forbidden.png; } } } ``` 根据目录实现防盗链配置: ```nginx server{ listen 80; server_name www.web.com; location /file/{ root /server/file/; valid_referers none blocked server_names *.web.com; if ($invalid_referer){ rewrite ^/ http://www.web.com/images/forbidden.png; } } } ``` ## 反向代理: ### proxy_pass 该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号形式。 | **语法** | **proxy_pass URL;** | | ------------ | --------------------- | | **默认值** | **—** | | **位置** | **location** | URL:为要设置的被代理服务器地址,包含传输协议(`http`,`https://`)、主机名称或IP地址加端口号、URI等要素。 ### 举例: ```nginx server { listen 80; server_name localhost; location /{ #proxy_pass http://192.168.200.146; proxy_pass http://192.168.200.146/; } } ``` <div class="tip inlineBlock success"> > 大家在编写proxy_pass的时候,后面的值要不要加"/"? 当客户端访问 http://localhost/index.html,效果是一样的 ```nginx server{ listen 80; server_name localhost; location /server{ #proxy_pass http://192.168.200.146; proxy_pass http://192.168.200.146/; } } ``` 当客户端访问 http://localhost/server/index.html 这个时候,第一个proxy_pass就变成了http://localhost/server/index.html 第二个proxy_pass就变成了http://localhost/index.html效果就不一样了。 </div> ### proxy_set_header 该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给代理的服务器 | **语法** | **proxy_set_header field value;** | | ------------ | ------------------------------------------------------------------------------- | | **默认值** | **proxy_set_header Host $proxy_host;** **proxy_set_header Connection close;** | | **位置** | **http、server、location** | **需要注意的是,如果想要看到结果,必须在被代理的服务器上来获取添加的头信息。** **被代理服务器: [192.168.200.146]** ```nginx server { listen 8080; server_name localhost; default_type text/plain; return 200 $http_username; } ``` **代理服务器: [192.168.200.133]** ```nginx server { listen 8080; server_name localhost; location /server { proxy_pass http://192.168.200.146:8080/; proxy_set_header username TOM; } } ``` --- ## 开启SSL实例(使得网站支持https) ### 实例: ```nginx server { listen 443 ssl; server_name localhost; # 为当前这个虚拟主机指定一个带有PEM格式证书的证书。 ssl_certificate server.cert; # 该指令用来指定PEM secret key文件的路径 ssl_certificate_key server.key; # 该指令用来配置用于SSL会话的缓存 ssl_session_cache shared:SSL:1m; # 开启SSL会话功能后,设置客户端能够反复使用储存在缓存中的会话参数时间。 ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } ``` ## 负载均衡: ### upstream指令: 该指令是用来定义一组服务器,它们可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。服务器可以指定不同的权重,默认为1。 | **语法** | **upstream name {...}** | | ------------ | ------------------------- | | **默认值** | **—** | | **位置** | **http** | ### server指令 该指令用来指定后端服务器的名称和一些参数,可以使用域名、IP、端口或者unix socket | **语法** | **server name [paramerters]** | | ------------ | ------------------------------- | | **默认值** | **—** | | **位置** | **upstream** | ### 实例: ```nginx upstream backend{ server 192.168.200.146:9091 down; server 192.168.200.146:9092 weight=1; server 192.168.200.146:9093 down; } server { listen 8083; server_name localhost; location /{ proxy_pass http://backend; } } ``` ### 负载均衡状态: 代理服务器在负责均衡调度中的状态有以下几个: | **状态** | **概述** | | ------------------ | --------------------------------------- | | **down** | **当前的server暂时不参与负载均衡** | | **backup** | **预留的备份服务器** | | **max_fails** | **允许请求失败的次数** | | **fail_timeout** | **经过max_fails失败后, 服务暂停时间** | | **max_conns** | **限制最大的接收连接数** | ### 负载均衡策略: 介绍完Nginx负载均衡的相关指令后,我们已经能实现将用户的请求分发到不同的服务器上,那么除了采用默认的分配方式以外,我们还能采用什么样的负载算法? Nginx的upstream支持如下六种方式的分配算法,分别是: | **算法名称** | **说明** | | ---------------- | ---------------------- | | **轮询** | **默认方式** | | **weight** | **权重方式** | | **ip_hash** | **依据ip分配方式** | | **least_conn** | **依据最少连接方式** | | **url_hash** | **依据URL分配方式** | | **fair** | | ## nginx缓存集成: ### proxy_cache_path **该指定用于设置缓存文件的存放路径** | **语法** | **proxy_cache_path path [levels=number]** **keys_zone=zone_name:zone_size [inactive=time]**[**max_size=size];** | | ------------ | ----------------------------------------------------------------------------------------------------------------- | | **默认值** | **—** | | **位置** | **http** | **path:缓存路径地址,如:** ```nginx /usr/local/proxy_cache ``` **levels: 指定该缓存空间对应的目录,最多可以设置3层,每层取值为1|2如 :** ```nginx levels=1:2 缓存空间有两层目录,第一次是1个字母,第二次是2个字母 举例说明: itheima[key]通过MD5加密以后的值为 43c8233266edce38c2c9af0694e2107d levels=1:2 最终的存储路径为/usr/local/proxy_cache/d/07 levels=2:1:2 最终的存储路径为/usr/local/proxy_cache/7d/0/21 levels=2:2:2 最终的存储路径为??/usr/local/proxy_cache/7d/10/e2 ``` **keys_zone:用来为这个缓存区设置名称和指定大小,如:** ```nginx keys_zone=itcast:200m 缓存区的名称是itcast,大小为200M,1M大概能存储8000个keys ``` **inactive:指定缓存的数据多次时间未被访问就将被删除,如:** ```nginx inactive=1d 缓存数据在1天内没有被访问就会被删除 ``` **max_size:设置最大缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源,如:** ```nginx max_size=20g ``` **配置实例:** ```nginx http{ proxy_cache_path /usr/local/proxy_cache keys_zone=itcast:200m levels=1:2:1 inactive=1d max_size=20g; } ``` ### proxy_cache 该指令用来开启或关闭代理缓存,如果是开启则自定使用哪个缓存区来进行缓存。 **语法** **proxy_cache zone_name**|**off;** **zone_name:指定使用缓存区的名称** ### proxy_cache_key **该指令用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存。** | **语法** | **proxy_cache_key key;** | | ---------- | ------------------------------------------------------------------ | | 默认值 | **proxy_cache_key** \$**scheme**\$**proxy_host\$request_uri;** | | **位置** | **http、server、location** | ### proxy_cache_valid **该指令用来对不同返回状态码的URL设置不同的缓存时间** | **语法** | **proxy_cache_valid [code ...] time;** | | ------------ | ---------------------------------------- | | **默认值** | **—** | | **位置** | **http、server、location** | **如:** ```nginx proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; 为200和302的响应URL设置10分钟缓存,为404的响应URL设置1分钟缓存 proxy_cache_valid any 1m; 对所有响应状态码的URL都设置1分钟缓存 ``` ### proxy_cache_min_uses **该指令用来设置资源被访问多少次后被缓存** | **语法** | **proxy_cache_min_uses number;** | | ------------ | ---------------------------------- | | **默认值** | **proxy_cache_min_uses 1;** | | **位置** | **http、server、location** | ### proxy_cache_methods **该指令用户设置缓存哪些HTTP方法** **语法** **proxy_cache_methods GET**|**HEAD**|**POST;** **默认缓存HTTP的GET和HEAD方法,不缓存POST方法。** ### 添加缓存配置实例: ```nginx http{ # 设置缓存文件的存放路径 proxy_cache_path /usr/local/proxy_cache levels=2:1 keys_zone=itcast:200m inactive=1d max_size=20g; # 负载均衡 upstream backend{ server 192.168.200.146:8080; } server { listen 8080; server_name localhost; location / { # 指定使用哪个缓存区来进行缓存。 proxy_cache itcast; # proxy_cache_key itheima; # 设置web缓存的key值,Nginx会根据key值MD5哈希存缓存。 proxy_cache_key $scheme $proxy_host $request_uri; # 设置资源被访问多少次后被缓存 proxy_cache_min_uses 5; # 对不同返回状态码的URL设置不同的缓存时间 proxy_cache_valid 200 5d; proxy_cache_valid 404 30s; proxy_cache_valid any 1m; # 添加状态头 add_header nginx-cache "$upstream_cache_status"; # 代理到backend proxy_pass http://backend/js/; } } } ``` ### 缓存清除: #### 方式一: 等待缓存过期 #### 方式二: 删除对应的缓存目录 ```nginx rm -rf /usr/local/proxy_cache/...... ``` ## Nginx设置资源不缓存 > **前面咱们已经完成了Nginx作为web缓存服务器的使用。但是我们得思考一个问题就是不是所有的数据都适合进行缓存。比如说对于一些经常发生变化的数据。如果进行缓存的话,就很容易出现用户访问到的数据不是服务器真实的数据。所以对于这些资源我们在缓存的过程中就需要进行过滤,不进行缓存。** **Nginx也提供了这块的功能设置,需要使用到如下两个指令** ### **proxy_no_cache** 该指令是用来定义不将数据进行缓存的条件。 | **语法** | **proxy_no_cache string ...;** | | ------------ | -------------------------------- | | **默认值** | **—** | | **位置** | **http、server、location** | **配置实例** ```nginx proxy_no_cache $cookie_nocache $arg_nocache $arg_comment; ``` ### **proxy_cache_bypass** 该指令是用来设置不从缓存中获取数据的条件。 | **语法** | **proxy_cache_bypass string ...;** | | ------------ | ------------------------------------ | | **默认值** | **—** | | **位置** | **http、server、location** | **配置实例** ```nginx proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment; ``` 上述两个指令都有一个指定的条件,这个条件可以是多个,并且多个条件中至少有一个不为空且不等于"0",则条件满足成立。上面给的配置实例是从官方网站获取的,里面使用到了三个变量 ```nginx $cookie_nocache 指的是当前请求的cookie中键的名称为nocache对应的值 $arg_nocache和$arg_comment 指的是当前请求的参数中属性名为nocache和comment对应的属性值 ``` ### 案例实现 **设置不缓存资源的配置方案** ```nginx server{ listen 8080; server_name localhost; location / { if ($request_uri ~ /.*\.js$){ set $nocache 1; } proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment; proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment; } } ``` ## Nginx制作下载站点 **(1)autoindex:启用或禁用目录列表输出** **语法** | **autoindex on**|**off;** **(2)autoindex_exact_size:对应HTLM格式,指定是否在目录列表展示文件的详细大小** **默认为on,显示出文件的确切大小,单位是bytes。** **改为off后,显示出文件的大概大小,单位是kB或者MB或者GB** **语法** **autoindex_exact_size on**|**off;** **(3)autoindex_format:设置目录列表的格式** **语法** **autoindex_format html**|**xml**|**json**|**jsonp;** **注意:该指令在1.7.9及以后版本中出现** **(4)autoindex_localtime:对应HTML格式,是否在目录列表上显示时间。** **默认为off,显示的文件时间为GMT时间。** **改为on后,显示的文件时间为文件的服务器时间** **配置方式如下:** ```nginx location /download{ root /usr/local; autoindex on; autoindex_exact_size on; autoindex_format html; autoindex_localtime on; } ``` **XML/JSON格式[一般不用这两种方式]** ### 效果图  ## Nginx用户账户密码认证模块 > **对应系统资源的访问,我们往往需要限制谁能访问,谁不能访问。这块就是我们通常所说的认证部分,认证需要做的就是根据用户输入的用户名和密码来判定用户是否为合法用户,如果是则放行访问,如果不是则拒绝访问。** **Nginx对应用户认证这块是通过ngx_http_auth_basic_module模块来实现的,它允许通过使用"HTTP基本身份验证"协议验证用户名和密码来限制对资源的访问。默认情况下nginx是已经安装了该模块,如果不需要则使用--without-http_auth_basic_module。** **该模块的指令比较简单,** ### auth_basic: 使用“ HTTP基本认证”协议启用用户名和密码的验证 **开启后,服务端会返回401,指定的字符串会返回到客户端,给用户以提示信息,但是不同的浏览器对内容的展示不一致。** ### auth_basic_user_file: 指定用户名和密码所在文件 | **语法** | **auth_basic_user_file file;** | | ------------ | --------------------------------------- | | **默认值** | **—** | | **位置** | **http,server,location,limit_except** | **指定文件路径,该文件中的用户名和密码的设置,密码需要进行加密。可以采用工具自动生成** **实现步骤:** **1.nginx.conf添加如下内容** ```nginx location /download{ root /usr/local; autoindex on; autoindex_exact_size on; autoindex_format html; autoindex_localtime on; auth_basic 'please input your auth'; auth_basic_user_file htpasswd; } ``` **2.我们需要使用**`htpasswd`工具生成 ```nginx yum install -y httpd-tools ``` ```nginx htpasswd -c /usr/local/nginx/conf/htpasswd username //创建一个新文件记录用户名和密码 htpasswd -b /usr/local/nginx/conf/htpasswd username password //在指定文件新增一个用户名和密码 htpasswd -D /usr/local/nginx/conf/htpasswd username //从指定文件删除一个用户信息 htpasswd -v /usr/local/nginx/conf/htpasswd username //验证用户名和密码是否正确 ``` > 上述方式虽然能实现用户名和密码的验证,但是大家也看到了,所有的用户名和密码信息都记录在文件里面,如果用户量过大的话,这种方式就显得有点麻烦了,这时候我们就得通过后台业务代码来进行用户权限的校验了。 最后修改:2023 年 02 月 19 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果文章有用,请随意打赏。
1 条评论
1