第4节. nginx实现web服务器01
nginx的http的语句块配置
主要是ngx_http_core_module这个模块
MIME参考文档:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types
不写include,就写type同样放到http语句块下
default_type是有默认值的
但是通常yum和编译都会给你改成
这个,这个就是除了明确的类型以为,浏览器不能识别了就,此时统统提示下载。
测试下default_type application/octet-stream的效果
如果是无痕模式的浏览器,会直接弹 另存为 的对话框,也是下载的动作。
通过curl 看看头部
curl 不加-I 貌似还是直接以文本打开了就
注释掉使其使用默认的text/plain格式
看下php文件的识别
默认就是不支持的
写一个php文件来实验
由于不支持.php所以打开该URL默认就是下载该文件的,对比之前apache的效果,我有两个apache①个yum安装②一个编译安装,其实不管是yum还是编译都不支持php文件的浏览器直接打开,只不过yum安装的apache,后来又yum安装了php,于是
这就找到了cli的出处啦,正式因为yum install php才有了httpd配置文件里的哪个php.conf且放在了conf.d下,才有了httpd浏览器打开了php文件。所以,以此类推现在nginx也要这么搞一下。
但是我现在的nginx是编译安装的,所以我需要尝试蒋这个php.conf复制到编译的路径下
没用php里的ngnix关键字的文件里都没有text/html .php之类的字眼,简单网速搜了下nginx对php的支持不想apache一样简单。具体操作参见以下教程👇
https://blog.51cto.com/928004321/1744675
https://www.php.cn/faq/476519.html
tcp_nodelay on; 可优化报文确认频次,提高传输效率
据说是当 数据报文比较大的时候拆包传输了就,此时就一下发好几个包,然后再确认一次就比较合理了。
其实数据报文小的时候不涉及拆包,同样也能提高效率,只是数据量小,资源消耗小,系统也好硬件也罢能对付得了,数据量大的时候资源消耗大了,此时就会从各个方面优化,才需要tcp_nodely on多包确认一次。
tcp_nopush on; 可优化报文合并提高,提高传输效率
默认是off不显示的
也可以利用"include conf.d/*.conf"去单开一个文件,我理解就是include是在这个语句块也就是这个缩进层级下的,所以新建的xxx.conf里的内容也只反映到这个语句块层级下的。
只是个显示而已。
server_tokens on|off|build|string;
string是商业版的nginx才支持的。
build参数就不是简单修改了的,
所以build是编译的时候,通过--build=xx.xxx.v1001,然后配置文件里写server_tokens build;才会有效果的。
或者修改源码文件里的关键字段;server_tokens on或者off都能改,改的地方不同👇
server_tokens on;修改👇
改成:
server_tokens off;修改👇
改成:
当然改完还需要重新编译了
那么就重新变一下看看
编译之前看下二进制主程序的哈希值
担心软连接的哈希,确认下,不是哦,就是源文件的哈希
开始编译,ctrl+r调出历史命令回车就行👇
那个此时之前的nginx服务还在,不会停,因为你用的之前的nginx二进制启动的服务,你重新编译其实也就是对这个二进制进行变化吧,所以之前已经启动了的服务不受影响,服务程序继续对外提供服务。
此时想用nginx -s reload看到效果是不可能的,因为我们修改的/apps/nginx/sbin/nginx二进制程序里的东西,不是配置文件,所以需要重启服务后才能看到效果
然后修改server_token为on,reload配置文件就可以看到效果了👇
server在很多模块里都有
下面梳理core模块里的server
server就是虚拟主机
listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen可以写port、ip+port、unix套接字的路径。但是写unix socket就只能本机访问了。
default_server:默认虚拟主机,就是没有命中的统统用这个虚拟主机来响应,这里在apache里是不用设置,拍最前面的virtualHost就是默认的。
配置server实验
默认的不用动,利用include xx/xx/conf.d/*.conf写到独立的配置文件里去
默认的页面路径yum安装的话在/usr/share/nginx/html/下,新建两个到/data下
新建配置文件,listen不写默认就是80
做一下dns解析,dns的意义①,否则域名无法翻译成IP,无法在网络中寻址路由可达,②同时请求的域名也会写道http头里的host字段里,作为nginx处理转到具体虚拟server的依据--server_name。
如果访问的站点不命中server字段,那么就是走的default_server了。而默认主配置文件里好像也没有明确配置default_server,所以按他说法就是第一个,而主配置文件里没有server,就去conf.d/下找第一个文件里的server👇
人为修改为site2为default_server
修改一下配置文件的名称,把default.conf拍到第一个去
然后设置site.conf里的site2为默认server
主机头也就是server_name可以多个用空格分隔
listen ip :port 和server_name就等价于apache里的虚拟主机ip:port和servername。匹配逻辑可预见的一样
还是先看ip和port,如果ip和port一样再看servername。
匹配不中的,自然就默认走default_server,即使没有配置default_server,其实也是存在的,就是第一个server。
匹配顺序:精确>通配符(左>右)>正则>default_server
root页面路径
location
没有定义location的时候,所有的访问url都是server下的root路径下的目录。
用了location可以单独将某个url指向别的不再root下的路径。
而看起来location的值也不一定必须是一个目录,试试文件:结论👆上面test是文件夹所以curl的时候test/不带/就报错,带上/就表示test/index.html;👇下面test是文件,所以curl的时候test带上/就报错,不带就是文件处理了,呵呵烦死了。
就有点搞啊
test是出于url的中间位置的,应是location的匹配规则中的一种。
上图301挺神奇的,好像目录不带/就会报301,
既然是301那么加上-L就行了
为什么会这样,官方也给出了解释
location的路径拼接👇
这个等于,其实就是除去fqdn对应的root,www.site1.com去掉就行了,如果等于location里的path,那么www.site1.com就对应到/opt/testdir/ 这个location里定义的root根了。
就是nginx作为应用程序处理请求URL的时候不区分大小写,但是如果nginx跑在windows上就真的是不区分大小写了,但是如果跑在nginx上由于nginx的文件系统文件名是区分大小写的,所以还是会区分的最终。
location用的非常多,比如现在做一个动静分离
比如各种图片就属于静态资源
上图就是意思一下,实际动态文件php|jsp|asp不是简单的放在这里的,而是后端的反向代理发给后边能处理jsp的比如是PHP也就是fastCGI的服务器地址