Nginx(一)

139 阅读9分钟

一.正向代理和反向代理

代理其实就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介。

正向代理:隐藏了真实的请求客户端,类似跳板机,代理访问内部资源,比如翻墙,代理拿到墙外网站数据,然后再传给我们。一对一或多对一,对象是客户端

image.png

反向代理:隐藏了真实的服务端,一对多,多对多,对象是服务端,能负载均衡,能保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网

image.png

二.Nginx目录

奇怪的是,我的目录和视频不一样

image.png

image.png

conf配置文件

CGI通用网关接口,解决的问题时从客户端发送一个请求和数据,服务端获取到请求和数据后可以调佣CGI【程序】处理相应结果给客户端的一种标准规范

koi-utf 编码相关

mime.types 文件mime类型和后缀关系

image.png

nginx.conf nginx核心配置文件

html下index.html是正常访问的网站,50x.html访问nginx出错时出现的页面

log下 access.log 是访问成功的日志 error.log 是访问失败的日志

三.Nginx服务器启停命令

1.Nginx服务的信号控制

要操作Nginx master进程,就要获取到master的进程号ID。

获取方式:ps -ef | grep nginx

kill -QUIT PID

image.png

平滑升级原理:Nginx会重新开启对应的master和worker,整个系统有两个master和worker,记录新旧master的PID,然后发送QUIT信号给旧的master进程,使其处理完请求后关闭

2.Nginx服务的命令行控制

options

image.png

-s stop:快速关闭

quit:优雅关闭

reopen:重新打开日志文件类似USR1

reload:类似HUP信号

四.Nginx配置文件

1.全局块

(1)user:nginx运行的用户(必须是linux中的用户,不然会报错),对系统权限访问控制更细,更安全。linux 添加用户:useradd aaa,添加完用户后,linux会创建一个 /home/aaa 目录

当我们改变nginx配置中的user字段时,页面仍能正常访问,是因为网页放在/share目录下,所有用户都能共享

image.png

现在我们改变路径

image.png

会出现 403错误,原因:用户权限不足

(2)work process指令

master_process:用来指定是否开启工作进程

worker_processes:配置nginx生成工作进程的数量,是nginx实现并发处理服务的管家所在,建议将该值设置为和CPU内核数量一致,默认值auto ps -ef |grep nginx

image.png

(3)include:用来引入其他配置文件,使Nginx配置更加灵活

2.events块

(1)accept_mutex on|off 默认为on:用来设置nginx网络连接序列化,如果设置为off,当一个请求过来时,会导致所有worker被唤醒开始竞争,最后只有一个worker拿到请求。如果唤醒的数量太多会影响nginx的整体性能,如果设置为true,会对多个Nginx进程接受连接进行序列号,一个个的唤醒,防止多个进程互相争抢。但是,如果一次来多个请求,一个个接受又太慢,所以要根据实际的生产环境进行配置。

(2)worker connections number:配置单个worker进程的最大连接数,这个数量不仅仅是前端和用户建立的连接数,还包括所有可能的连接数,number不可超过操作系统支持打开最大文件句柄数量

3.http块

(1)定义MIME-Type:浏览器用来区分不同的资源

image.png

默认以二进制流的方式处理

image.png

image.png

image.png

image.png

image.png

image.png

(2)自定义服务日志(access.log)

Nginx服务器支持对服务日志的格式、大小、输出进行设置

access_log 设置用户访问日志的相关属性 acess_log path [format[buffer=size]] (格式 大小)

(3)sendfile设置nginx服务器是否用sendfile()传输文件,可以大大提高Nginx处理静态资源的性能,默认为off

(4)keepalive_timeout设置长链接的超时时间 ,默认75s

(5)keepalive_requests:设置一个keep_alive连接使用的次数 默认100

3.server块和location块

image.png

五.Nginx静态资源配置

1.serve_name:设置虚拟主机服务名称,可设置多个虚拟主机,使用空格分割

2.location:设置请求的URL

3.root/alias:设置请求资源的目录

root:设置请求资源的根目录 root路径 +location路径

alias:用来更改location的URL  替换location路径,如果location路径以/结尾,则alias也必须是/结尾

4.index:设置网站的默认首页

5.error_page code(状态码) :设置网站错误页面

(1)可以指定具体跳转地址 server{error_page 404 www.baidu.com}

(2)指定重定向

error_page   500 502 503 504 404 /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

(3)修改状态码

error_page   500 502 503 504 404 =200 /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
  1. tcp_nopush:该指令必须在sendfile状态下才会生效,主要提高网络包的传输效率,默认值为off,建议为on

7.tcp_nodelay:该指令必须在keep_alive连接开启下才会生效,来提高网络传输的实时性,默认为on

image.png

image.png

image.png

上面两个操作看上去是互斥的,但是在linux2.5.9以后,这两个操作是可以兼容的tcp_nopush可以确保在发送到客户端之前的数据包是被填满的,大大减少网络开销,当最后一个包没有填满时,会使用tcp_nodelay指令强制发送数据包

8.静态资源压缩

传输内容越小,速度越快

(1)gzip指令:开启关闭gzip压缩,默认值off

(2)gzip_types指令:根据响应页的MIME类型选择性开启Gzip压缩功能

gzip_types:application/javascript

(3)gzip_comp_level指令:设置压缩程度,级别1(最低)-9(最高,效率最低,费时间)默认为1

(4)设置使用Gzip进行压缩是否携带“Vary:Accept-Encoding”的响应头,默认为off

(5)gzip_buffers number size:处理请求压缩的缓冲区数量和大小,number指定Nginx服务器向系统申请缓存空间的个数,size是每个缓存空间的大小,和操作系统有关,建议不设置

(6)gzip_disable regex:针对不同客户端发起的请求,选择性开启和关闭Gzip功能

(7)gzip_http version:针对不同HTTP协议,选择性开启关闭gzip功能,默认值1.1

(8)gzip_min_length :针对传输数据的大小,选择性开启关闭gzip功能,默认值20字节,单位 b,K,M,建议1k

9.解决跨域问题:add_header

Access-Control-Allow-Origin(允许跨域访问的源地址信息)

Access-Control-Allow-Methods(允许跨域访问的请求方式)

10.防盗链

Referer,当浏览器向web服务器发送请求时,一般会带上Referer,来告诉该网页是从哪个页面连接过来的,后台服务器可以获取到Referer来判断是不是自己信任的网站,如果不是可以返回403(服务器拒绝访问)

valid_referers: nginx会通过查看referer自动和valid_referers内容匹配,如果匹配到了就将 $invalid_referer 变量重置为0,如果没有匹配到将$invalid_referer变量重置为1,不区分大小写

image.png

11.Rewrite:实现URL重写 需要安装PCRE库

(1)set $variable value指令:设置一个新的变量,这个变量不能和Nginx服务器预设的变量相同

location /xhn1 {
                set $name xhn;
                set $age 18;
                default_type text/plian;
                return 200 $name=$age;
        }

(2)if (condition):条件判断,注意if和括号之间要有空格

location /xhn1 {
                set $name xhn;
                set $age 18;
                default_type text/plian;
                if ($name){
                        return 200 $name;
                }
                return 200 ??????;
        }
        
if ($request_method !~* GET|POST) {
        return 403;
    }

可以使用 ~ * ! !~* 来连接

~ 代表区分大小写

~* 代表不区分大小写

(3)return 指令

return code [text]

return code URL

return URL

(4)rewrite 通过正则表达式使用和改变URL,可以同时存在一个或多个指令,按照顺序对URL进行匹配和处理

rewrite regex replacement[flag]

replacement 匹配成功后,用于替换URL中被截取内容的字符串,如果该字符串是以”http://“或者“https://” 开头的,则不会继续向下对URL进行其他处理。

(5)应用

域名跳转 image.png

域名镜像

将一个完全相同的网站放在不同服务器上,并用不同URL进行访问,其中的一台服务器被称为主站,其余称为镜像

image.png

反向代理

Nginx反向代理模块的指令是由ngx_http_proxy_module模块进行解析。

(1)proxy_pass

用来设置代理服务器地址,可以是主机名称、IP地址加端口号形式

用来设置代理服务器地址,可以是主机名称、IP地址加端口号形式

image.png

image.png

(2)proxy_set_header

更改Nginx服务器收到的客户端请求头信息,然后将新的请求头发给代理的服务器

proxy_set_header filed value

(3)proxy_redirect

重置头信息中的Location和Refresh的值

proxy_redirect redirect replacement

SSL

(1) ssl on | off

指定服务器开启HTTPS,listen 443 ssl更加通用

(2)ssl_certificate file

指定一个PEM格式的证书

(3)ssl_certificate_key file

指定一个PEM certificate_key文件的路径

(4)ssl_session_cache off | none [shared:name:size]

off:禁用会话缓存,客户端不得重复会话

none:禁止使用会话缓存,客户端可以重复使用,但是并没有在缓存中存储会话参数

shared:所有工作进程之间共享缓存,缓存信息用name和size指定

(5)ssl_session_timeout time

开启SSL会话功能后,设置客户端能够反复使用存储在缓存中的会话参数时间

(6)ssl_ciphers ciphers

指出允许的密码,密码指定为openSSL指定的格式,默认值为 HIGH:!aNULL:!MD5

(7)ssl_prefer_server_ciphers off|on

是否服务器密码优先客户端密码

反向代理调优

Buffer缓冲,Cache缓存

相同点:两种方式都用来提供IO吞吐效率,从而提高Nginx代理性能

不同点:缓冲用来解决不同设备之间数据传递速度不一致导致的性能低的问题,缓冲中的数据一旦完成本次操作后,便可以删除。缓存主要是备份,将被代理服务器的数据缓存到代理服务器,当客户端请求同一个数据时,只需从代理服务器拿到就行,效率较高。

(1)proxy_buffering on | off

proxy_buffering指令用来开启或关闭代理服务器的缓冲区。

(2)proxy_buffers numbers size

指定单个连接从代理服务器读取响应的缓存区的个数和大小

(3)proxy_busy_buffers_size size

限制同时处于BUSY状态的缓冲总大小

(4)proxy_temp_path path

缓冲区满后,仍未被Nginx服务器完全接受,响应数据会存到磁盘上。

(5)proxy_temp_file_write_size size

设置磁盘缓冲区文件的大小

通用网站的配置

proxy_buffering on;

proxy_buffer_size 4 32k

proxy_busy_buffers_size 64k

proxy_temp_file_write_size 64k