综合架构web服务之nginx详解

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
.cn 域名,1个 12个月
简介: 综合架构web服务之nginx详解

nginx 服务配置详细介绍



关于作者


📢博客主页:https://blog.csdn.net/weixin_42313749

hello,大家好!我是黄昏,我们一起来学linux 云计算。如果喜欢博客,点个赞,关注下哟

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

对linux 云计算|华为|华三|思科等数通网络技术感兴趣,可以私信博主,私信获取教程,一起交流技术。


📢未来可期 让生命像一团热烈燃烧的火,直到死亡才能使它熄灭✨


前言


如果你听说或使用过Apache 软件,那么很快就会熟悉nginx 软件,与Apache 软件类似,它是一个 俄罗斯人 lgor Sysoev 开发的。最初用在俄罗斯的大型网站上,后来将代码公布,形成一个开源的、支撑高性能、高并发的 WWW 服务器和代理服务软件。


那么今天呢,小编就结合企业工作案列,对nginx 做一个详解的介绍。


如果有少许问题,如果少许错误,可以私信博主纠正、一起学习进步!


image.png


一、nginx web 入门简介


1.1 什么是nginx


  • Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器
  • Nginx是一款轻量级的Web 服务器/反向代理服 务器及电子邮件(IMAP/POP3)代理服务器
  • nginx 可以运行在UNIX、Linux、BSD 、Mac OS X 、Solaris,以及windows 等操作系统中。随着nginx 在国内很多大型网站中的稳定高效运行,近两年来它 逐渐被越来越多的中小型网站所使用。当前流行的Nginx Web组合被称为 LNMP 或LEMP(linux nginx Mysql PHP ),其中E 取自 Nginx中得(enginex)


1.2 常见的网站服务


  • 处理静态资源的服务:


apache软件: http://apache.org/

nginx软件: http://nginx.org


  • 处理动态资源的服务:


PHP: php.net 终端浏览器进行访问

Tomcat(java): 利用移动端查看网页 安卓-java

PYTHON: 开发难度比较低


image.png


1.3 nginx 网站服务特点


  • Nginx具有高并发,消耗内存少
  • 具有多种功能(web、负载均衡–LVS、网站缓存–Squid)
  • 实现通讯时使用 异步网络IO 模型:epoll模型
  • 可以部署的平台多样化
  • 对php可使用cgi方式和fastcgi方式
  • 补充:


异步:(你发给我,我可以缓存,稍后在处理)
同步:(你发我一个,我就必须处理一个)


1.4 网站页面访问原理


image.png


  • 将域名进行解析 www.hbs.com — 10.0.0.7
  • 建立TCP的连接(四层协议)


10.0.0.7 目标端口 8080


  • 请求报文: hosts: bbs.hbs.com


没有相同域名的server主机,会找满足端口要求的第一个主机

显示主机的网站页面


二、nginx 服务部署安装


2.1实验环境


image.png


2.2 YUM 安装


  • 使用官方yum源进行安装 安装的是最新版本 软件目录结构比较标准 (推荐)
  • 配置官方nginx yum 源:


image.png


image.png


image.png


image.png


  • 安装命令


# 配置nginx yum源
[root@web_server01~]# cat /etc/yum.repos.d/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[root@web_server01~]# 
#安装 nginx
[root@web_server01~]# yum -y install nginx 
# 启动nginx 服务,检查安装正确性
[root@web_server01~]# systemctl start nginx
[root@web_server01~]# systemctl enable nginx
# 测试,打开本地浏览器,输入IP 地址可以访问即 安装成功


  • 本地浏览器测试


image.png


  • 清除 nginx 软件


#去除nginx 安装软件
[root@web_server01~]# yum  erase nginx 
[root@web_server01~]# yum clean all  
# 目的是,为了演示源码编译安装。后面实验,均是源码安装


2.3 源码编译安装


  • 源码安装步骤


1.# 下载源码安装包
[root@web_server01~]# wget http://nginx.org/download/nginx-1.20.1.tar.gz
--2021-08-31 13:48:54--  http://nginx.org/download/nginx-1.20.1.tar.gz
Resolving nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5704::6, ...
Connecting to nginx.org (nginx.org)|3.125.197.172|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1061461 (1.0M) [application/octet-stream]
Saving to: ‘nginx-1.20.1.tar.gz’
100%[=========================================================>] 1,061,461    278KB/s   in 3.7s   
2021-08-31 13:48:59 (278 KB/s) - ‘nginx-1.20.1.tar.gz’ saved [1061461/1061461]
2. # 解压安装包
[root@web_server01~]# tar xf nginx-1.20.1.tar.gz -C /usr/src/
3. # 创建系统用户
[root@web_server01~]# useradd -M -s /sbin/nologin nginx
4. # 创建日志存放目录
[root@web_server01~]# mkdir -p /var/log/nginx
5. # 安装nginx 依赖包
[root@web_server01~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
6. # 开始编译
[root@web_server01/usr/src/nginx-1.20.1]# ./configure --user=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --without-http_rewrite_module
7. # 编译&&安装
[root@web_server01/usr/src/nginx-1.20.1]# make && make install
8.# 检查nginx 配置文件是否安装正确 ,返回ok 即可
[root@web_server01/usr/src/nginx-1.20.1]# /usr/local/nginx/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


  • 启动nginx 服务


# 启动nginx 服务
[root@web_server01~]# /usr/local/nginx/sbin/nginx


  • 补充:nginx 安装后配置(可以不配),推荐配置


# 配置nginx 环境变量
[root@web_server01~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@web_server01~]# source /etc/profile.d/nginx.sh 
#服务控制方式,使用nginx命令
    -t  //检查配置文件语法
    -v  //输出nginx的版本
    -c  //指定配置文件的路径
    -s  //发送服务控制信号,可选值有{stop|quit|reopen|reload}
# 启动nginx
[root@web_server01~]# nginx
[root@web_server01~]# ss -lant
State       Recv-Q Send-Q    Local Address:Port                   Peer Address:Port              
LISTEN      0      128                   *:80                                *:*                  
LISTEN      0      128                   *:22                                *:*                  
LISTEN      0      100           127.0.0.1:25                                *:*                  
ESTAB       0      0              10.0.0.7:22                         10.0.0.1:62580              
LISTEN      0      128                  :::22                               :::*                  
LISTEN      0      100                 ::1:25                               :::*                  
# 停止nginx
[root@web_server01~]# nginx -s stop


image.png


2.4 nginx重要文件目录结构


image.png


image.png


  • /etc/logrotate.d/ 日志切割的目录


[root@web_server01~]# rpm -ql nginx
/etc/logrotate.d/nginx          #  实现nginx日志文件定时切割处理
/etc/nginx                      # nginx 配置文件
/etc/nginx/nginx.conf           # 主配置文件
/etc/nginx/conf.d/default.conf  # 虚拟主机配置文件
/etc/nginx/fastcgi_params
/etc/nginx/mime.types           # 媒体资源类型文件
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
……


  • nginx 主配置文件介绍


# 备份 nginx 配置文件
[root@web_server01/etc/nginx]# cp nginx.conf{,.bak}
# 过滤以 空格 开头的内容
[root@web_server01/etc/nginx]# grep "^$" nginx.conf.bak
# 将过滤出来的内容取反
[root@web_server01/etc/nginx]# grep -v "^$" nginx.conf.bak
# 过滤取反后的文件重定向 到nginx 配置文件中
[root@web_server01/etc/nginx]# grep -v "^$" nginx.conf.bak > nginx.conf
==重要提示==
[root@web_server01/etc/nginx]# cat nginx.conf
# 第一部分:配置文件主区域配置
user  nginx;                             # 定义worker进程管理的用户
worker_processes  auto;                  # 定义有几个worker进程,它等于CPU 核数  /核数的2倍                      
error_log  /var/log/nginx/error.log notice;   #定义错误日志
pid        /var/run/nginx.pid;                            #定义PID 文件路径信息
# 第二个部分: 配置文件事件区域
events {
worker_connections  1024;   ---- 一个worker进程同时可以接受1024个访问请求
}
# 配置http 区域
http {
include       /etc/nginx/mime.types;    ---- 加载一个配置文件
default_type  application/octet-stream; ---- 指定默认识别文件类型
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;                ---- 特殊的数据传输功能
#tcp_nopush     on; 
参数sendfile on 用于开启文件高效传输模式,同时将tcp_nopush on 和tcp_nodelay on 两个指令设置为on,可防止网络及磁盘I/O阻塞,提升Nginx工作效率
keepalive_timeout  65;             ----超时时间
#gzip  on;
include /etc/nginx/conf.d/*.conf;  - --- 加载一个配置文件
}
# 第四个部分: server区域信息(配置一个网站 www/bbs/blog -- 一个虚拟主机)
server {
  listen       8080;                --- 指定监听的端口
  server_name  www.oldboy.com;      --- 指定网站域名                     
  root   /usr/share/nginx/html;     --- 定义站点目录的位置
  index  index.html index.htm;      --- 定义首页文件
  error_page   500 502 503 504  /50x.html;   --- 优雅显示页面信息
  location = /50x.html {
      root   /usr/share/nginx/html;
  }
}
============分割线==============分割线===================分割线=================
补充:nginx 进程,他有2个进程
master process:主进程    ----管理服务是否正常运行
worker process:工作进程  ----处理用户的访问请求
[root@web_server01/etc/nginx]# ps -ef|grep nginx
root      35183      1  0 11:54 ?        00:00:00 nginx: master process nginx
nginx     35184  35183  0 11:54 ?        00:00:00 nginx: worker process
root      35419  35155  0 13:04 pts/0    00:00:00 grep --color=auto nginx


2.5 虚拟主机介绍及配置


  • 虚拟主机配置


在真实的服务器环境,为了充分利用服务器资源,一台nginx web服务器同时会配置N个虚拟域名主机,即多个域名对于同样一个80端口。然后服务器IP数量很多,也可以配置基于多个IP对应同一个端口。


  • 配置虚拟主机配置文件介绍


[root@web_server01/etc/nginx]# cd conf.d/
[root@web_server01/etc/nginx/conf.d]# cp default.conf{,.bak}     #先备份配置文件
#过滤空格、# 开头的内容。(^$ 空格空格开头,^# #号开头、-v 取反)
[root@web_server01/etc/nginx/conf.d]# egrep -v "^$|#" default.conf.bak 
server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
[root@web_server01/etc/nginx/conf.d]# egrep -v "^$|#" default.conf.bak  > default.conf
[root@web_server01/etc/nginx/conf.d]# cat default.conf
server {
    listen       8080;         -----指定监听端口,原本80,这里我修改成8080(目的是为了做第一个简单的www网站)
    server_name  localhost;    ----指定网站域名
   location / {               ----通过指定模式来与客户端请求的URI相`匹配`
        root   /usr/share/nginx/html; ---- 定义站点目录的位置
        index  index.html index.htm;  ---- 定义首页文件
    }
    error_page   500 502 503 504  /50x.html;  ---- 优雅显示页面信息
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
[root@web_server01/etc/nginx/conf.d]# 


2.5.1利用nginx服务搭建一个网站(www)


前提是,你把/etc/nginx/conf.d/default.conf,80端口 修改成8080或其他端口。


否则看不到效果,每次看到的都是 默认欢迎界面


# 这里自己写一个测试网页
[root@web_server01/etc/nginx/conf.d]# cd /usr/share/nginx/html/
[root@web_server01/usr/share/nginx/html]# cat hbs.html 
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我的第一个html</title>
</head>
<body>
<h1>大家好!我是黄昏</h1>
<p>nginx配置的第一个简单的html</p>
</body>
</html>
[root@web_server01/usr/share/nginx/html]# ls
50x.html  hbs.html  index.html


第二个历程: 需要获取开发人员编写的网站代码


# 这里自己写一个测试网页
[root@web_server01/etc/nginx/conf.d]# cd /usr/share/nginx/html/
[root@web_server01/usr/share/nginx/html]# cat hbs.html 
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我的第一个html</title>
</head>
<body>
<h1>大家好!我是黄昏</h1>
<p>nginx配置的第一个简单的html</p>
</body>
</html>
[root@web_server01/usr/share/nginx/html]# ls
50x.html  hbs.html  index.html


第三个历程: 重启nginx服务


第三个历程: 重启nginx服务(平滑重启)
  两种方法:
  systemctl reload nginx 
  nginx -s reload
  nginx命令参数
  -t            : test configuration and exit
                  检查测试配置文件语法
  -s            : send signal to a master process: stop, quit, reopen, reload
                  控制服务停止或者重新启动


第四个历程: 编写DNS配置信息


第四个历程: 编写DNS配置信息
真实域名: 在阿里云上进行DNS解析记录配置
  模拟域名: 在windows主机的hosts文件中进行配置即可
            C:\Windows\System32\drivers\etc\hosts
            10.0.0.7  www.hbs.com  hosts文件末尾添加Ip 域名


第五个历程: 进行测试访问


第五个历程: 进行测试访问
  浏览器中: http://www.oldboy.com


image.png


2.5.2 location介绍、location 访问控制及 优雅404显示


  • location 介绍:


允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能
= 精确匹配
location = /hbs 
~ 正则表达式,区分大消息
location ~ ^/hbs$
~* 不区分大小写
location ~* ^/hbs$ 
匹配顺序:
带有=的精确匹配优先
正则表达式按照他们在配置文件中定义的顺序
带有^~修饰符的,开头匹配


image.png


  • location 访问控制


用于location段
allow:设定允许哪台或哪些主机访问,多个参数间用空格隔开
deny:设定禁止哪台或哪些主机访问,多个参数间用空格隔开
示例:
allow 192.168.1.1/32 172.16.0.0/16;
deny all;
# 放行了10.0.0.81/32 172.16.0.0/16,拒绝了其它ip地址
location  /hbs {
                 root   /usr/share/nginx/html;
                 index  hbs.html;
                 allow 10.0.0.81/32 172.16.0.0/16
                 deny all
    }


image.png


image.png


  • 补充:访问策略配置写法


 写法1:
 server {
         listen        80;
         server_name   www.hbs.com;
           root  /html/www;
           index index.html;
         location /AV {
           deny  10.0.0.0/24;
           allow 172.16.1.0/24;
         }
      }
 写法2:
 server {
         listen        80;
         server_name   www.hbs.com;
         location / {
           root  /html/www;
           index index.html;
         }
         location /AV {
           deny  10.0.0.0/24;
           allow 172.16.1.0/24;
           root  /html/www;
           index index.html;
         }
      }
      补充: 
    location外面的信息, 全局配置信息
    location里面的信息, 局部配置信息


  • 优雅界面404 显示


2.5.3 利用nginx服务搭建一个多网站(www、 love、 blog)


  • 第一步:创建三个配置文件


[root@web_server01/etc/nginx/conf.d]# ls
bbs.conf  blog.conf  default.conf  default.conf.bak  www.conf
# www.conf 配置文件
[root@web_server01/etc/nginx/conf.d]# cat www.conf 
server {
   listen      80;
   server_name  www.hbs.com;
   location / {
       root   /usr/share/nginx/html/www;
       index  index.html;
   }
}
# bbs.conf 配置文件
[root@web_server01/etc/nginx/conf.d]# cat bbs.conf 
server {
    listen        80;
    server_name   bbs.hbs.com;
    location  / {
       root   /usr/share/nginx/html/bbs;
       index  index.html;
    }
}
# blog.conf 配置文件
[root@web_server01/etc/nginx/conf.d]# cat blog.conf 
server {
   listen        80;
   server_name   blog.hbs.com;
   location  / {
       root   /usr/share/nginx/html/blog;
       index  index.html;
    }
}
[root@web_server01/etc/nginx/conf.d]# 


  • 第二步:创建站点目录和目录中首页文件


# 常见站点目录
[root@web_server01~]# mkdir -p /usr/share/nginx/html/{www,bbs,blog}
# 创建站点首页文件
[root@web_server01/usr/share/nginx/html]# ls
50x.html  bbs  blog  index.html  www
[root@web_server01/usr/share/nginx/html]# cat www/index.html 
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我的第一个html</title>
</head>
<body>
    <h1>大家好!我是黄昏</h1>
    <p>10.0.0.7 www.hbs.com</p>
</body>
</html>
……
# 重启 nginx
[root@web_server01~]# systemctl stop nginx
[root@web_server01~]# systemctl start nginx


  • 添加hosts 文件:


image.png


  • 测试


image.png


2.5.4 企业中虚拟主机 访问方式


  • 基于域名的方式方式进行访问


  • 基于地址的方式进行访问(只能用指定地址访问)—负载均衡+高可用服务


    server {
         listen        10.0.0.7:80;   # 填写地址
         server_name   www.hbs.com;
         location  / {
           root  /html/www;
           index index.html;
         }
      }
 配置完毕了,需要关闭/重启nginx


  • 基于端口的方式进行访问:(zabbix服务(apache:80) + web服务(nginx:80) --> 2个端口重复)


# 修改端口
[root@web_server01/etc/nginx/conf.d]# cat www.conf 
server {
   listen      8080;
   server_name  www.hbs.com;
   location / {
       root   /usr/share/nginx/html/www;
       index  index.html;
   }
}
[root@web_server01/etc/nginx/conf.d]# 
[root@web_server01/etc/nginx/conf.d]# systemctl restart nginx
[root@web_server01/etc/nginx/conf.d]# netstat -lntup|grep 80
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      38784/nginx: master 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      38784/nginx: master 
[root@web_server01/etc/nginx/conf.d]# 


image.png


2.5.5 基于 用户访问 认证


  • nginx认证模块: ngx_http_auth_basic_module


  • 举例配置

  location / {
         auth_basic           "closed site";    --- 开启认证功能(欢迎信息)
         auth_basic_user_file conf/htpasswd;    --- 加载用户密码文件,密码文件存放路径
      }
      密码文件存放路径,推荐相对路径


  • 具体详细配置过程


第一个历程: 编写虚拟主机配置文件


[root@web_server01/etc/nginx]# cat conf.d/www.conf 
server {
  listen      80;
  server_name  www.hbs.com;
  location / {
      root   /usr/share/nginx/html/www;
      index  index.html;
      auth_basic   "欢迎来到王者荣耀!";
      auth_basic_user_file  passwd/passwd;        #passwd目录下的passwd密码文件
  }
}


第二个历程: 创建密码文件(文件中密码信息必须是密文的)


# 创建 一个目录,存放密码文件
[root@web_server01/etc/nginx]# mkdir passwd
# 检查是否有htpasswd 密码工具,没有yum 安装httpd-tools
[root@web_server01/etc/nginx/passwd]# rpm -qf `which htpasswd` 
httpd-tools-2.4.6-97.el7.centos.x86_64
[root@web_server01/etc/nginx/passwd]# 
# 生成密码文件
[root@web_server01/etc/nginx/passwd]# htpasswd -bc passwd hbs 123456
Adding password for user hbs
[root@web_server01/etc/nginx/passwd]# cat passwd 
hbs:$apr1$7WaamHGp$ENgUQ2yncebNZpFtGbRyX.
[root@web_server01/etc/nginx/passwd]#
# 查看生成的用户及密码
[root@web_server01/etc/nginx/passwd]# cat passwd 
hbs:$apr1$7WaamHGp$ENgUQ2yncebNZpFtGbRyX.
[root@web_server01/etc/nginx/passwd]# 


这样就可以直接测试,但是由于这样的密码文件具有较高的权限,不安全,所以涉及到修改密码文件,及文件属主。如果不修改文件权限,则不安全。


  • 测试


image.png


image.png


image.png


  • 修改文件权限


[root@web_server01/etc/nginx/passwd]# chmod 600 ./passwd


  • 测试


image.png


  • 报500问题原因


image.png


  • 解决问题方法


[root@web_server01/etc/nginx/passwd]# chown nginx ./passwd


  • 测试


image.png


2.5.6 利用nginx服务搭建网站文件共享服务器–index of


  • 文件共享


如何利用nginx服务搭建文件共享呢,比如像 阿里镜像网站那样,输入域名就可以看到很多目录,打开还可以 下载呢


image.png


  • 操作步骤


第一个步: 编写配置文件(开启autoindex模块)


server {
  listen      80;
  server_name  www.hbs.com;
  location / {
      root   /usr/share/nginx/html/www;
      auth_basic   "欢迎来到王者荣耀!";
      auth_basic_user_file  passwd/passwd;
      autoindex on;                  # 开启autoindex 模块即可。
  }
}


第二步:重启服务,如果有首页,将首页删除并制造测试数据


# 准备好的测试数据
[root@web_server01/usr/share/nginx/html/www]# ls
Centos  Centos6.5  Centos6.9  Centos7.1  Centos7.2  hbs.txt  index.html.backup
# 重启nginx 服务
[root@web_server01/usr/share/nginx/html/www]# systemctl restart nginx


此时测试,我们只有查看的权限,如果想下载,还学要修改mime.types文件。


mime.types媒体资源类型文件作用


文件中有的扩展名信息资源, 进行访问时会直接看到数据信息 txt


文件中没有的扩展名信息资源, 进行访问时会直接下载资源 php


image.png


  • 赋予下载权限,修改mime.types 配置文件


修改 mime.types配置文件,搜索txt,将txt 改成php 就可以下载了。


image.png


  • 测试


image.png


2.5.7 nginx 解决首页乱码问题


  • 设置成utf-8


server {
   listen      80;
   server_name  www.hbs.com;
   location / {
       root   /usr/share/nginx/html/www;
       auth_basic   "欢迎来到王者荣耀!";
       auth_basic_user_file  passwd/passwd;
       charset utf-8;                  
   }
}
location 添加 charset utf-8; 


2.5.8 利用nginx服务搭配置文件别名功能


  • 配置别名


这里就是比如你的域名很长,你想配置短一点的域名例如:


www.hbs.com 你配一个 bs.com的别名


1.修改配置文件


server_name www.hbs.com bs.com


2.重启nginx 服务


[root@web_server01/etc/nginx]# systemctl restart nginx


3.修改hosts 文件


image.png


image.png


2.5.9 利用nginx状态模块功能对网站进行监控


  • 开启监控模块ngx_http_stub_status_module


location = /basic_status {
        stub_status;
    }
===========================
这里我在 conf.d 目录新建了一个关于状态的站点 status.conf
[root@web_server01/etc/nginx/conf.d]# cat status.conf 
  server {
     listen    80;
     server_name  status.oldboy.com
     stub_status;
}
# 平滑启动nginx
[root@web_server01/etc/nginx/conf.d]# systemctl reload nginx
添加hosts 域名


  • 访问测试


image.png


监控获取参数说明


Active connections: 激活的连接数信息 4000用户 3500


accepts: 接收的连接数汇总(综合) TCP


handled: 处理的连接数汇总(综合) TCP


requests: 总计的请求数量 HTTP协议请求


Reading: nginx服务读取请求报文的数量 100人点餐


Writing: nginx服务响应报文信息数量 100人响应


Waiting: nginx队列机制,要处理(读取或者响应保存进行保存) 监控


2.5.10 nginx 日志功能配置及错误日志介绍


  • 访问日志/var/log/nginx/access.log ngx_http_log_module


  • 错误日志/var/log/nginx/error.log --- Core functionality


  • 访问日志介绍


# 定义日志内容格式
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;    #调用日志格式                            
$remote_addr            显示用户访问源IP地址信息
   $remote_user            显示认证的用户名信息
[$time_local]           显示访问网站时间
"$request"              请求报文的请求行信息
   $status                 用户访问网站状态码信息
$body_bytes_sent        显示响应的数据尺寸信息
$http_referer           记录调用网站资源的连接地址信息(防止用户盗链)                    
www.hbs.com---access.log--->blog.hbs.com到www.hbs.com的连接--->http_referer(链接)
$http_user_agent        记录用户使用什么客户端软件进行访问页面的  (谷歌 火狐 IE 安卓 iphone)
$http_x_forwarded_for   负载均衡
[root@web_server01/var/log/nginx]# tail -f /var/log/nginx/www_access.log 
10.0.0.129 - - [02/Sep/2021:17:52:41 +0800] "GET / HTTP/1.1" 401 179 "-" "Mozilla/5.0 (Windows NT 6.1; rv:91.0) Gecko/20100101 Firefox/91.0" "-"


错误日志的配置及 错误级别


Syntax: error_log file [level]; 指定错误日志路径以及错误日志记录的级别

Default: error_log logs/error.log error;

Context: main, http, mail, stream, server, location

error_log /var/log/nginx/error.log warn;


错误级别:


debug :通知级别: 更加重要的信息进行通知说明

warn :警告级别: 可能出现了一些错误信息,但不影响服务运行

error :错误级别: 服务运行已经出现了错误,需要进行纠正 推荐选择

crit :严重级别: 必须进行修改调整

alert :严重警告级别: 即警告,而且必须进行错误修改

emerg :灾难级别: 服务已经不能正常运行 信息越少


级别越低,显示日志越少,级别越高显示日志越多。通常推荐 error 级别。


  • 不同的网站都配置自己的访问日志


server {
   listen      80;
   server_name  www.hbs.com bs.com;
   access_log  /var/log/nginx/www_access.log  main;  #调用日志  
   location / {
       root   /usr/share/nginx/html/www;
       auth_basic   "欢迎来到王者荣耀!";
       auth_basic_user_file  passwd/passwd;
#       autoindex on;
   }
}
# 平滑重启
[root@web_server01/etc/nginx]# systemctl restart nginx 
# 日志里会自动生成 www访问日志
[root@web_server01/var/log/nginx]# ls /var/log/nginx/www_access.log 
/var/log/nginx/www_access.log
[root@web_server01/var/log/nginx]# 


2.5.11 利用nginx实现页面跳转功能


  • 利用rewrite模块是跳转功能: http_rewrite_module


  • 语法


Syntax: rewrite regex replacement [flag];   rewite  匹配的正则信息  替换成什么信息
Default:  —
Context:  server, location, if


  • 举例配置(将hbs.com—>转换到blog.hbs.com)


rewrite blog.hbs.com/(.*) http://blog.hbs.com/$1 permanent;   #重写规则配置
baidu.com   /  index.html       跳转方式
www.baidu.com/index.html
跳转方式:
  永久跳转:  permanent   301    会将跳转信息进项缓存
  临时跳转:  redirect    302    不会缓存跳转信息
编写步骤
出现无限跳转如何解决:
  第一种方法: 利用不同server区块配置打破循环
  server {
     server_name  hbs.com;
     rewrite ^/(.*) http://blog.hbs.com/$1 permanent;
  }
  第二种方法: 利用if判断实现打破循环
  if ($host ~* "^hbs.com$") {
      rewrite ^/(.*) http://blog.hbs.com/$1 permanent;
    }


image.png


image.png


  • 301 与302 的区别


image.png


2.5.12 nginx 防盗链配置介绍


  • 什么是防盗链


防盗链的含义:网站内容部署自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。


这样的话,我们会看到每天访问量很大,占用很多不必要的带宽,浪费资源,所以我们需要做一些限制。


防盗链其实就是采用服务器端编程,通过url过滤技术实现的防止盗链的软件。


  • 防盗链配置


Nginx server防盗链配置如下:
server {
        listen       80;
        server_name  localhost  www.hbs.com;
        location / {
            root   /usr/share/nginx/html/www;
            index  index.html index.htm;
        }
        location ~* \.(gif|jpg|png|swf|flv)$ {
                valid_referers  none  blocked  *.hbs.com;
                root   html;
        if ($invalid_referer) {
                  return 403;
                }
        }
    }
补充:
第一行:gif|jpg|png|swf|flv表示对gif、jpg、png、swf、flv后缀的文件实行防盗链
第二行:hbs.com  表示对hbs.com这个来路进行判断
if{}里面内容的意思是,如果来路不是指定来路就跳转到错误页面,当然直接返回403也是可以。
或者如下设置也可以:
location ~* \.(gif|jpg|png|swf|flv)$
if ($host  !=’*.hbs.com’) {
return 403;
}


2.5.13 部署搭建网站常见错误


  • 01.网站服务配置文件编写不正确


404 错误
    解决方法一: 修改nginx配置文件---location
    解决方法二: 在站点目录中创建相应目录或文件数据信息
403 错误
    解决方法一: 不要禁止访问
    解决方法二: 因为没有首页文件


  • 02.DNS信息配置不正确


  • 03. nginx配置文件修改一定要重启服务;


  • 04.做实验,要清除浏览器缓存


三、nginx 性能优化


3.1 Nginx 性能优化实战


  • 优化说明


随着访问量的不断增加,需要对Nginx和内核做相应的优化来满足高并发用户的访问,那下面在单台Nginx服务器来优化相关参数。通常从配置文件及内核做优化。


3.1.1 配置文件优化介绍


  • 配置文件优化


# nginx进程数,建议按照cpu核数目来指定,一般为它的2倍。
worker_processes 8;
# 为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一
个进程分配到多个cpu。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 
00100000 01000000 10000000;
# 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打
开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀
,所以最好与ulimit -n的值保持一致。
worker_rlimit_nofile 102400;
# 使用epoll的I/O模型。epoll是Linux内核为处理大批量文件描述符而作了改进的
poll,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用
率。
use epoll;
# 每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为
worker_connections 102400;
# keepalive超时时间,客户端到服务器端的连接持续有效时间,当出现对服务器的后
keepalive_timeout 60;
继请求时,keepalive-timeout功能可避免建立或重新建立连接。
# 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
client_header_buffer_size 4k;
#这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开
文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=102400 inactive=20s;
# 这个是指多长时间检查一次缓存的有效信息。
open_file_cache_valid 30s;
#open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这
个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive
时间内一次没被使用,它将被移除。
open_file_cache_min_uses 1;


3.1.2 内核优化介绍


  • linux 内核优化


# timewait的数量,默认是180000。
net.ipv4.tcp_max_tw_buckets = 10000
#允许系统打开的端口范围。
net.ipv4.ip_local_port_range = 1024 65000
#启用timewait快速回收。
net.ipv4.tcp_tw_recycle = 1
# 启用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1
# 开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。
net.ipv4.tcp_syncookies = 1


3.2 日志切割


日志切割方法一: 利用脚本实现切割


 #!/bin/bash
 mv /var/log/nginx/access.log  /var/log/nginx/access_$(date +%F).log
 systemctl restart nginx


*日志切割方法二: 利用专用文件切割程序–logrotate


vim /etc/logrotate.conf
   # rotate log files weekly
   weekly                     --- 定义默认日志切割的周期
   # keep 4 weeks worth of backlogs
   rotate 4                   --- 定义只保留几个切割后的文件
   # create new (empty) log files after rotating old ones
   create                     --- 创建出一个相同的源文件
   # use date as a suffix of the rotated file
   dateext                    --- 定义角标(扩展名称信息)
   # uncomment this if you want your log files compressed
   #compress                  --- 是否对切割后的文件进行压缩处理
   # RPM packages drop log rotation information into this directory
   include /etc/logrotate.d   --- 加载包含/etc/logrotate.d/目录中文件配置
   # no packages own wtmp and btmp -- we'll rotate them here
   /var/log/wtmp {            --- 单独对某个文件进行切割配置
       monthly
       create 0664 root utmp
       minsize 1M             --- 最小大小为1M,小于1M不进行切割              
       rotate 1
   }
   /var/log/btmp {
       missingok
       monthly
       create 0600 root utmp
       rotate 1
   }


后续会详细讲解日志切割脚本


3.3 nginx 性能压测试


  • 常用压力测试工具


常见的压测工具包括:ab、webbench、loadrunner、jmeter.
ab工具网站压力测试命令:
格式: ./ab [options] [http://]hostname[:port]/path
-n 测试会话中所执行的请求个数,默认时,仅执行一个请求
-c 一次产生的请求个数。默认是一次一个
-t 测试所进行的最大秒数
-v 设置显示信息的详细程度 - 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。 -V 显示版本号并退出。
4个比较长用的参数 若有其他需要man下吧
一般工作中我们只用-n 和 -c:
例:./ab -c 10 -n 1000 http://www.jfedu.net/index.php
-n 1000 表示总请求数为1000
-c 10   表示并发用户数为10
ab -c 10 -n 100 http://blog.hbs.com/index.html 表示这些请求的目标url。


  • 压力测试结果


[root@web_server01~]# ab -c 10 -n 100 http://blog.hbs.com/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking blog.hbs.com (be patient).....done
Server Software:        nginx/1.20.1
Server Hostname:        blog.hbs.com
Server Port:            80
Document Path:          /index.html
Document Length:        188 bytes              #HTTP响应数据的正文长度
Concurrency Level:      10
Time taken for tests:   0.062 seconds          #所有这些请求处理完成所花费的时间
Complete requests:      100                    #完成请求数
Failed requests:        0                      #失败请求数
Write errors:           0
Total transferred:      42000 bytes            #网络总传输量
HTML transferred:       18800 bytes            #HTML内容传输量
Requests per second:    1612.57 [#/sec] (mean) #吞吐量-每秒请求数
Time per request:       6.201 [ms] (mean)
#服务器收到请求,响应页面要花费的时间 
Time per request:       0.620 [ms] (mean, across all concurrent requests) 
#并发的每个请求平均消耗时间 
Transfer rate:          661.40 [Kbytes/sec] received
# 平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题。
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.7      0      18
Processing:     0    6  10.9      1      35
Waiting:        0    6  10.9      1      35
Total:          0    6  11.0      1      35
Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      2
  80%     18
  90%     35
  95%     35
  98%     35
  99%     35
 100%     35 (longest request)
[root@web_server01~]# 


image.png


3.4 lnmp 架构源码部署


  • lnmp 源码分离部署教程


  • yum 安装lnmp搭建网站


  • lamp源码部署至搭建博客教程


总结


这是博主花费2天左右,熬夜爆肝这篇万字长文,将企业常用的nginx 配置都详细的介绍下来了。


无论你是正在企业运维还是想步入linux 运维行业,都可以收藏,根据博文,一步步操作。加深对nginx的理解。


nginx 模块很丰富,目前常用的都介绍了。详细的还要去参考官方说明文档www.org

如果喜欢博主,可以私信我,一起交流、讨论技术!


相关文章
|
1月前
|
前端开发 JavaScript
探索现代Web应用的微前端架构
【10月更文挑战第40天】在数字时代的浪潮中,Web应用的发展日益复杂多变。微前端架构作为一种新兴的设计理念,正逐步改变着传统的单一前端开发模式。本文将深入探讨微前端的核心概念、实现原理及其在实际项目中的应用,同时通过一个简单的代码示例,揭示如何将一个庞大的前端工程拆分成小而美的模块,进而提升项目的可维护性、可扩展性和开发效率。
|
1天前
|
弹性计算 Java 关系型数据库
Web应用上云经典架构实践教学
Web应用上云经典架构实践教学
Web应用上云经典架构实践教学
|
2天前
|
消息中间件 存储 安全
分布式系统架构3:服务容错
分布式系统因其复杂性,故障几乎是必然的。那么如何让系统在不可避免的故障中依然保持稳定?本文详细介绍了分布式架构中7种核心的服务容错策略,包括故障转移、快速失败、安全失败等,以及它们在实际业务场景中的应用。无论是支付场景的快速失败,还是日志采集的安全失败,每种策略都有自己的适用领域和优缺点。此外,文章还为技术面试提供了解题思路,助你在关键时刻脱颖而出。掌握这些策略,不仅能提升系统健壮性,还能让你的技术栈更上一层楼!快来深入学习,走向架构师之路吧!
27 11
|
1天前
|
弹性计算 Java 数据库
Web应用上云经典架构实战
本课程详细介绍了Web应用上云的经典架构实战,涵盖前期准备、配置ALB、创建服务器组和监听、验证ECS公网能力、环境配置(JDK、Maven、Node、Git)、下载并运行若依框架、操作第二台ECS以及验证高可用性。通过具体步骤和命令,帮助学员快速掌握云上部署的全流程。
|
26天前
|
Kubernetes Cloud Native Docker
云原生之旅:从传统架构到容器化服务的演变
随着技术的快速发展,云计算已经从简单的虚拟化服务演进到了更加灵活和高效的云原生时代。本文将带你了解云原生的概念、优势以及如何通过容器化技术实现应用的快速部署和扩展。我们将以一个简单的Python Web应用为例,展示如何利用Docker容器进行打包和部署,进而探索Kubernetes如何管理这些容器,确保服务的高可用性和弹性伸缩。
|
1天前
|
弹性计算 负载均衡 安全
云端问道-Web应用上云经典架构方案教学
本文介绍了企业业务上云的经典架构设计,涵盖用户业务现状及挑战、阿里云业务托管架构设计、方案选型配置及业务初期低门槛使用等内容。通过详细分析现有架构的问题,提出了高可用、安全、可扩展的解决方案,并提供了按量付费的低成本选项,帮助企业在业务初期顺利上云。
|
1月前
|
消息中间件 前端开发 JavaScript
探索微前端架构:构建现代Web应用的新策略
本文探讨了微前端架构的概念、优势及实施策略,旨在解决传统单体应用难以快速迭代和团队协作的问题。微前端允许不同团队独立开发、部署应用的各部分,提升灵活性与可维护性。文中还讨论了技术栈灵活性、独立部署、团队自治等优势,并提出了定义清晰接口、使用Web组件、状态管理和样式隔离等实施策略。
|
1月前
|
负载均衡 前端开发 JavaScript
Nginx 代理多服务
以上是 Nginx 代理多服务的几种常见方式,在实际应用中,可以根据具体的业务需求和系统架构选择合适的代理方式,并结合其他 Nginx 的功能和配置来优化和完善系统的性能和功能。
|
1月前
|
Go UED
Go Web服务中如何优雅平滑重启?
在生产环境中,服务升级时如何确保不中断当前请求并应用新代码是一个挑战。本文介绍了如何使用 Go 语言的 `endless` 包实现服务的优雅重启,确保在不停止服务的情况下完成无缝升级。通过示例代码和测试步骤,详细展示了 `endless` 包的工作原理和实际应用。
47 3
|
1月前
|
JSON Go UED
Go Web服务中如何优雅关机?
在构建 Web 服务时,优雅关机是一个关键的技术点,它确保服务关闭时所有正在处理的请求都能顺利完成。本文通过一个简单的 Go 语言示例,展示了如何使用 Gin 框架实现优雅关机。通过捕获系统信号和使用 `http.Server` 的 `Shutdown` 方法,我们可以在服务关闭前等待所有请求处理完毕,从而提升用户体验,避免数据丢失或不一致。
25 1