【Nginx】初步使用及配置文件

2023-11-14


Nginx 目录结构

​问题:Nginx编译时,安装路径是用的是绝对路径安装,可用 --prefix指定安装路径,若不指定默认安装到:/usr/local/nginx路径下,但每次运行nginx就会有问题,必须放到指定的安装路径下执行 ./nginx 运行,这样很不灵活
解决:可用 -p 参数来解决,将编译的nginx目录可以放到任意路径下运行,如放到 /tmp/nginx,运行:./nginx -p /tmp/nginx

进入Nginx的主目录我们可以看到如下9个文件夹

client_body_temp、conf、fastcgi_temp、html、logs、proxy_temp、sbin、scgi_temp、uwsgi_temp

其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件

client_body_temp、fastcgi_temp、proxy_temp、scgi_temp

conf // 放置nginx的主配置文件,其实也就一个nginx.conf,nginx.conf会引用其他的配置文件

html // 用来存放静态文件的默认目录 html、css等, 192.168.1.100/index.html 也可以直接被访问
     // 50x.html 报错之后显示的错误的页面
     // 默认目录和默认网页都是可以被配置的,现在此目录只能放一个站点,后期都会修改

logs // 存放日志文件,access.log记录用户访问nginx时的时间、请求的页面请求的参数等信息
	 // 每个人的访问的每次记录都会被记录到access.log文件中,需限制access.log限制文件的大小,否则文件太大,用户的日志无法写进去就会报错
	 // error.log记录系统出错、用户请求出错。nginx.pid记录nginx的主进程的ID号,与ps -ef | grep nginx,也可以用kill pid 该进程
	 // nginx几乎所有的都可以配置,配置文件位置、大小等等

sbin // nginx的主程序。

Nginx 基本运行原理

nginx应用程序启动之后,会起一个master主进程(不处理业务,主要是协调子进程之间),再去读取和校验配置文件,若无错误,就启动worker子进程处理业务。当master、worker进程都启动之后,由子进程等待请求,用户发起请求后,子进程通过配置文件的配置信息响应给用户。
在这里插入图片描述

Nginx 基础配置

最小配置:

// worker_processes 表示开启一个业务进程的个数,对应于当前服务器的物理CPU内核数,默认为1,
worker_processes 1;  

// worker_connections    单个业务进程可接受连接数
worker_connections 1024; 

// include mime.types 引入http mime类型,将其他的配置文件引用到当前的配置文件中,
// mime.types就是http请求头的文件类型是什么,mime.types就是会对应文件的类型
include mime.types; 

下图为 mime.types 文件的内容,类型 对应于 文件后缀名,nginx响应给client时,会在http的头中加上该类型,告诉浏览器按照该类型进行解析。而对于application/octet-stream — exe 这种格式展示,就会弹出下载框,将该数据流是否要下载下来。浏览器到底是展示还是弹出下载框都是根据 mime.types中的类型决定的。

当需要自定义的一种文件格式时而且可以直接播放,就可以添加该数据类型 video/mp4 — xx.xx ,就可以该格式直接播放。
在这里插入图片描述

// default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输给浏览器。
default_type application/octet-stream; 

// sendfile on; 使用linux的sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
sendfile on;

简单理解:sendfile
nginx是个软件(应用程序)运行在我们的操作系统(Linux)上,当客户端发起请求一个视频文件,由网络传输给nginx(nginx在启动的时候会绑定注册ip和端口),具体是由操作系统的网络接口转发给nginx,nginx才能读到用户的请求,就会在服务器的电脑的磁盘中去找该视频文件,当从配置文件配置信息,找到该视频文件。此时nginx想发给浏览器就涉及到sendfile配置信息。
下面是未开启sendfile过程,先是nginx去读取复制视频文件到应用程序的内存中,再复制到操作系统的网络接口,再由网卡驱动程序发送。
在这里插入图片描述
下面是开启sendfile过程,先是nginx不去读取视频文件,而是先发送一个sendfile信号(里面包含socket、文件描述符等信息)给网络接口,再有网络接口去读取复制,再由网卡驱动程序发送。减少一次复制的过程。
在这里插入图片描述

keepalive_timeout 65; // 保持连接的超时时间

http配置中的server配置信息。

server {
        listen       80; // 服务器监听80端口,一个主机就是一个站点,一个主机和多个主机都可以配置在nginx中,即一个nginx可以运行在多个主机上面
        				 // 多个主机都有各自的根目录下index,主机之间相互不干扰,每个主机通过端口号进行区分
        				 // 开启多个主机称为虚拟主机(vhost)
        server_name  localhost; // 配置服务器的域名(通过域名解析称IP)或主机名(也是需要能解析成IP,本机的host文件中写的是本机IP地址)
        /* URL: http://www.nginx.com/xxx/index.html    URI:域名之后的路径,称为资源, 即 /xxx/index.html */
         location / { /* 可以理解为域名后紧跟着的路径或目录,专业说为URI,location是用来匹配一段路径的 */
            root html; /* 这是个相对路径,相对于nginx/html */
            index index.html index.htm; /* nginx/html/index.html 就直接展示出来 */
        }
        /* 服务器端出现错误显示的页面,比如一开始要访问:http://www.nginx.com/xxx/index.html,但是这个页面没有,就会转到http://www.nginx.com/50x.html,这个页面没有,下面location = /50x.html就会匹配到,再跳转到http://www.nginx.com/html/50x.html 此时就能找到 */
        error_page  500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }

Nginx 与Http协议及多站点配置

  1. nginx内部实现了http协议,浏览器中也实现了该http协议。协议就是通讯双方的协商好一件事情,TCP/IP协议只能传递一些二进制数据,以数据流的形式进行数据交互,就跟水龙头打开一样,水一直流,不知道什么时候结束水流,而http协议是在TCP协议基础上添加结束标志,TCP/IP协议是没有类似于结束的约束,http协议的通讯双否都必须遵守该协议的内容,才能够正常通讯。https协议在http协议的基础上保证了正常的访问的时候,额外增加了一层数据区安全的保障。由于我们在上网时,会经历很多的网关,比如家里的路由器就是一层网关,这个路由器并不是直接接到广域网中的网关,后面还有小区的网关,运营商的网关,等等很多网关,经过的网关就很有可能看下消息的内容是什么,所以就有了https协议。

  2. 虚拟主机
    开启一个站点,通常不会有很多人同时来访问,那么这台主机上面的资源就会浪费(cpu、内存都会有浪费),虚拟主机会将一台主机虚拟出来更多的主机,本来通过域名才能访问该主机,一个域名对应一个主机,是不是可以用多个域名同时对应一个IP地址,由nginx服务器判断要访问哪个域名,再指向不同站点的目录。

配置本地的域名信息: C:\Windows\System32\drivers\etc\hosts中内容添加自定义的域名信息

/* 虚拟机IP地址        域名*/
192.168.44.101         test.com

配置完之后,保存会报错没有该权限,将当前登录的用户名组添加该文件的所有权限,改完之后,最好把权限改回去更好,或者复制替换进行修改。改完之后再用cmd命令窗口ping下该域名是否能正常返回配置的IP地址,如果能正常响应,则更改成功。
此时本地打开浏览器可直接用 test.com 访问nginx。

  1. 配置多站点

在nginx.conf中直接修改,即使配置错了,也可以用nginx.conf.default是原始默认的配置文件进行复原。打开nginx.conf文件后,在http模块里面添加。新建其他目录如 /usr/ww/test0/index 和 /usr/ww/test1/index ,添加如下代码内容,再执行命令重新加载,此时就可以通过不同的端口指定不同的站点目录。也可以用之前配置本机的域名进行访问,如 test.com:60 或 test.com:70

/* 主站点 */
server { 
        listen       60;
        server_name  localhost;

        location / {
            root /usr/www/test1;
            index index.html index.htm;
        }
        
		error_page  500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
}
/* 站点2 */
server { 
        listen       60;
        server_name  localhost; 

        location / {
            root /usr/www/test0;
            index index.html index.htm;
        }
        
		error_page  500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
}
/* 站点3 */
server {
        listen       70;
        server_name  localhost; /* 这里可以也可以填test.com本机的域名或主机名localhost */

        location / {
            root /usr/www/test1;
            index index.html index.htm;
        }
        
		error_page  500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
}

Nginx Server名称匹配

  1. nginx是从上往下匹配的前后顺序,若前面匹配上就不会往下再匹配,若匹配到最后都没有匹配上,就会直接匹配第一个,进行网页显示。可以多个域名显示同一个目录,如下配置,每次修改完都要重新reload配置文件,且不能配置相同端口和服务器名称,此时就会报错。注意每次修改配置文件都有可能被缓存,可使用www.test.com/?xxxx 进行域名访问(后面加上 /?xxxx ),就不会以缓存的方式显示。
/* 站点3 */
server {
        listen       60;
        server_name  test.com test0.com test1.com; /*  用通配符的方式匹配如:*.com  凡是以 .com  结尾都会显示本站点内容 */
												   /*  用通配符的方式匹配如:test.* 凡是以 test. 开始都会显示本站点内容 */
       											   /*  用正则匹配如:~^[0-9]+\.test\.com$ 以数字开头的xx.test.com 反斜杠是转义 */
        location / {
            root /usr/www/test1;
            index index.html index.htm;
        }
        
		error_page  500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
}

FCGI 请求的参数

fastcgi_param SCRIPT_FILENAME d o c u m e n t r o o t document_root documentrootfastcgi_script_name;#脚本文件请求的路径
fastcgi_param QUERY_STRING $query_string; #请求的参数;如?app=123
fastcgi_param REQUEST_METHOD $request_method; #请求的动作(GET,POST)
fastcgi_param CONTENT_TYPE $content_type; #请求头中的Content-Type字段
fastcgi_param CONTENT_LENGTH $content_length; #请求头中的Content-length字段。

fastcgi_param SCRIPT_NAME $fastcgi_script_name; #脚本名称
fastcgi_param REQUEST_URI $request_uri; #请求的地址不带参数
fastcgi_param DOCUMENT_URI KaTeX parse error: Expected 'EOF', got '#' at position 15: document_uri; #̲与uri相同。
fastcgi_param DOCUMENT_ROOT $document_root; #网站的根目录。在server配置中root指令中指定的值
fastcgi_param SERVER_PROTOCOL $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

fastcgi_param GATEWAY_INTERFACE CGI/1.1;#cgi 版本
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;#nginx 版本号,可修改、隐藏

fastcgi_param REMOTE_ADDR $remote_addr; #客户端IP
fastcgi_param REMOTE_PORT $remote_port; #客户端端口
fastcgi_param SERVER_ADDR $server_addr; #服务器IP地址
fastcgi_param SERVER_PORT $server_port; #服务器端口
fastcgi_param SERVER_NAME $server_name; #服务器名,域名在server配置中指定的server_name

#fastcgi_param PATH_INFO $path_info;#可自定义变量

PHP only, required if PHP was built with --enable-force-cgi-redirect

#fastcgi_param REDIRECT_STATUS 200;

在php可打印出上面的服务环境变量
如:echo $_SERVER[‘REMOTE_ADDR’]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Nginx】初步使用及配置文件 的相关文章

随机推荐