学习Nginx前,建议大家至少拥有以下技能:
熟练使用vim编辑器
熟练使用Linux基础命令
熟练掌握网络知识
熟练掌握网络抓包工具及命令
Web服务/网站服务: 给用户提供网站功能的服务
本质实现http协议功能. 用户发出http请求, nginx处理,给用户 http响应
Nginx vs Apache 近10年全世界使用率
Nginx vs Apache 近10年全世界使用率
apache基于select模型 同步io模型
nginx基于epoll模型 异步io模型
举例一:小姐姐-找对象
同步:一个屋子一个屋子去找
异步:拿出名册,名册=名字+屋子号
举例二:幼儿园
同步:挨个小伙伴问,是否要wc
异步:需要上wc的来指定位置集合,高定时带这里面的内容去wc
特点:
企业面试时需要解答如下Nginx HTTP服务器的特色及优点
支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
资源消耗少:在3万并发连接下,开启10个Nginx线程消耗不到200MB内存。
可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的 haproxy 软件或lvs的功能
具备squid等专业缓存软件等的缓存功能。支持异步网络IO事件模型 epoll (Linux 2.6+)
核心功能:
web服务器/网站服务器
反向代理功能
负载均衡功能
缓存功能
其他功能 (安装nginx插件),例如:负载均衡监控检查功能、会话保持功能、直播推流功能、流量镜像功能
静态资源:一般指页面html,js,css,图片,视频,音频..静态资源Nginx可以自己处理
动态资源:一般指的是以.php.jsp.do结尾文件与用户交互,用户提交,下订单,评论,刷礼物...url中一般带有?或&特殊符号
Nginx学习手册 【配套PDF版资料】 免费领取,仅限前 200 名 拼手速的时间到了! 扫描上方二维码,备注【nginx手册】 第一时间发给你!!!
服务软件版本选择: 最新版,稳定版(stable version) 或长期维护版本(LTS部分软件或系统有)
#目前不用配置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
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; 指定首页文件 网站入口
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)实现简单动态或交互功能
人生重启项目展示
一个网站(一个虚拟主机), 就是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) 虚拟主机小结
详情请求图:
用户通过不存在的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 "别乱访问网站";}
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手册】 第一时间发给你!!!