这个一个取决于服务端nginx,一个取决于你浏览器。在Nginx服务端的配置文件目录下,有一个mime.types文件,内容如下
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
这里,如text/html格式的字符串就是用来说明数据类型的,/前的是主类型,/之后的是该主类型下的子类型。详细的类型定义在RFC2046中。Nginx通过服务器端文件的后缀名来判断这个文件属于什么类型,再将该数据类型写入HTTP头部的Content-Type字段中,发送给客户端比如,当我们打开一个页面,看到一个PNG格式的图片的时候,Nginx是这样发送格式信息的:服务器上有test.png这个文件,后缀名是png;根据mime.types,这个文件的数据类型应该是image/png;将Content-Type的值设置为image/png,然后发送给客户端。我们在Chrome浏览器中可以看到这个文件返回的头部信息,并对应的宣传出来,如果不能识别则设置为下载文件。
这个数值默认就是on建议采用默认设置, multi_accept的作用是告诉nginx收到一个新连接通知后接受尽可能多的连接,多个worker按串行方式来处理连接,也就是一个连接只有一个worker被唤醒,其他的处于休眠状态设置为off后,多个worker按并行方式来处理连接,也就是一个连接会唤醒所有的worker,直到连接分配完毕,没有取得连接的继续休眠。当你的服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。
这两个模式不一样,一般对于程序联系更为紧密的,可以使用进程间共享内存调用,这样效率更高。Socket方式如果,两个进程是松耦合的,那么用接口调用模式更佳。IP:PORT方式当前,我们对于系统设计讲究松耦合,微服务的模式,所以版本通过api接口模式调用更为广泛应用。
这个buffer缓冲区设置是根据实际的 Response 大小来定,假设你是这么设置的:
fastcgi_buffers85K;
fastcgi_buffer_size5K;
#那么内存的缓存区最大能缓存的大小是 5K * 8 = 40K,如果Nginx代理的后台页面超过这个大小,那就会出现这个错误。
#因为,频繁的写硬盘会影响性能,所以这个参数还是值得适当的根据实际情况优化的
server {
...
location {
try_files /app/cache/ $uri @fallback;
index index.html;
}
...
}
我们可以用后台程序将缓存信息生成到 d o c u m e n t r o o t / a p p / c a c h e / 目 录 下 , 它 将 检 测 , document_root/app/cache/目录下,它将检测, documentroot/app/cache/目录下,它将检测,document_root/app/cache/index.html 和 d o c u m e n t r o o t document_root documentrooturi是否有静态缓存生成的文件存在,如果不存在着内部重定向到@fallback(@表示配置文件中预定义标记点)。
server {
listen 80;
server_name xuliangwei.com;
root /code;
location / {
#如果url不匹配这个则进行跳转https,匹配则走本地的root查询内容
if ($request_uri !~ '^/bgx/') {
return 301 https://$server_name$request_uri;
}
}
}
server {
....
listen443;
server_name xuliangwei.com;
....
}
【文章福利】小编推荐自己的Linux、C/C++技术交流群:【960994558】整理了一些个人觉得比较好的学习书籍、视频资料共享在里面(包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等.),有需要的可以自行添加哦!~
如果后台服务连接超时,Nginx是本身是有机制的,如果出现一个节点down掉的时候,Nginx会更据你具体负载均衡的设置,将请求转移到其他的节点上,但是,如果后台服务连接没有down掉,但是返回错误异常码了如:504、502、500,这个时候你需要加一个负载均衡的设置,如下:proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;意思是,当其中一台返回错误码404,500…等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率。
server {
listen 80;
server_name xuliangwei.com;
location / {
proxy_pass http://node;
proxy_next_upstreamerror timeout http_500 http_502 http_503 http_504;
}
}
需求是除了404 页面,其他的错误页面都要返回 json,而且在外界看来是正常的,所以说白了就是后端服务器返回了我定义的错误状态码,需要在nginx这里做一个转换,转换到 200,用户看到的是200,其实是将错误的状态码定向至200,然后再次调度到/api。
server {
listen 80;
server_name www.bgx.com;
location / {
proxy_intercept_errors on; #反向代理默认不支持自定义错误页面,需要增加该参数
proxy_set_header Host $host;
proxy_pass http://www_server3_plools;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_503 non_idempotent;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#出现500等错误都返回给用户200状态,并跳转至/api
error_page500502503504 =200 /api;
location = /api{
default_type application/json;
return200'{"retCode":"1001","retMsg":"invoke failed"}';
}
需求:在配置负载均衡时,后端三台web,手动关闭一个web 服务,当轮询到这台关停的时候,总是要卡顿很久?
#可以如下这两个参数:
proxy_connect_timeout600; #1分钟
proxy_read_timeout600; #1分钟
server {
listen 80;
server_name bgx.com;
location / {
set $allow true;
if ($http_x_forwarded_for ~ "106.121.*.*|106.121.71.120|106.121.74.130"){
set $allow false;
}
if ($allow = false){
return403;
}
}
}
server {
listen80;
server_name bgx.com;
location~ ^/admin {
set$allowfalse;
if ($http_x_forwarded_for~ "36.11.10.254|36.11.10.*"){
set$allowtrue;
}
if ($allow = false){
return403;
}
}
}
在TCP、UDP协议的开头,会分别有16位来存储源端口号和目标端口号,所以端口个数是2^16-1=65535个。TCP端口数65535的限制,这个是由TCP/IP协议栈中的第四层运输层UDP/TCP协议决定的.在UDP/TCP协议中源端口和目的端口都只有16位,也就是说端口的取值范围为0~65535。
当我们只有单台web服务器时,需要配置错误返回页面,可以使用error_page来指定。
[root@web01 conf.d]# cat code3.conf
server {
listen 80;
server_name code.oldboy.com;
location / {
root /code;
}
#如服务器返回如下错误状态码,则进行跳转,跳转至/404.html
error_page 404 403 /40x.html;
#如服务器返回如下错误状态码,则进行跳转,跳转至/50x.html
error_page 500 502 503 504 /50x.html;
#精准匹配访问
location = /404.html {
root /err;
}
location = /50x.html {
root /err;
}
}
#代理的配置
[root@www conf.d]# cat proxy.conf
server {
listen 80;
server_name test.bgx.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_intercept_errors on; #接收后端web4xx,5xx错误
error_page 500 502 403 404 = /proxy_error.html; #将后端web抛出的错误定向到指定的页面
}
#如果有请求proxy_error.html文件的则指定到对应的目录
location = /proxy_error.html {
root /code/proxy;
}
}
#后端web节点配置
[root@www conf.d]# cat web.conf
server {
listen 8080;
server_name test.bgx.com;
root /code/web;
index index.html;
error_page 404 /404.html; #如果代理开启proxy_intercept_errors则后端web配置error_page无效
}
当用户通过访问IP或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500,目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦。
server {
listen 80;
server_name www.xuliangwei.com # 这里指定自己的域名
}
server{
listen 80 default_server; # 默认优先返回
server_name _; # 空主机头或IP
return 500; # 返回500错误
}
也可以将流量集中导入自己的网站,只要做以下跳转设置就可以
server {
listen 80 default_server;
return 302 https://www.xuliangwei.com;
}
Nginx在上传文件时出现413 Request Entity Too Large,怎么办?
因为Nginx默认支持上传1MB的文件,所以超过1MB则会报错。
#nginx上传文件大小限制配置语法
Syntax: client_max_body_size size;
Default: client_max_body_size 1m;
Context: http, server, location
允许该server能支持上传200m的文件,也可以其配置放入http层,所有server都生效。
server {
...
client_max_body_size 200m;
...
}
root与alias路径匹配主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上,alias是一个目录别名的定义,root则是最上层目录的定义。root的处理结果是:root路径+location路径alias的处理结果是:使用alias路径替换location路径1.root路径配置实例: 用户访问www.xuliangwei.com/image/test.gif,实际上Nginx会上/code/image/目录下找去找test.gif文件
server {
listen 80;
server_name www.xuliangwei.com;
location /image/ {
root /code;
}
}
alias配置实例: 用户访问www.xuliangwei.com/image/test.gif,实际上Nginx会上/code/目录下找去找test.gif文件。
server {
listen 80;
server_name www.xuliangwei.com;
location /image/ {
alias /code;
}
}
在开始处理一个http请求时,nginx会取出header头中的Host变量,与nginx.conf中每个server的server_name进行匹配,以此决定到底由哪一个server来处理这个请求。但nginx如配置多个相同的server_name,会导致server_name出现优先级访问冲突。
准备nginx对应的配置文件
[root@web02 conf.d]# cat code1.conf
server {
listen 80;
server_name localhost code1.bgx.com;
location / {
root /code1;
index index.html;
}
}
[root@web02 conf.d]# cat code2.conf
server {
listen 80;
server_name localhost code2.bgx.com;
location / {
root /code2;
index index.html;
}
}
[root@web02 conf.d]# cat code3.conf
server {
listen 80;
server_name localhost code3.bgx.com;
location / {
root /code3;
index index.html;
}
}
准备站点目录
[root@web02 conf.d]# mkdir /code{1..3} -p
[root@web02 conf.d]# for i in {1..3};do echo "Code$i" > /code$i/index.html;done
[root@web02 conf.d]# cat /code1/index.html
Code1
[root@web02 conf.d]# cat /code2/index.html
Code2
[root@web02 conf.d]# cat /code3/index.html
Code3
检查语法, 并重新加载Nginx
[root@web02 conf.d]# nginx -t
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 重启Nginx
[root@Nginx ~]# systemctl restart nginx
测试访问效果
#1.当用户第一次访问, 由code1.conf返回输出信息
[root@Nginx ~]# curl localhost
Code 1
#2.此时将code1.conf修改为code5.conf后进行重载Nginx
[root@Nginx ~]# mv code1.conf code5.conf
[root@Nginx ~]# systemctl reload nginx
#3.再次访问时, 由code2.conf返回输出信息
[root@Nginx ~]# curl localhost
Code 2
多ServerName优先级总结, 在开始处理一个HTTP请求时,Nginx会读取请求头中的host,与每个server中的 server_name 进行匹配,来决定用哪一个 server 标签完成处理这个请求。但有可能一个Host与多个server中的server_name都匹配,这个时候就会更具匹配优先级来选择实际处理的server块。优先级匹配结果如下:
nginx的try_file路径匹配,按顺序检查文件是否存在
[root@bgx ~]# cat /etc/nginx/conf.d/try_file.conf
server {
listen 80;
server_name try.bgx.com;
root /code;
location / {
try_files $uri /404.html /index.php;
}
}
#1.检查用户请求的uri内容是否存在本地,存在则解析
#2.如果请求的url不存在,则访问对应站点目录中的404.html文件
#3.最后交给index.php处理
演示环境准备
[root@Nginx ~]# echo "Try-Page" > /soft/code/index.html
[root@Nginx ~]# echo "Tomcat-Page" > /soft/app/apache-tomcat-9.0.7/webapps/ROOT/index.html
#启动tomcat
[root@Nginx ~]# sh /soft/app/apache-tomcat-9.0.7/bin/startup.sh
#检查tomcat端口
[root@Nginx ~]# netstat -lntp|grep 8080
tcp6 0 0 :::8080 :::* LISTEN 104952/java
配置Nginx的tryfiles
[root@Nginx ~]# cat /etc/nginx/conf.d/try.conf
server {
listen 80;
server_name try.bgx.com;
root /code;
index index.html;
location / {
try_files $uri @java_page;
}
location @java_page {
proxy_pass http://127.0.0.1:8080;
}
}
#重启Nginx
```cpp
[root@Nginx ~]# nginx -s reload
测试tryfiles
[root@Nginx ~]# curl http://try.bgx.com/index.html
Try-Page
#将/code/index.html文件移走
[root@Nginx ~]# mv /code/{index.html,index.html_bak}
#发现由Tomcat吐回了请求
[root@Nginx ~]# curl http://try.bgx.com/index.html
Tomcat-Page
首先nginx是一个静态服务器,通常用来处理静态资源,比如你网页中的html,图片,css等,这些都属于静态资源,但nginx也可以作为反向代理,将你的动态资源请求给你分发到后端的应用服务器(此处就是分发到你的tomcat),由于nginx的高性能,尤其是处理静态资源的高效性!其实两种方案都可以,一种是nginx+tomcat,这种通常用于中小型站点,第二种是lvs+nginx+tomcat,这种适用于大型站点,因为lvs的并发能力远远大于nginx,所以用在最前端,接收用户请求,后面的nginx可以用于会话保持两者是不同的应用场景,对于有session保持的场景,LVS是做不到的,因此LVS也替代不了Nginx……但如果你的应用不需要更复杂的7层控制,那LVS的性能会远远大于nginx!
以上有不足的地方欢迎指出讨论,觉得不错的朋友希望能得到您的转发支持,同时可以持续关注我,每天分享Linux C/C++后台开发干货内容!
最后,如果觉得学习资料难找的话,可以添加小编的C/C++交流群:960994558 学习资料已经共享在群里了,期待你的加入~