Nginx配置文件详解以及配置反向代理和支持跨域

一、简介:

Nginx是一款轻量级的web服务器,反向代理服务器,由于他的内存占用少,启动快,高并发能力强,在互联网项目中广泛应用。

二、Nginx的配置文件:

如果Nginx是yum安装;配置文件默认位置在/etc/nginx/nginx.conf  如果是编译安装Nginx,具体配置文件路径根据你安装时指定放置的路径下

 1 user nginx;
 2 worker_processes auto; #工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU(auto自动根据服务器CPU数量进行调整)
 3 error_log /var/log/nginx/error.log; # 错误日志放置路径
 4 pid /run/nginx.pid; #进程PID存放路径
 5 
 6 include /usr/share/nginx/modules/*.conf;
 7 
 8 events {
 9     worker_connections 24400; #指定进程可以打开的最大描述符:数目。这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误
10 }
11 
12 http {
13     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
14                       '$status $body_bytes_sent "$http_referer" '
15                       '"$http_user_agent" "$http_x_forwarded_for"';
16 
17     access_log  /var/log/nginx/access.log  main;
18 
19    sendfile            on;
20    tcp_nopush          on;
21    tcp_nodelay         on;
    proxy_connect_timeout 90;
    proxy_read_timeout 180;
    proxy_send_timeout 180;
22 keepalive_timeout 65; 23 types_hash_max_size 2048; 24 25 ## nginx 安全相关配置 26 #关闭文件索引 27 autoindex on; 28 #隐藏版本号 29 server_tokens off; 30 #设置客户端请求头读取超时时间,超过这个时间还没有发送任何数据,Nginx将返回“Request time out(408)”错误 31 client_header_timeout 150; 32 #设置客户端请求主体读取超时时间,超过这个时间还没有发送任何数据,Nginx将返回“Request time out(408)”错误 33 client_body_timeout 150; 34 #上传文件大小限制 35 client_max_body_size 100m; 36 #指定响应客户端的超时时间。这个超过仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。 37 send_timeout 600; 38 39 include /etc/nginx/mime.types; 40 default_type application/octet-stream; 41 42 include /etc/nginx/conf.d/*.conf; 43 44 server { 45 listen 80 default_server; 46 listen [::]:80 default_server; 47 server_name _; 48 root /usr/share/nginx/html; 49 50 include /etc/nginx/default.d/*.conf; 51 52 location / { 53 } 54 55 } 56 include site-enabled/*.conf; 57 }

(1)全局块:

  从配置文件开始到events块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运待Nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。

(2)events块:

  events块涉及的指令主要影响 Nginx服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word rocess可以同时支持的最大连接数等。这部分的配置对Nginx的性能影响较大,在实际中应该灵活配置。

   use epoll;    nginx采用epoll事件模型,处理效率高

  worker_connections 65535;  是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections。

  multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接,默认是on,设置为on后,多个worker按串行方式来处理连接,也就是一个连接只有一个worker被唤醒,其他的处于休眠状态,设置为off后,多个worker按并行方式来处理连接,也就是一个连接会唤醒所有的worker,直到连接分配完毕,没有取得连接的继续休眠。当你的服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。

(3)http块:  

  这算是Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http块也可以包括http全局块、server块。

 

  Http全局块:http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。

 

  Server块:这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完金一样的,该技术的产生是为了节省互联网服务器硬件成本。每个http块可以包括多个server块,而每个server 块就相当于一个虚拟主机。而每个server块也分为全局server块,以及可以同时包含多个locaton块。

 

  全局Server块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。

 

  Location块:一个server 块可以配置多个location块。这块的主要作用是基于Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行

  Location匹配原则:可以参考该链接进行查看:https://www.cnblogs.com/zhaof/p/5945576.html?utm_source=itdadao&utm_medium=referral

  总结:

    1.Location块声明时可以使用普通字符前缀或者正则表达字符前缀进行匹配。

    2.普通字符前缀前可以加等于号,进行精确匹配。(例:location = /test.html 表示精确匹配test,当一个页面使用特别频繁时使用,可以加快访问速度)精确匹配完成后就会停止匹配。

    3.普通匹配可以匹配到多个结果,所以先进行普通匹配,一旦匹配到并不会立即停止,会继续匹配,然后进行正则匹配,若正则匹配到则立即停止,不会进行其他匹配,而是直接使用该结果。若正则匹配不到,则使用普通匹配程度最高的那个结果。

    4.普通uri匹配是没有顺序的,而正则uri匹配是有顺序的,从上至下,直至匹配到结果或全部匹配结束。

    5.location后加 ~ 号表示uri中含有正则,并区分大小写,~*表示包含正则但不不区分大小写,^~”表示在普通uri前要求Nginx服务器找到普通uri匹配度最高的那个location后,立即处理此请求,并不再进行正则匹配。

    6.location的执行逻辑和location的编辑顺序无关。

三、负载均衡配置

  负载均衡实现的是将请求均匀的分配到多个服务器上进行请求处理,减小单台服务器的压力。

(1)在http全局块下配置upstream。(相当于一个均衡负载规则,通过该规则转发给配置的服务器)

http {

  # 这里配置多个服务器地址,负载均衡
  upstream test {
    server 192.168.111.10:8666;
    server 192.168.111.11:8666;
  }


  server {
    listen       80;
    server_name  www.test.com;

    
    location / {
      #负载均衡规则转发
      proxy_pass http://test;  
    }
}

(2)如果有多个环境,或者多个域名使用一个Nginx做反向代理,那么所有的配置都配置主配置文件上面,那么后期排查很麻烦,我们可以将个环境配置文件放置在 /etc/nginx/conf.d/目录下,或者自己自定义目录

   1.配置多个域名访问不同路径下前端服务,可以写在一个配置文件里面 ,也可以根据不同域名进行创建各自配置文件

   cd /etc/nginx/conf.d

   vim www.test.com.conf

    server {
        server_name  www.test.com test.com;

        listen 80;
        root         /opt/project/test/;
        if ($host = 'test.com'){
           rewrite ^/(.*)$        http://www.test.com/$1 permanent; # 配置当用户访问test.com域名时,自动跳转到www.test.com这个域名上面

  } }

 2.如果多个环境代理后端服务,配置如下(多个环境配置多个文件即可)

server {
    listen       80;
    server_name  api.test.com test.com ;
    error_page   500 502 503 504 /50x.html;
    error_page   404 /404.html;

    location /path/ {
                #include  /etc/nginx/add-header.ini;
        proxy_pass http://192.168.111.10:10202/;
            }
     location /path1/ {
                #include  /etc/nginx/add-header.ini;
        proxy_pass http://192.168.111.10:10203/;
            }
    # 如果后端配置Nginx支持webSocket加入后面相关参数
       location /path3/ {
                #include  /etc/nginx/add-header.ini;
        proxy_pass http://192.168.111.12:10204/;
                proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
            }
}    

(3)负载均衡的多种方式。   

a.轮询(默认),按请求时间顺序分发到不互通服务器上。如果服务器宕机,则自动剔除。

b.权重(weight),根据权重大小分配请求(默认为1),服务器权重越大,表示可处理的请求越多,接受的请求也越多,用于后端服务器性能不均的情况。使用,在对应服务器后加:weight = 权重值;

c.ip_hash,每个请求按访问的ip的hash结果分配。这样每个访客将固定的访问固定的后端服务器,解决了session问题。在规则下加ip_hash;然后添加服务器地址。

d.fair按后端服务器的响应时间分配,优先最短响应时间分配。在服务器地址后添加fair

(4)Nginx配置跨域问题:

1.跨域指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript 施加的安全限制。

2.浏览器在执行脚本的时候,都会检查这个脚本属于哪个页面,即检查是否同源,只有同源的脚本才会被执行;而非同源的脚本在请求数据的时候,浏览器会报一个异常,提示拒绝访问。

相关配置如下:

# 是否允许请求带有验证信息
add_header Access-Control-Allow-Credentials true always;

# 允许跨域访问的域名,可以是一个域的列表,空格隔开,也可以是通配符*(不建议)
add_header Access-Control-Allow-Origin '*' always;

# 允许使用的请求方法,以逗号隔开,可以用 *
add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE' always;

# 预检命令的缓存,如果不缓存每次会发送两次请求,单位为秒。
# 第一次是浏览器使用OPTIONS方法发起一个预检请求,第二次才是真正的异步请求
add_header Access-Control-Max-Age 3600 always;

# 允许脚本访问的返回头
add_header Access-Control-Allow-Headers 'Access-Control-Allow-Origin,Content-Disposition,Authorization,x-requested-with,content-disposition,Cache-Control,Pragma,Content-Type,Token,Content-Type,Accept,content-type,request-id,user-id,app-id,requestId,request-code,lang,merchantName,language' always;

# 允许自定义的头部,以逗号隔开,大小写不敏感
add_header Access-Control-Expose-Headers 'Content-Disposition,WWW-Authenticate,Server-Authorization' always;

# OPTIONS类的请求,是跨域先验请求
 if ($request_method = 'OPTIONS') {
   return 204; # http状态码 204 (无内容) 服务器成功处理了请求,但没有返回任何内容。可以返回 200
}

proxy_set_header Host      $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 

posted @ 2020-11-06 20:22  小毅哥博客  阅读(1554)  评论(0编辑  收藏  举报