Nginx 实战手册,由浅入深,一套打通,初学者也可掌握

教育   2024-11-01 15:04   北京  

学习Nginx前,建议大家至少拥有以下技能:

  • 熟练使用vim编辑器

  • 熟练使用Linux基础命令

  • 熟练掌握网络知识

  • 熟练掌握网络抓包工具及命令

1

Nginx概述


  • Web服务/网站服务: 给用户提供网站功能的服务

  • 本质实现http协议功能.  用户发出http请求, nginx处理,给用户 http响应


Web服务/网站服务选择

Nginx vs Apache 近10年全世界使用率

Nginx vs Apache 近10年全世界使用率

Nginx vs Apache 近10年全世界使用率


Apache vs Nginx比较

apache基于select模型  同步io模型

nginx基于epoll模型   异步io模型


举例一:小姐姐-找对象

同步:一个屋子一个屋子去找

异步:拿出名册,名册=名字+屋子号


举例二:幼儿园

同步:挨个小伙伴问,是否要wc

异步:需要上wc的来指定位置集合,高定时带这里面的内容去wc


Nginx功能特点

特点:

企业面试时需要解答如下Nginx HTTP服务器的特色及优点

  • 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)

  • 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗不到200MB内存。

  • 可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的 haproxy 软件或lvs的功能

  • 具备squid等专业缓存软件等的缓存功能。支持异步网络IO事件模型 epoll (Linux 2.6+)


核心功能:

  • web服务器/网站服务器

  • 反向代理功能

  • 负载均衡功能

  • 缓存功能

  • 其他功能 (安装nginx插件),例如:负载均衡监控检查功能、会话保持功能、直播推流功能、流量镜像功能


静态vs动态

静态资源:一般指页面html,js,css,图片,视频,音频..静态资源Nginx可以自己处理

动态资源:一般指的是以.php.jsp.do结尾文件与用户交互,用户提交,下订单,评论,刷礼物...url中一般带有?或&特殊符号  


Nginx学习手册
【配套PDF版资料】
免费领取,仅限前 200 

拼手速的时间到了!
扫描上方二维码,备注【nginx手册】
第一时间发给你!!!

Nginx版本选择

服务软件版本选择: 最新版,稳定版(stable version) 或长期维护版本(LTS部分软件或系统有)

Nginx 1.20.1:


Nginx安装方式选择

Nginx yum源配置
#目前不用配置yum源可以安装 最新稳定版的nginx  #如果不行 配置yum源 [nginx-stable]name=nginx stable repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.keymodule_hotfixes=true[nginx-mainline]name=nginx mainline repobaseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/gpgcheck=1enabled=0gpgkey=https://nginx.org/keys/nginx_signing.keymodule_hotfixes=true


Nginx极速上手指南

a) install

#01. 安装nginxyum install -y nginx#02. 检查是否安装成功rpm -qa  |grep nginx 

b) Nginx目录 结构

提示:不同的Nginx安装方式Nginx目录结构略有不同,但整体一致,请小伙伴注意


[root@oldboy-web01 ~]# rpm -ql  nginx #日志切割/etc/logrotate.d/nginx#配置文件部分/etc/nginx/mime.types                 #nginx支持 媒体类型(文件类型)/etc/nginx/mime.types.default/etc/nginx/nginx.conf                 #主配置文件/etc/nginx/nginx.conf.default         #备份文件 /etc/nginx/uwsgi_params             #uwsgi  nginx与python搭配的配置 /etc/nginx/uwsgi_params.default/etc/nginx/fastcgi.conf              #nginx与php搭配的配置文件  nginx+php使用fastcgi/etc/nginx/fastcgi.conf.default/etc/nginx/fastcgi_params/etc/nginx/fastcgi_params.default#启动配置文件/usr/lib/systemd/system/nginx.service#nginx命令/usr/sbin/nginx#Nginx默认的站点目录 /usr/share/nginx/html//usr/share/nginx/html/404.html/usr/share/nginx/html/50x.html/usr/share/nginx/html/en-US/usr/share/nginx/html/icons/usr/share/nginx/html/icons/poweredby.png/usr/share/nginx/html/img/usr/share/nginx/html/index.html/usr/share/nginx/html/nginx-logo.png/usr/share/nginx/html/poweredby.png#日志目录/var/log/nginx/var/log/nginx/access.log/var/log/nginx/error.log 


c) nginx.conf

  • 核心内容(写在nginx配置开头)工具人进程用户 工具人进程数量

  • events区域 工具人进程连接数

  • http区域

      • 访问日志格式

      • 指定访问日志位置

      • include文件包含include /etc/nginx/conf.d/*.conf

      • server部分(未来server部分放在conf.f/xxxx.conf中)

        • listen 80; 监听端口

        • server_name  域名;  

        • root  网站站点目录(网站根目录)

        • location /    用来匹配uri   location / 默认规则 

        •      index     index.html;   指定首页文件  网站入口


第1个站点

a) 站点目录规划

开发书写代码放在网站的站点目录中(根目录)

#与网站相关放在一起 /app//app/code/       #代码 /app/code/live   #直播网站代码 /app/code/game   #游戏网站代码 /app/data/       #数据/app/tools/      #命令或工具 直接使用(解压后)/server/scripts/  #代码/server/tools/    #工具包 压缩mkdir   -p  /app/code/game

b) 游戏网站搭建

#环境准备mkdir   -p  /app/code/game  echo  game.oldboylinux.cn   > /app/code/game/index.html 修改nginx配置  #nginx.conf 里面不推荐存放server相关内容(网站)[root@web01 ~]# cat /etc/nginx/nginx.confuser nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid /run/nginx.pid;include /usr/share/nginx/modules/*.conf;events {    worker_connections 1024;}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;    tcp_nopush          on;    tcp_nodelay         on;    keepalive_timeout   65;    types_hash_max_size 4096;    include             /etc/nginx/mime.types;    default_type        application/octet-stream;    include /etc/nginx/conf.d/*.conf;}#子配置文件[root@web01 ~]# cat   /etc/nginx/conf.d/game.oldboylinux.cn.confserver {  listen 80;  server_name game.oldboylinux.cn;  root  /app/code/game;  location  / {  index index.html;   }  }#修改配置文件后,检查语法nginx  -tsystemctl start nginx  #如果已经启动 则 可以用 systemct reload nginx [root@web01 ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 ~][root@web01 ~]# systemctl start nginx [root@web01 ~]# systemctl reload  nginx #linux测试 [root@web01 ~]# curl 10.0.0.7game.oldboylinux.cn[root@web01 ~]# curl -v 10.0.0.7* About to connect() to 10.0.0.7 port 80 (#0)*   Trying 10.0.0.7...* Connected to 10.0.0.7 (10.0.0.7) port 80 (#0)> GET / HTTP/1.1> User-Agent: curl/7.29.0> Host: 10.0.0.7> Accept: */*> < HTTP/1.1 200 OK< Server: nginx/1.20.1< Date: Tue, 16 Nov 2021 07:20:06 GMT< Content-Type: text/html< Content-Length: 20< Last-Modified: Tue, 16 Nov 2021 07:19:17 GMT< Connection: keep-alive< ETag: "61935b75-14"< Accept-Ranges: bytes< game.oldboylinux.cn* Connection #0 to host 10.0.0.7 left intact

c) 浏览器测试-ip

d) 本地hosts解析-域名访问


多个代码在一起
[root@web01 /server/tools]# unzip  bird.zip  -d  /app/code/game/Archive:  bird.zip   creating: /app/code/game/bird/  inflating: /app/code/game/bird/2000.png    inflating: /app/code/game/bird/21.js    inflating: /app/code/game/bird/icon.png     creating: /app/code/game/bird/img/  inflating: /app/code/game/bird/img/bg1.jpg    inflating: /app/code/game/bird/img/bg2.jpg    inflating: /app/code/game/bird/img/number1.png    inflating: /app/code/game/bird/img/number2.png    inflating: /app/code/game/bird/img/s1.png    inflating: /app/code/game/bird/img/s2.png    inflating: /app/code/game/bird/index.html    inflating: /app/code/game/bird/sound1.mp3  unzip  mine.zip  -d  /app/code/game/unzip type-game.zip  -d /app/code/game/

html页面

html页面css样式(对其,排版),js(javascript)实现简单动态或交互功能

人生重启项目展示

2

Nginx初步使用


Ngx虚拟主机

一个网站(一个虚拟主机),  就是Nginx中的一个Server区域,apache 的一个virtualhost部分

1) 基于域名的虚拟主机

#生产建议:  1. 不同的虚拟主机的配置单独存放2. 虚拟主机配置推荐存放在conf.d下面  以.conf结尾 3. 对于不在使用的虚拟主机,修改.conf名字即可 gzip ---> www.conf.gz #生产环境问题及整改建议:1. Q1 目录结构  A1 统一目录结构 2. Q2 备份不行  A2 全网备份  ........


#01 修改配置文件 #game.oldboylinux.cn.confserver {  listen 80;  server_name game.oldboylinux.cn ;   root   /app/code/game;   location /  {    index index.html;  }}#[root@web01 /etc/nginx/conf.d]# cat game.oldboylinux.cn.conf server {  listen 80;  server_name game.oldboylinux.cn;  root  /app/code/game;  location  / {  index index.html;   }  }[root@web01 /etc/nginx/conf.d]# cat  live.oldboylinux.cn.conf server {  listen 80;  server_name live.oldboylinux.cn;  root  /app/code/live;  location  / {  index index.html;   }  }[root@web01 /etc/nginx/conf.d]# cat www.oldboylinux.cn.conf server {  listen 80;  server_name www.oldboylinux.cn;  root  /app/code/www;  location  / {  index index.html;   }  }[root@web01 /etc/nginx/conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 /etc/nginx/conf.d]# systemctl reload nginx  #02.站点目录及首页文件mkdir -p  /app/code/{game,live,www}for name in  game live wwwdo    echo $name.oldboylinux.cn   >/app/code/$name/index.htmldone[root@web01 /etc/nginx/conf.d]# head  /app/code/{game,live,www}/index.html==> /app/code/game/index.html <==game.oldboylinux.cn==> /app/code/live/index.html <==live.oldboylinux.cn==> /app/code/www/index.html <==www.oldboylinux.cn#03 测试 linux  ###修改http 请求报文内容[root@web01 /etc/nginx/conf.d]# curl  -H Host:live.oldboylinux.cn  10.0.0.7live.oldboylinux.cn[root@web01 /etc/nginx/conf.d]# curl  -H Host:www.oldboylinux.cn  10.0.0.7www.oldboylinux.cn[root@web01 /etc/nginx/conf.d]# curl  -H Host:game.oldboylinux.cn  10.0.0.7game.oldboylinux.cn#03 测试windows(hosts)10.0.0.7 game.oldboylinux.cn www.oldboylinux.cn  live.oldboylinux.cn

2) 基于端口的虚拟主机

应用场景

[root@web01 /etc/nginx/conf.d]# head  *.conf==> game.oldboylinux.cn.conf <==server {  listen 82;  server_name game.oldboylinux.cn;  root  /app/code/game;  location  / {  index index.html;   }  }==> live.oldboylinux.cn.conf <==server {  listen 81;  server_name live.oldboylinux.cn;  root  /app/code/live;  location  / {  index index.html;   }  }==> www.oldboylinux.cn.conf <==server {  listen 80;  server_name www.oldboylinux.cn;  root  /app/code/www;  location  / {  index index.html;   }  }[root@web01 /etc/nginx/conf.d][root@web01 /etc/nginx/conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 /etc/nginx/conf.d]# systemctl reload nginx [root@web01 /etc/nginx/conf.d][root@web01 /etc/nginx/conf.d][root@web01 /etc/nginx/conf.d][root@web01 /etc/nginx/conf.d]# curl  10.0.0.7:80www.oldboylinux.cn[root@web01 /etc/nginx/conf.d]# curl  10.0.0.7:81live.oldboylinux.cn[root@web01 /etc/nginx/conf.d]# curl  10.0.0.7:82game.oldboylinux.cn[root@web01 /etc/nginx/conf.d]# ss -lntup |grep nginx tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=47628,fd=6),("nginx",pid=30089,fd=6))tcp    LISTEN     0      128       *:81                    *:*                   users:(("nginx",pid=47628,fd=11),("nginx",pid=30089,fd=11))tcp    LISTEN     0      128       *:82                    *:*                   users:(("nginx",pid=47628,fd=10),("nginx",pid=30089,fd=10))[root@web01 /etc/nginx/conf.d]#

3) 基于ip的虚拟主机

限制用户只能通过某个网卡连接 与特殊端口一起使用

[root@web01 /etc/nginx/conf.d]# head game.oldboylinux.cn.conf server {  listen 172.16.1.7:8888;  server_name game.oldboylinux.cn;  root  /app/code/game;  location  / {  index index.html;   }  }[root@web01 /etc/nginx/conf.d]# curl 172.16.1.7:8888game.oldboylinux.cn[root@web01 /etc/nginx/conf.d]# curl 10.0.0.7:8888curl: (7) Failed connect to 10.0.0.7:8888; Connection refused

4) 虚拟主机小结


Ngx处理用户请求流程

详情请求图:

用户通过不存在的ip域名访问及处理

[root@web01 /etc/nginx/conf.d]# cat default.conf #default.confserver {  listen 80 default_server;  server_name _;  charset utf8;  default_type text/plain;  return 200 "别乱访问网站";}


Ngx日志
  • access.log 访问日志

  • error.log 错误日志

1) 访问日志

#定义访问日志格式    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';


10.0.0.1 - - [17/Nov/2021:12:39:44 +0800] "GET / HTTP/1.1" 200 18 "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=10.0.0.7&fenlei=256&rsv_pq=837c81ba000644fe&rsv_t=73f5U4HRgE5tqZHl0nibDhT9qrjVG2cNrxoIV1tINeKaCrqXnWoNNnlbe7c&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=3&rsv_sug1=2&rsv_sug7=100&rsv_btype=i&prefixsug=10.0.0.7&rsp=1&inputT=4317&rsv_sug4=4317" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36" "-"


#使用指定格式的日志及定义存放位置 


access_log off;  #关闭访问日志.

每个站点 配置独立的访问日志文件 存放在/var/log/nginx/


#01 关闭主配置文件中访问日志的位置 [root@web01 ~]# vim /etc/nginx/nginx.conf   # access_log  /var/log/nginx/access.log  main;#02 配置子配置文件 增加 access_log xxxx ;[root@web01 /etc/nginx/conf.d]# head *.conf ==> default.conf <==#default.confserver {  listen 80 default_server;  server_name _;  charset utf8;  default_type text/plain;  return 200 "别乱访问网站";  access_log /var/log/nginx/default.log  main;}==> game.oldboylinux.cn.conf <==server {  listen 172.16.1.7:8888;  server_name game.oldboylinux.cn;  root  /app/code/game;  access_log /var/log/nginx/game.oldboylinux.cn.log  main;  location  / {  index index.html;   }  }==> live.oldboylinux.cn.conf <==server {  listen 80;  server_name live.oldboylinux.cn;  root  /app/code/live;  access_log /var/log/nginx/live.oldboylinux.cn.log  main;  location  / {  index index.html;   }  }==> www.oldboylinux.cn.conf <==server {  listen 80;  server_name www.oldboylinux.cn;  root  /app/code/www;  access_log /var/log/nginx/www.oldboylinux.cn.log  main ;  location  / {  index index.html;   }  }#03 检查语法与重启nginx -t systemctl reload nginx  #或restart

2) 错误日志

#nginx 错误日志级别  error #服务报错才会记录. debug  #超级详细的日志#error_log /var/log/nginx/error.log error;[root@web01 /etc/nginx/conf.d]# head *.conf==> default.conf <==#default.confserver {  listen 80 default_server;  server_name _;  charset utf8;  default_type text/plain;  return 200 "别乱访问网站";  access_log /var/log/nginx/default-access.log  main;  error_log  /var/log/nginx/default-error.log error;}==> game.oldboylinux.cn.conf <==server {  listen 172.16.1.7:8888;  server_name game.oldboylinux.cn;  root  /app/code/game;  access_log /var/log/nginx/game.oldboylinux.cn-access.log  main;  error_log  /var/log/nginx/game.oldboylinux.cn-error.log error;  location  / {  index index.html;   }  }==> live.oldboylinux.cn.conf <==server {  listen 80;  server_name live.oldboylinux.cn;  root  /app/code/live;  access_log /var/log/nginx/live.oldboylinux.cn-access.log  main;  error_log  /var/log/nginx/live.oldboylinux.cn-error.log error;  location  / {  index index.html;   }  }==> www.oldboylinux.cn.conf <==server {  listen 80;  server_name www.oldboylinux.cn;  root  /app/code/www;  access_log /var/log/nginx/www.oldboylinux.cn-access.log  main ;  error_log  /var/log/nginx/www.oldboylinux.cn-error.log error;  location  / {  index index.html;   }  }

3) 日志切割

  • 防止单个日志过大.

  • 方案01:系统定时任务(每天)+logroate

  • 方法02:自己书写脚本,mv改名,重启服务, (sersync)

#日志切割  /var/log/messages  /var/log/secure  /var/log/cron  [root@web01 /var/log/nginx]# cat /etc/logrotate.d/syslog /var/log/cron/var/log/maillog/var/log/messages/var/log/secure/var/log/spooler{    missingok    sharedscripts    postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true    #重启系统日志服务 rsyslog     endscript}#日志切割  /var/log/nginx/xxxx.log [root@web01 /var/log/nginx]# cat  /etc/logrotate.d/nginx /var/log/nginx/*.log {    create 0640 nginx root    daily    rotate 10    missingok    notifempty    compress    delaycompress    sharedscripts    postrotate        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true    endscript}#logroate 命令 对应的配置文件 (日志切割的配置文件)[root@web01 /var/log/nginx]# cat  /etc/logrotate.d/nginx  /var/log/nginx/*.log {       #指定要切割哪些文件    create 0640 nginx root   #切割后的文件所有者权限信息      daily                    #每天切割              rotate 10                #保留10次 切割的日志      missingok                #如果日志不存在 不切割(跳过)    notifempty               #not if empty 如果日志是空的跳过不切割    compress                 #切割后的日志要进行压缩    delaycompress            #延迟压缩 延迟1次      sharedscripts            #开启切割后或切割前 执行脚本/命令功能功能    postrotate               #post切割之后执行什么命令.        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true    endscript}#根据对应的切割配置 执行切割 logroate -f  /etc/logrotate.d/nginx


Nginx学习手册
【配套PDF版资料】
免费领取,仅限前 200 

拼手速的时间到了!
扫描上方二维码,备注【nginx手册】
第一时间发给你!!!

老男孩Linux
专注于Linux高级运维、Python开发、大数据培训,为您分享行业前沿的技术,有效的学习方法和有价值的学习资料。
 最新文章