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;