《干货篇 | Nginx 我还真不信你学不会(中)》

在《干货篇 | Nginx 我还真不信你学不会(上)》中,我们大概对Nginx有了一个大概印象:我们知道了Nginx是干什么用的、什么是反向代理和正向代理以及什么是负载均衡。

今天,我们来真正上手操作一下,俗话说“实践是检验真理的唯一标准”嘛,光听理论不上手操作,你永远也学不透。

关于Nginx的内容其实有很多,特别是模块部分的,如果我全部都列出来那5篇文章都写不完,所以我在这里给上Nginx官方文档链接,它里面有详细的教程。作为一名极客,我们要学会当遇到不懂的问题时去翻阅官网文档。

官方文档

img

下面我将今天要讲的内容做了一个思维导图:

img

Nginx初体验

首先先打开我们的机器,以下是我的机器的配置:

系统:CentOS 7.6

处理器:1个

内存:1G

我们使用yum安装方式来安装Nginx

yum install -y nginx

安装完毕之后启动Nginx

 systemctl start nginx

设置成开机自启动

systemctl enable nginx

关闭我们的防火墙和SELinux,不然等下访问不了我们的Nginx网站

#关闭防火墙
systemctl stop firewalld.service

#暂时关闭SELinux
setenforce 0

我们还可以进入到SELinux配置文件里面,对其进行永久关闭

vim /etc/selinux/config

img

其实启动Nginx还有另一种命令,是nginx自带的,建议使用nginx自带命令

nginx

启动完毕后我们访问一下,因为配置文件里已经指明默认端口为80,网址后面不写端口号也行,它访问的就是默认页面。

访问本机地址:80

img

相关配置文件

下面我们来看看nginx的一些配置文件

nginx主配置文件

/etc/nginx/nginx.conf

img

这个配置文件是存放了一下nginx相关基础配置,例如:默认端口、日志格式、默认网站,worker进程的管理用户等等

配置目录

/etc/nginx/conf.d/

这个是一个目录,里面通常是存放虚拟主机的一些配置,比如说我们要做一个博客网站和论坛网站,就可以分别定义这两个网站的配置文件,然后存放到这个目录下。就不用都把配置写进主配置文件里,显得更简洁美观


介绍完这两个,我们来看看主配置文件里面的具体内容

主配置文件里面其实还分为几个区域:main区域,event区域等

main区域:

主配置段,也就是全局配置段

cat /etc/nginx/nginx.conf
=====================第一个部分,配置文件的主区域======================
user nginx; # 定义worker进程的管理用户
​
worker_processes auto; # 定义worker进程数,auto会自动调整为cpu核数
​
worker_cpu_affinity auto [cpumask] #提高缓存命中率,将worker与cpu绑定
  CPU MASK:00000001:第一个CPU
        00000010:第二个CPU
  worker_cpu_affinity 0001 0010 0100 1000;
​
worker_priority number
#指定worker进程的nice值,设定worker进程优先级: [-20,20](最大为19)
​
worker_rlimit_ nofile number #worker进程所能够打开的文件数量上限,如65535
​
error_log /var/log/nginx/error.log; # 定义错误日志
​
pid /run/nginx.pid; # 指定存储nginx主进程的PID文件路径
​
include /usr/share/nginx/modules/*.conf; #指明包含进来的其他配置文件片段
​
daemon on|off #是否以守护进程方式运行nginx
​
master_ process on|off #是否以master/worker模型运行nginx,默认为on

事件区域

事件驱动相关的配置

因为nginx是基于事件驱动架构,而且使用异步网络IO模型

...
events {
  worker_connections 1024; 
  # 定义一个worker进程可以同时接受1024个请求
  #总最大并发数: worker_processes * worker_ connections
  
  use method #指明并发连接请求的处理方法,默认为epoll
    use poll;
  
  accept_mutex on|off 
  #处理新的连接请求的方法; on指由各个worker轮流处理新请求, Off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成 “惊群”,影响性能
​
​
}

http区域

跟http协议有关的配置,里面还包括了server也就是虚拟主机的配置

...
http {
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
          '$status $body_bytes_sent "$http_referer" '
          '"$http_user_agent" "$http_x_forwarded_for"';
# 定义日志格式
​
access_log /var/log/nginx/access.log main; # 指定日志文件路径
​
sendfile on; # 允许sendfile方式传输文件
​
tcp_nopush on; # 在sendfile启动下,使用TCP_CORK套接字
​
tcp_nodelay on; # 接连接保持活动状态
​
keepalive_timeout 65; # 超时时间
​
types_hash_max_size 2048;# 连接超时时间
​
include /etc/nginx/mime.types; # 文件扩展名与文件类型映射表
​
default_type application/octet-stream; # 默认文件类型,默认为text/plain
include /etc/nginx/conf.d/*.conf; #虚拟主机目录
​
server {
  listen 80 default_server; # 指定监听的端口
  listen [::]:80 default_server;
  server_name _; # 指定网站主机名
  root /usr/share/nginx/html; # 定义站点目录的位置
  include /etc/nginx/default.d/*.conf; # 定义首页文件
  
  location / {
}
  error_page 404 /404.html; # 定义优雅显示页面信息
    location = /40x.html {
  }
  error_page 500 502 503 504 /50x.html;
    location = /50x.html {
​
  }
}

我们可以根据不同的需求来对配置文件进行修改,最好认真看一下上面的配置文件每个字段的具体意思,面试官有可能会问到哦

下面我们来讲讲nginx核心模块中的HTTP模块

模块介绍

在nginx的核心模块中,有这么一个模块,nginx的网站服务就是由它来具体实现的,它就是HTTP模块。

HTTP模块中又细分成好多个小的模块,分别实现不同的具体功能,比如说:重定向,访问控制,日志功能等

今天我们主要讲一下http模块中nginx_http_core_module模块

nginx_http_core_module

这个模块是用来配置虚拟主机的,下面是它的一个整体内容

server{
  listen adress[:PORT]PORT;
  server_name SERVER_NAME;
  root /PATH/TO/DOCUMENT_ROOT;
}

比如说我们的这个虚拟主机监听的是80端口、主机名字叫www.a.com、网页所在路径为/data/web1,我们可以这样配置

server{
  listen 80;
  server_name www.a.com;
  root /data/web1;
  location / {
  }
}

我们还可以设置默认监听端口,只需要在listen字段后面加上default_ server就行了,这样的话网址就是默认80端口

listen 80 default_ server;

我们还可以不同虚拟主机监听不同的端口

listen 80
listen 8080
listen 8888

还可以设置不同虚拟主机的ip地址

listen 192.168.1.1:80
listen 192.168.1.2:80

配置完监听端口之后,我们来配置主机名称

  • 虚拟主机的主机名称后面可以跟多个由空白字符分隔的字符串
  • 支持通配符
  • 支持起始的字符做正则表达式模式匹配

比如说我们设置一个主机名为www.xxoo.com

server_name www.xxoo.com;

给它起两个名字也可以

server_name www.xxoo.com www.ooxx.com;

我们简单介绍一下名称匹配的优先级,等级是由高到低

(1) 首先是字符串精确匹配如: www.xxoo.com
(2) 左侧*通配符如: *.xxoo.com
(3) 右侧通配符如: www.xxoo.
(4) 正则表达式如: ~^.*\.xxoo.com$
(5) 默认主机 default_ server

我们接着讲一下跟路径相关的内容

  • 用来设置网页资源、web资源的路径映射
  • 用于指明请求的URL所对应的文档的目录路径
  • 可以在http, server, location这些字段里面配置

比如说我们想用户输入www.xxoo.com 访问到的是我服务器的/www/html/目录

server{
  server_name www.xxoo.com;
  root /www/html;
}
​
http://www.xxoo.com/index.html ----> /www/html/index.html

我们其实还可以配置多个location来实现多个uri到文件系统的路径映射,ngnix会根据用户请求的URI来检查定义的所有location ,并找出一个最佳匹配

比如说我想用户输入www.xxoo.com/1.html时访问到的是我服务器上/www/html 目录下的1.html文件

server{
  server_name www.xxoo.com;
  root /www/html;
  location / {
    /www/html/;
  }
}
​
http://www.xxoo.com/1.html ----> /www/html/1.html

或者想让用户输入www.xxoo.com/images/1.jpg时访问到的是我服务器上 /data/images 目录下的1.jpg文件

server{
  server_name www.xxoo.com;
  root /www/html;
  location /images{
    /data/images
  }
}
​
http://www.xxoo.com/images ----> /data/images/1.jpg

除此之外,我们还可以使用路径别名

server{
  listen 80;
  server_name www.salted.com;
  location /bbs/{
    alias /web/forum/;
 } 
 
 http: //www.salted.com/bbs/index.html ----> /web/forum/index.html

路径别名是文档映射的另一种机制,我们放在一起来对比一下

路径别名:
server{
  listen 80;
  server_name www.salted.com;
  location /bbs/{
    alias /web/forum/;
 http://www.salted.com/bbs/index.html ----> /web/forum/index.html
​
路径映射
server{
  listen 80;
  server_name www.salted.com;
    location /bbs/{
      root /web/forum/;
 } 
 http://www.salted.com/bbs/index.html ----> /web/forum/bbs/index.html

有时候访问网站出现错误时,一般的错误页面都不太友好。这时候我们可以定义错误页面。

server{
  listen 80;
  server_name www.salted.com;
  error_page 404 /404.html;
  location /404.html {
    root /data/error/;
  }
}

这样我们访问后如果碰到404错误的话就会显示出我们指定的错误页面。

此外我们还可以指定响应状态码,比如说我们访问网站遇到404错误,但是我们不希望返回给用户的状态码是404,我们可以指定其他状态码。这样的话返回给用户的是其他状态码,但是页面还是404页面

server{
  listen 80;
  server_name www.salted.com;
  error_page 404=200 /404.htmL;
  location /404.html {
    root /data/error/;
  }
}

其实在nginx_http_core_module中还有很多其他的配置字段,这里就不多详细介绍了,感兴趣的可以去访问Nginx的官网查看官方文档。文章开头已经附上了。

下面我们将真正开始搭建我们的虚拟主机(网站)

Nginx实操

首先搭建一个虚拟主机,这次案例我用到的机器是如下配置:

CentOS7.6

CPU:1个

内存:1G

本机ip地址:192.168.244.128

还记得我们上文讲到的通常用来存放模块的那个/etc/nginx/con.d/目录吗,我们需要将虚拟主机(网站)的配置文件放进里面,nginx启动或重启时会扫描里面的配置文件。

首先编写我们的网站相关配置

这个虚拟主机监听的是8080端口,网站域名为www.salted.com,访问到的网络资源在服务器的路径为/usr/share/nginx/html目录下

vim /etc/nginx/conf.d/www.conf
​
server {
  listen 8080;
  server_name www.xxoo.com;
  location / {
    root /usr/share/nginx/html; 
    index my_index.html;
  }
}

每次修改完配置文件记得让nginx重启一下,如下命令可以让nginx平滑重启

nginx -s reload

接下来我们要编写我们的html文件

vim /usr/share/nginx/html/my_index.html

接下来我们编写hosts文件,实现域名解析。这样直接访问域名就能访问到网站了。

vim /etc/hosts
192.168.244.128  www.xxoo.com

如果想要在Windows上通过访问域名就能访问到网站的话,我们要在Windows上设置域名解析

Windows的hosts文件地址为:C:\Windows\System32\drivers\etc

接下来我们来验证一下

在linux系统上使用如下命令:
记得写上8080端口,不然访问的是默认页面
curl www.xxoo.com:8080

img

在Windows上直接输入ip地址或者域名

img

这样我们的第一个虚拟主机就配置完成了!

如果说我们想要访问多个资源的话,我们就要配置多个文件路径

server{
    listen 8080 ;
    server_name www.xxoo.com;
    root /usr/share/nginx/html;
    location / {
        index my_index.html;
    }
    location /data {
        root /web/;
    }
    location /web/images {
        root /web/;
    }
}

别忘了每次更新完配置文件都要重启一下

nginx -s reload

接下来创建我们存放文件的相关目录并分别写入内容

mkdir -pv /web/{data,images}
echo "this is /web/data" > /web/data/index.html
echo "this is /web/images" > /web/images/index.html```

img

我们访问来验证一下:

img

比如说我们访问一个不存在的网页,

像www.xxoo.com:8080/xxoo/index.html

就会显示如下错误页面

img

这个页面其实不太友好,我们可以自定义一个错误页面

server{
    listen 8080 ;
    server_name www.xxoo.com;
    root /usr/share/nginx/html;
    error_page 404 /404.html;
    location / {
        index my_index.html;
    }
    location /data {
        root /web/;
    }
    location /images {
        root /web/;
    }
    location /404.html {
        root /web/pages/;
    }
}```

创建存放错误页面的目录

mkdir /web/pages

创建错误页面

vim /web/pages/404.html
<h1>
this is 404 error!
</h1>```



验证如下

img

最后,我们再来讲下如何配置多个虚拟主机

首先在/etc/nginx/con.d/目录下创建我们的各个虚拟主机配置文件并配置好

touch /etc/nginx/conf.d/{bbs,blog,www}.conf
#第一个虚拟主机
vim /etc/nginx/conf.d/bbs.conf
server {
  listen 8080;
  server_name bbs.com;
  location / {
    root /html/bbs;
    index index.html;
  }
}#第二个虚拟主机
vim /etc/nginx/conf.d/blog.conf
server {
  listen 8080;
  server_name blog.com;
  location / {
    root /html/blog;
    index index.html;
  }
}#第三个虚拟主机
vim /etc/nginx/conf.d/www.conf
server {
  listen 8080;
  server_name www.com;
  location / {
    root /html/www;
    index index.html;
  }
}

准备存放网络资源的目录

mkdir -p /html/{www,bbs,blog}
for name in {www,bbs,blog};do echo "<h1> $name </h1>" >
/html/$name/index.html;done;;

添加域名解析

vim /etc/hosts
192.168.33.133 www.eagle.com bbs.eagle.com blog.eagle.com

更新配置文件后平滑重启

nginx -s reload

最后验证

curl www.com:8080
<h1> www </h1>

curl bbs.com:8080
<h1> bbs </h1>

curl blog.com:8080
<h1> blog </h1>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼Linux运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值