微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Nginx 入门

原文链接


1. 基本概念

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力在同类型的网页服务器中表现较好。以上内容来自百度百科,由百度百科给出的介绍我们不难发现,Nginx 其实是一个反向代理服务器,作用其实有很多,最突出的是其负载均衡能力,Nginx 的并发能力在同类型的网页服务器中是较为出色的。

2. 安装

首先到官网下载 Nginx 的解压包

下载完成后通过 rz 命令将其上传至 Linux,然后进行解压

 tar -zxvf Nginx-1.21.6.tar.gz 

解压完成后进入解压后的目录,在该目录下有一个名为configure的脚本,通过执行该脚本即可安装 Nginx

./configure

正常情况下终端会提示缺少一些环境

提示缺少什么,我们就安装什么就行。这里的提示信息说的是找不到C语言编译器,所以来安装一下C语言的编译器

yum install -y gcc

安装完成后,重新执行configure脚本,该脚本还可以携带参数,通过指定 prefix 参数即可将 Nginx 安装在指定的目录下。不出意外,此时终端会再一次提醒你缺少相应的依赖

./configure --prefix=/usr/local/Nginx

同样的,安装上就好了

yum install -y pcre pcre-devel

安装完成后再次执行configure脚本,终端还是提示缺少相应的依赖

把它也安装上

yum install -y zlib zlib-devel

再一次来执行configure脚本,这应该是我们第四次执行该脚本了,此时应该是能够安装成功了

接下来执行 make 指令

make

该指令是 Linux 提供的一个编译指令,通过 make 指令即可对安装后的 Nginx 进行编译操作,编译完成后进行安装操作

make install

此时我们可以来到/usr/local目录下查看 Nginx 是否安装成功

可以看到在该目录下多出了一个Nginx的目录,这就是安装好的 Nginx 了,我们进入到 Nginx 的 sbin 目录下,通过执行 Nginx 脚本即可启动 Nginx

cd Nginx/sbin
./Nginx

 此时在浏览器上访问 http:// + Linux 的 ip 地址(ip 地址可通过命令 ifconfig 查看,ens33对应)

 

这个页面说明 Nginx 启动成功!如果你访问不到,可以先看看防火墙是不是关闭状态,如果不是,那就把防火墙关闭再访问试试

 

# 查看防火墙状态
systemctl status firewalld 
# 关闭防火墙
systemctl stop firewalld 

若是想停止 Nginx,则执行./Nginx -s quit./Nginx -s stop指令,这两种方式的结果都是一样的,都会停止 Nginx,但过程不同,./Nginx -s stop是直接停止 Nginx,而./Nginx -s quit与之相比要柔和一些,它会等待已经接收的连接请求处理完毕后再结束。

一般情况下,我们都会制作一个 Nginx 脚本服务,然后使用脚本来启动它,这样的好处是不用来到 Nginx 的 sbin 目录执行 Nginx 脚本了,当我们需要启动 Nginx 时,在任何位置都可以启动。首先创建脚本服务

touch /usr/lib/systemd/system/Nginx.service

 通过vi /usr/lib/systemd/system/Nginx.service命令在该文件中填入如下内容(需要注意的是如果你的 Nginx 不是安装在/usr/local/Nginx下,则需要相应地修改下面的路径)

[Unit]
Description=Nginx - web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/Nginx/logs/Nginx.pid
ExecStartPre=/usr/local/Nginx/sbin/Nginx -t -c /usr/local/Nginx/conf/Nginx.conf
ExecStart=/usr/local/Nginx/sbin/Nginx -c /usr/local/Nginx/conf/Nginx.conf
ExecReload=/usr/local/Nginx/sbin/Nginx -s reload
ExecStop=/usr/local/Nginx/sbin/Nginx -s stop
ExecQuit=/usr/local/Nginx/sbin/Nginx -s quit
PrivateTmp=true

[Install]
wantedBy=multi-user.target

 将其写入文件后,需要重新加载一下系统服务

systemctl daemon-reload

 现在尝试使用系统服务启动 Nginx

systemctl start Nginx.service
# 也可以简写成
systemctl start Nginx

 查看服务是否启动

systemctl status Nginx

 

也可以通过查看进程的方式验证

ps -ef | grep Nginx

 

3. 目录结构

1. conf

conf 为配置文件目录,里面存放的都是 Nginx 的配置信息,Nginx.conf 为 Nginx 的主要配置文件,其它配置文件都是被该文件引用的

2. html

html 目录存放的是静态文件,比如访问 Nginx 时出现的Welcome to Nginx!页面就是该目录下的 index.html 文件

3. logs

logs 目录存放的是日志文件,access.log 是访问日志,当通过 Nginx 访问某个资源时就会在该文件中被记录;error.log 是错误日志,当然就是用来记录一些错误操作了,比如404

4. sbin

 该目录下只有一个 Nginx 主进程文件,用来启动 Nginx

 

4. 基础配置

Nginx 中,最为关键的就属 conf 目录下的 Nginx.conf 配置文件了,Nginx 的所有功能都需要在该配置文件中进行配置,Nginx.conf 文件中的内容较多,其中大部门配置都被注释了,我们将这些被注释的内容先删掉,看看 Nginx 究竟配置了些什么

#其中位于第一行的配置 worker_processes  1 表示开始一个业务进程,在 Nginx 中的工作模式是这样的,
#Nginx 会开启一个 master 进程和多个 worker 进程,这里的 worker 进程就是业务进程,master 进程并不处理业务,
#而是负责调度 worker 进程,业务由 worker 进程负责处理。所以这里配置的就是 worker 进程数了
worker_processes  1;

events {
    worker_connections  1024;#表示每个 worker 进程可以创建的连接数
}

http {
    include       mime.types;#表示引入了一个名为 mime.types 的外部配置文件
    default_type  application/octet-stream;#表示的是如果在 mime.types 文件中没有找到对应的映射,则统一返回给浏览器 application/octet-stream 类型,这是一个兜底的方案
    sendfile        on;#指的是数据零拷贝,当你通过 Nginx 下载一个资源时,因为 Nginx 始终还是个运行在操作系统中的软件,所以网络请求一定是先由操作系统接收,
                       #操作系统再将请求交给 NginxNginx 再从磁盘上获取用户请求的资源,先将其读取到 Nginx 的缓存中,再将其复制到操作系统的缓存,最后由操作系统交给客户端。
                       #以上是不开启数据零拷贝的情况,如果开启了数据零拷贝,则 Nginx 将资源赋值给操作系统的这一步骤会被省略,操作系统将直接从磁盘上读取资源并交给客户端,这就是该项配置的作用
    keepalive_timeout  65;#指的是保持连接的超时时间
    
    #server 表示 Nginx 中的一个主机,在 Nginx 中可以配置多个主机,每个主机相当于是一个独立的站点,主机之间相互并不影响
    server {
        listen       80;#表示监听80端口
        server_name  localhost;#表示当前主机的主机名
        location / {#表示匹配请求的URI资源,当匹配上了资源后,就会进入 location 配置块
            root   html;#指的是资源目录,此时的资源将从 Nginx 中的 html 目录中寻找
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;#表示当产生这几个状态码的错误时,将访问 /50x.html 资源
        location = /50x.html {
            root   html;
        }
    }
}

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;
    ......
}

这里截取了一部分,但能够看出这似乎是一个映射表,其实它是用来告诉浏览器返回的资源类型的,不知道大家有没有注意过,当你在浏览器上访问一张图片时,浏览器会直接显示图片,而当你访问的是一个 .exe 可执行文件时,浏览器又会进行下载。那么浏览器是如何知道什么资源需要显示,而什么资源又需要下载呢?其实,浏览器靠的是请求头中的资源类型来辨别的,我们来访问一张百度logo图片

 

再来访问一个可执行文件

发现区别了吗,它们的 Content-Type 值是不同的,浏览器正是通过这些值才能够对不同的资源做出不同的处理。回到 Nginx中 的 mime.types 文件,它是用来对资源做一个对应的,举个例子,如果文件是html、htm、shtml,那么 Nginx 会统一返回Content-Type:text/html给浏览器;而如果文件是 jpeg、jpg,那么 Nginx 会统一返回Content-Type:image/jpeg给浏览器,这个告知资源类型的过程是由该文件完成的。事实上,互联网中的文件类型非常多,这个文件不可能全部都能例举到,如果有没映射的类型,你当然可以手动将映射添加到 mime.types 中,比如

type{
  ......
  video/mp4    mp4 mp7 mp8;
  ......
}

通过这段配置,如果文件类型为 mp4、mp7、mp8,Nginx 将统一返回给浏览器video/mp4类型

在前面我们就介绍到了 server_name,它表示的是当前主机的主机名,也就是说,只有当请求匹配到了该主机名,对应的主机配置才会生效,举一个例子,在 Nginx.conf 中配置两个主机

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

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

        location / {
            root   /mysite/test1;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  www.test2.com;

        location / {
            root   /mysite/test2;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}

在这段配置中一共配置了两个主机,这两个主机分别指向/mysite目录下的两个资源,所以先来创建这两个资源,在 Linux 根目录/下创建mysite目录,并在mysite目录下分别创建 test1 和 test2 目录,这两个目录下分别有一个 index.html 文件

#详细步骤
cd /
mkdir mysite
cd mysite
mkdir test1
mkdir test2
cd test1
vi index.html
i
复制
<!DOCTYPE html>
<html>
<head>
<title>test1</title>
</head>
<body>
<h1>test1 page</h1>
</body>
</html>
点击Esc
:wq!
cp index.html ../test2
cd ../test2
vi index.html
i
将test1修改为test2
点击Esc
:wq!
cd ..
ll

接着在 Windows 的 hosts 文件中配置一下域名映射

虚拟机ip www.test1.com
虚拟机ip www.test2.com

现在试着访问一下这两个站点,首先是www.test1.com

 

其次是www.test2.com

而事实上,对于监听相同端口的不同域名,如果它们获取的资源需要是一样的,那么它们可以配置在一个 server 块中

server {
        listen       80;
        server_name  www.test1.com;
        server_name  www.test2.com;
        #也可以将域名配置写在一个 server_name 上:server_name  www.test1.com; www.test2.com;
        
        location / {
            root   /mysite/test1;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

此时访问www.test1.comwww.test2.com都将显示的是test1 page!

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐