我天,nginx功能这么强大,它的安装包竟然1M都不到
在这里插入图片描述

nginx的编译安装依赖gcc库,所以使用yum源安装相应的依赖库。

yum -y install gcc pcre-devel openssl-devel zlib-devel

nginx对应的编译安装方法根据需要启动相关配置

./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module 

编译

make  -j 2 && make install

tree /apps/nginx/
在这里插入图片描述
#修改权限,完全控制文件夹的权限

chown -R nginx.nginx  /apps/nginx

创建软连接启动
创建软连接启动时为了在任何目录下都可以随时启动nginx,不用在必须切换到nginx的sbin目录下才能启动

ln -s /apps/nginx/sbin/nginx  /usr/sbin/

在这里插入图片描述

在这里插入图片描述
自己访问自己 curl 10.0.0.201
在这里插入图片描述
在这里插入图片描述
创建Nginx自启动文件
为了以后更方便。可以写一个service文件,把它设置为开机启动。

vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/apps/nginx/run/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

创建目录
mkdir /apps/nginx/run/

需要修改nginx.conf里的pid
修改为 pid /apps/nginx/run/nginx.pid;
在这里插入图片描述
启动nginx
systemctl enable --now nginx
ss -ntl

http配置块

在http块中,如果有多个server语句块也就意味着有多个虚拟主机。nginx默认有一个server配置,
默认的server语句块里定义了:
listen监听端口,
server_name主机头(询主机名称),
location存放的网页放在哪个路径下,
root html配置的是相当路径,将来我们可以自定义到别的路径。index的配置是去寻找root下的html里的的默认网页路径(谁做默认网页)。如下配置就是去寻找/apps/nginx/html目录里的index.html页面,如果找不到就找后面的index.htm

http{
    ...
    ...# 各个server的公共配置
    ...# 每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
    server{ 
       listen   80;
       server_name  localhost;
       location /{
          #默认路径的存放网站的数据目录,存放网页的路径,这个路径是相对于我们编译安装的/apps/nginx目录下的html
          root  html; 
          index index.html index.htm;
       }
    }
    server{
       ...
       server_name  #虚拟主机名
       root    #主目录
       alias   #路径别名
       location [operator] URL{   #指定url的特性
           ...
           if condition{
               ...
           }
       }
    }
}

http语句块的公共配置
include mime.types 导入支持的文件类型,是相对于/apps/nginx/conf的目录
他的功能就是为了支持各种文件资源类型,比如除了支持html,还支持图片、多媒体,支持php。可以看下mime.types的配置内容
在这里插入图片描述

隐藏nginx版本号

server_tokens off

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
显示字符集

charset utf-8;

在这里插入图片描述
在这里插入图片描述

location的配置使用

在一个server中的location配置段可以存在多个,用于实现从uri到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,按照一定的优先级找出一个最佳匹配,而后应用其配置。

在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。

location官方帮助文档:
http://nginx.org/en/docs/http/ngx_http_core_module.html#location

location的配置广泛应用于在项目的动静分离。

location的语法规则

location [ = | ~ | ~* | ^~] uri {...}
=   用于标准uri前,需要请求字符串与uri精准匹配,大小写敏感,如果匹配成功就停止向下匹配并立即处理请求。
~   用于标准uri前,表示包含正则表达式,并且区分大小写。
~*  用于标准uri前,表示包含正则表达式,并且不区分大小写。 
^~  用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分最匹配检查,不区分字符大小写。
不带符号 匹配起始于此uri的所有的uri

匹配的优先级从高到低:
=, ^~, ~/~*,不带符号

URI和URL
URI: Uniform Resource Identifier(统一资源标识符)
URL:Uniform Resource Locator(统一资源定位符)
像https://www.baidu.com/我们可以通过这个链接来访问百度的资源。这个链接包含了一些信息:https协议,www(万维网),baidu.com域名等。URL指定要使用的协议类型,而URI不涉及协议规范。
官方试例

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

The “/” request will match configuration A,
The “/index.html” request will match configuration B, 
The “/documents/document.html” request will match configuration C,
The “/images/1.gif” request will match configuration D, 
and the “/documents/1.jpg” request will match configuration E.

“=”精准匹配

精准匹配一般用于匹配组织的logo等相对固定的url,匹配优先级最高

[root@centos8 conf.d]# vim www.conf 
server{
    listen 80;
    server_name www.flylei.org;
    location =/logo.png{
      root /data/nginx/images;
      index index.html;
    }  
}

在这里插入图片描述
访问www.flylei.org/logo.png
在这里插入图片描述

“~”区分大小写的模糊匹配

location的主要配置

 location ~/A.?\.png{
      index index.html;
      root /data/nginx/html/images;
 }

logo的存放路径
在这里插入图片描述
访问http://www.flylei.org/Aa.png
在这里插入图片描述思考当访问http://www.flylei.org/aa.png时,会从以下哪个location中去匹配
在这里插入图片描述
会去匹配 第一个location / ,那我们就在/data/nginx/html/pc下放一个叫aa.png的logo
在这里插入图片描述
然后访问http://www.flylei.org/aa.png
在这里插入图片描述

“~*”不区分大小写的模糊匹配

 location ~*/A.?\.png{
      index index.html;
      root /data/nginx/html/images;
 }

将/data/nginx/html/images下放置Aa.png和aa.png
在这里插入图片描述
访问http://www.flylei.org/aa.png
在这里插入图片描述
访问http://www.flylei.org/Aa.png
在这里插入图片描述

“ ^~ /*** ” URI开始

location ^~ /images{
  index index.html;
  root /data/nginx;
}
#请求访问是去/data/nginx目录下的images目录,也就是他的请求路径是/data/nginx/images

在这里插入图片描述
报错了,遇到了403
在这里插入图片描述
不慌,先查看nginx错误日志看看是什么错

#查看nginx错误日志
tail /apps/nginx/logs/error.log -f

在这里插入图片描述
访问的路径不对,应该是访问http://www.flylei.org/images/logo.png,直接通过浏览器去访问linux上的一个目录肯定是没有权限的。
在这里插入图片描述
修改匹配所有的.png的后缀后看能不能去访问/data/nginx/html/images下的logo.png
在这里插入图片描述
结果仍然访问的是/data/nginx/images下的logo.png。由此可见“^~”的优先级高于波浪星号的优先级。
在这里插入图片描述
location的生产应用
根据用户访问资源类型的不同,去寻找不同资源所存放的路径。比如前后端分离开发的项目,当用户只需要访问静态页面的时候,就去专门存放静态资源的路径下去找静态资源。需要访问动态数据的时候就去专门存放动态数据的路径去找动态资源,这个存放动态数据的路径有可能就是一个后台的应用程序的访问路径。这样动静资源分开存放,更方便更易于维护。

nginx访问tomcat上的资源

此次实验的目的是通过nginx代理转发去访问Tomcat服务uplod目录下的iPhone.jpg图片
在这里插入图片描述
配置tomcat的uplod目录下图片资源的访问规则“location”

location ^~/uplod/ {
  proxy_pass http://10.0.0.201:8080/uplod/;
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#8080端口是Tomcat服务的默认端口

配置完后“nginx -t”检查语法,“nginx -s reload”平滑重启
在这里插入图片描述
然后我们访问“http://10.0.0.201:8080/uplod/iPhone.jpg”
在这里插入图片描述
成功了

tomcat开启支持软链接

tomcat对软链接的支持是在context.xml里配置的,如下,不同的tomcat版本有不同的配置差别,我的是tomcat8.5.66

tomcat5,6,7版本是: 
<Context allowLinking="true" />

tomcat8,9版本是: 
<Context> 
  <Resources allowLinking="true" />
</Context>

在这里插入图片描述
配置完开启tomcat支持软链接,重启tomcat后就可以通过uplod这个软链接去访问了
在这里插入图片描述

nginx虚拟主机

创建存放两个虚拟主机页面的文件夹
在这里插入图片描述
创建两个虚拟主机的访问首页
在这里插入图片描述
配置修改两个虚拟主机的service配置
为了不影响nginx的主配置文件nginx.conf里的配置,我们单独配置这两个虚拟主机的service配置文件,然后在nginx.conf文件里将这两个虚拟主机的配置文件包含进去,
包含语句为“include /apps/nginx/conf.d/*.conf;”

在这里插入图片描述
用两个域名访问需要用的域名解析,于是需要修改hosts文件
在这里插入图片描述
配置好以后我们重启nginx就可以访问我们的两个虚拟主机了
一个主机的域名是“www.flylei.org”
一个主机的域名是“m.flylei.org”
在这里插入图片描述
windows浏览器访问也需要修改hosts文件,修改后就可以访问啦
在这里插入图片描述
在这里插入图片描述
此时10.0.0.201就有三个默认页面了,那当我们curl 10.0.0.201时,回去访问哪个页面呢。此时还是会去访问nginx官方默认的首页,也就是‘welcome to nginx’的哪个页面。是因为我们将两个虚拟主机的配置文件的include包含语句块放在了nginx主配置文件的最下面,所以最后才被加载到。如果将include的包含语句快放在最前面则就会首先去加载两个虚拟主机的页面,两个虚拟主机的配置文件又会根据配置文件的首字母的字典排序去优先加载。www.conf和mobile.conf因为m字母在w字母的前面所以优先加载的是mobile.conf
在这里插入图片描述
在这里插入图片描述
使用tree命令查看include语句下conf.d目录下有包含了哪些配置文件哪些文件
在这里插入图片描述
接下来再来看访问10.0.0.201时访问的是哪个页面
在这里插入图片描述

root和alias

root

root:指定web的家目录,在定义location的时候,文件的绝对路径等于root+location
root可以存放在server语句块里也可以存放在location语句块里,
参考官方文档root官方文档
在这里插入图片描述
以下location配置是怎么样的一个访问规则

location /about {
  root  /opt/nginx/html;
}

当访问www.flylei.com/about时,是去找/opt/nginx/html目录下的about目录下的资源,当我们没有创建about相关目录时,就会报错404
在这里插入图片描述
查看nginx的错误日志可以看到,是去找html目录下的about目录下的资源,于是我们去创建about目录
在这里插入图片描述
在这里插入图片描述
创建about目录下的index.html页面后我们再去访问,就访问成功了。
在这里插入图片描述

alias

alias:定义路径别名,会把访问的路径重修定义到其他指定的路径,文档映射的另一种机制,只能出现在location语句块里。此命令使用较少。

server{
  #注意about后不要加/,使用alias的时候如果后面加了斜杠,则下面的路径配置必须加斜杠,否测403
  location /about {
    alias /opt/html/about;
  }
}

在这里插入图片描述
如果将location的语句块配置为,又将会是怎么样的一个访问规则

location /about {
  alias /opt/nginx/html;
}

alias也就意味着当访问/about目录时,直接去找/opt/nginx/html下的资源页面,而不是像root那样以root路径为前缀补上/about再去访问。
在这里插入图片描述
在这里插入图片描述

#-l参数跟进重定向路径
curl -L www.flylei.com

在这里插入图片描述

nginx语法检查和平滑重启

[root@test_officeweb_69_5 sbin]# cd /usr/local/nginx/sbin
[root@test_officeweb_69_5 sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@test_officeweb_69_5 sbin]# ./nginx -s reload

在这里插入图片描述

nginx报错(98: Address already in use)

在这里插入图片描述
报错提示好像是说地址被占用,网上的大佬说是80端口被占用,使用“sudo fuser -k 80/tcp
”关闭80端口即可。解决Nginx启动报nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

查找占用端口的进程

查找占用端口的程序的三种方法:
  1.ss -tunlp |grep 端口号
  2.netstat -natp |grep 端口号
  3.lsof -i :端口号

1.ss

ss是一个用于查询网络连接的工具,功能强大且比netstat更快

ss
  NAME
       ss - another utility to investigate sockets

  DESCRIPTION
       ss is used to dump socket statistics. It allows showing information similar to netstat.  
       It can display more TCP and state information than other tools.
  
  常用选项:
    -l, --listening  Display only listening sockets (these are omitted by default).
    -n, --numeric    Do not try to resolve service names. Show exact bandwidth values, instead of human-readable.
    -p, --processes  Show process using socket.
    -t, --tcp        Display TCP sockets.
    -u, --udp        Display UDP sockets.

在这里插入图片描述
在这里插入图片描述

输出解释
  Netid:         套接字类型(如tcp、udp)。
  State:         连接状态(如ESTAB、LISTEN、CLOSE_WAIT等)。
  Recv-Q:        接收队列中的字节数。
  Send-Q:        发送队列中的字节数。
  Local Address: 本地IP地址和端口。
  Peer Address:  远程IP地址和端口。
  Process:       使用该连接的进程信息(如果使用了-p选项)。

2.netstat

netstat是一个网络统计工具,可以显示网络连接、路由表、接口统计等信息。

在某些系统上,netstat可能被ss命令替代,ss更快速且提供更多选项。

netstat
  NAME
       netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
  
  常用选项:
     -n, --numeric            don't resolve names
     -l, --listening          display listening server sockets

在这里插入图片描述

输出解释
  Proto:            协议类型(TCP/UDP)。
  Recv-Q:           接收队列中的字节数。
  Send-Q:           发送队列中的字节数。
  Local Address:    本地IP地址和端口。
  Foreign Address:  远程IP地址和端口。
  State:            连接状态(如ESTABLISHED、LISTEN、CLOSE_WAIT等)。

在这里插入图片描述

#查找80端口
netstat -natp |grep 80
#关闭80端口
sudo fuser -k 80/tcp

在这里插入图片描述

3.lsof

lsof(List Open Files)是一个强大的命令行工具,用于列出当前系统中打开的文件和相应的进程。它可以帮助用户诊断文件和网络连接的使用情况。
在这里插入图片描述
在这里插入图片描述

输出解释
  COMMAND:     占用端口的程序名
  PID:         进程ID
  USER:        进程的用户
  FD:          文件描述符
  TYPE:        文件类型(IPv4或IPv6)
  NAME:        端口和协议信息

其他注意事项
  1.lsof需要相应的权限来查看其他用户的打开文件,普通用户可能无法查看某些进程的信息。
  2.在某些系统中,可能需要以root用户身份运行lsof以获取完整信息。

Nginx配置反向代理

正向代理和反向代理
  正向代理:代理的是客户端
  反向代理:代理的是服务器

管控期间居家办公,居家访问不了公司的内网,像公司的测试环境、数据库、Gitlab等都连接不上。于是公司就搞了VPN,分配给我们VPN账号,登录VPN之后就可以访问公司的办公环境了。那么此时VPN就是我们的正向代理了,公司的办公环境是内网局域网,外网IP是访问不了内网的。那此时VPN自然是公司内网环境的一部分,于是VPN就代理我们去访问公司的内网了。

nginx的反向代理配置
试验目的通过域名www.leiproxy.com去访问本地的Tomcat服务默认欢迎首页。
之前在10.0.0.201的机器上部署的Tomcat,这次通过nginx的反向代理去访问。
首先创建一个配置反向代理的proxy.conf文件
在这里插入图片描述
proxy.conf的配置内容如下
主要配置语法为proxy_pass语句块

server{
    listen          80;
    server_name     www.leiProxy.com;
        
    location / {
       root  html;
       index index.html index.htm;
       proxy_pass http://10.0.0.201:8080;
    }
}

要想通过www.leiProxy.com跳转到指定的ip上,需要修改本机的hosts文件,windows系统上hosts的文件存放在“C:\Windows\System32\drivers\etc”目录下,修改如下
在这里插入图片描述
然后nginx -t 检测语法,最后平滑重启加载nginx。访问www.leiproxy.com
在这里插入图片描述
这样我们就简单的实现了一个nginx的反向代理。www.leiproxy.com反向代理了10.0.0.201机器上的Tomcat服务。www.leiproxy.com就是反向代理站点,浏览器访问的是反向代理站点,由反向代理站点去访问真实的Tomcat服务然后再返回给浏览器。这个反向代理站点可以是www.leiproxy.com这个域名映射到的任意ip地址上的。这样的访问方式从一定程度上保证了Tomcat服务的安全,用户不是直接去访问Tomcat服务而是先访问代理服务器,再由代理服务器去访问Tomcat。如果是一个恶意请求,反向代理服务器就可以一定程度上避免恶意请求直接去攻击Tomca服务器(个人拙见)。

更多推荐