• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
孙龙 程序员
少时总觉为人易,华年方知立业难
博客园    首页    新随笔    联系   管理    订阅  订阅
nginx基础 安装和模块讲解

nginx基础

官网:http://nginx.org/

1为什么Nginx总体性能比 Apache 高?
Nginx 使用最新的 epoll(Linux2.6内核)和kqueue(freebsd)异步网络 I/O 模型,而 Apache 则使用的是传统的 select 模型目前 Linux下能够承受高并发访问的Squid、Memcached 软件都采用的是 epol 模型。
处理大量连接的读写,Apache所采用的select网络 I/O 模型比较低效。下面用两个通俗的的比喻来解释 Apache 采用的 select模型和 Nginx采用的 epoll 模型之间的区别。


第一个比喻:
select 版宿管大妈就会带着假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。你的朋友挨个房间去找,直到找到你为止。而epo版宿管大妈会先记下每位入住同学的房间号,你的朋友来找你时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满宿舍楼找人了如果同时来了100个人,都要找自己住这栋楼的同学时,select版和 epoll版宿管大妈,谁的效率更高,就很明显了。

第二个比喻:
select 的调用复杂度是线性的,即 O(n)。举个例子,一个保姆照看一群孩子,如果把孩子是否需要尿尿比作网络 I/O 事件,select的作用就好比这个保姆挨个询问每个孩子:你要尿尿吗?如果孩子回答是,保姆则把孩子领出来放到另外一个地方。当所有孩子询问完之后,保姆领着这些要尿尿的孩
子去上厕所(处理网络I/O事件)。
还是以保姆照看一群孩子为例,在epo!机制下,保姆不再需要挨个的询问每个孩子是否需要尿尿。取而代之的是,每个孩子如果自己需要尿尿的时候,自己主动的站到事先约定好的地方,而保姆的职责就是查看事先约定好的地方是否有孩子。如果有小孩,则领着孩子去上厕所(网络事件处理)因此,epoll 的这种机制,能够高效的处理成千上万的并发连接,而且性能不会随着连接数增加而下降太多。

 

nginx vs apache web服务
nginx处理请求(事务)模型是 epoll 异步模型
apache处理请求(事务)模型是select 同步模型

 Nginx 的重要特性

Nginx 在诞生之初的功能较弱,近几年各种功能特性逐渐增多并日趋成熟,很多大型网站也写了些功能模块并开源出来,这使得Nginx变得越来越强大了。Nginx具备如下基本特性:

  • 可针对静态资源高速高并发访问及缓存;
  • 可使用反向代理加速,并且可进行数据缓存
  • 具有简单负载均衡、节点健康检查和容错功能:
  • 支持远程 FastCGI服务的缓存加速;←
  • 支持 FastCGI、Uwsgi、SCGI、and Memcached Servers 的加速和缓存;
  • 支持 SSL、TLS、SNI:
  • 具有模块化的架构:过滤器包括 gzip 压缩、ranges 支持、chunked 响应、XSLT、SSI及图像缩放等功能。在SSI过滤器中,一个包含多个SSI的页面,如果经由FastCGI或反向代理处理,可被并行处理。

它所具备的其他 WWW 服务特性如下:

  • 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)资源消耗少:
  • 在3万并发连接下,开启10个Nginx线程消耗不到200MB内存。
  • 可以做 HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的haproxy软件或lvs的功能。
  • 具备squid 等专业缓存软件等的缓存功能。
  • 支持异步网络 IO 事件模型 epoll (Linux 2.6+)。

 

 

下载和安装

下载地址:http://nginx.org/en/download.html

 

sudo yum install yum-utils
vim /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

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

yum repolist

yum list |grep nginx

sudo yum-config-manager --enable nginx-mainline

sudo yum install nginx

 

 

 

nginx目录结构

 

 

systemctl start nginx
systemctl enable nginx
ss -lntup |grep nginx

 nginx配置文件:

 

 

如何查询nginx指令说明 
 

 

 nginx如何处理无法识别的域名:规则 

 

修改网站配置文件并访问

 nginx虚拟主机功能

 

server {
 listen 80;
 server_name game.oldboylinux.cn;
 location / {
   root /app/code/game;
   index index.html;
 }
}

server {
 listen 80;
 server_name video.oldboylinux.cn;
 location / {
   root /app/code/video;
   index index.html;
 }
}

server {
 listen 80; 
 server_name www.oldboylinux.cn;
 location / {
   root /app/code/www;
   index index.html;
 }
}

修改了windows修改hosts文件: 10.0.0.7 www.oldboylinux.cn game.oldboylinux.cn video.oldboylinux.cn
nginx -t
systemctl reload nginx

 
b) 基于端口的虚拟主机
server {
 listen 8888;
 server_name game.oldboylinux.cn;
 location / {
   root /app/code/game;
   index index.html;
 }
}
基于ip的虚拟主机

 

[root@web01 /etc/nginx/conf.d]# cat 
game.oldboylinux.cn.conf 
server {
 listen 172.16.1.7:8848;  #web01的ip地址.
 server_name game.oldboylinux.cn;
 location / {
   root /app/code/game;
   index index.html;
 }
}
[root@web01 /etc/nginx/conf.d]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf 
syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test 
is successful
[root@web01 /etc/nginx/conf.d]# systemctl reload 
nginx 
[root@web01 /etc/nginx/conf.d]# ss -lntup |grep nginx 

16 tcp   LISTEN     0      128    172.16.1.7:8848     
            *:*                   users:
(("nginx",pid=3558,fd=11),("nginx",pid=1466,fd=11))
17 tcp   LISTEN     0      128       *:80             
      *:*                   users:
(("nginx",pid=3558,fd=6),("nginx",pid=1466,fd=6))

 Ngx处理用户请求流程

 

核心模块:

查询当前nginx已经开启模块
[root@web01 ~]# nginx -V   查看nginx编译参数
./configure参数,间接告诉我们nginx模块.
nginx version: nginx/1.20.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled

 

核心模块

 

nginx日志功能

日志概述
access.log 访问日志.
error.log 错误日志.

 

访问日志指令
a) log_format定义格式 
log_format 
 
Syntax(语法): 
log_format 格式名字 string要求的格式
Default(默认): 
 Log_format combined

#不推荐默认的格式,内容少。

Context(放哪): 
http 只能在http{}里面. 

 

 

b) access_log指定日志
access_log指令 
 
语法: 
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off; 
默认值: 
access_log logs/access.log combined; 
放哪: 
http , server , location , if in location , limit_except 

方法01 : 关闭访问日志. access_log off; 内部使用,检查nginx状态.
方法02 : 对于用户访问,开启日志. access_log 路径/名字 格式名字;

 

[root@web01 /etc/nginx/conf.d]# cat 
www.oldboylinux.cn.conf 
server {
 listen 80; 
 server_name www.oldboylinux.cn;
 access_log /var/log/nginx/www.oldboylinux.cnaccess.log main buffer=128k flush=5s;
 location / {
   root /app/code/www;
   index index.html;
 }
}
c) 案例-每个网站都设置自己的访问日志.
[root@web01 /etc/nginx/conf.d]# cat 
www.oldboylinux.cn.conf 
server {
 listen 80; 
 server_name www.oldboylinux.cn;
 access_log /var/log/nginx/www.oldboylinux.cnaccess.log main ;
 location / {
   root /app/code/www;
   index index.html;
 }
}


[root@web01 /etc/nginx/conf.d]# cat 
game.oldboylinux.cn.conf 
server {
 listen 80; 
 server_name game.oldboylinux.cn;
 access_log /var/log/nginx/game.oldboylinux.cnaccess.log main ;
 location / {
   root /app/code/game;
   index index.html;
 }
}
[root@web01 /etc/nginx/conf.d]# cat 
video.oldboylinux.cn.conf 
server {
 listen 80; 
 server_name video.oldboylinux.cn;
 access_log /var/log/nginx/video.oldboylinux.cnaccess.log main ;
 location / {
   root /app/code/video;
   index index.html;
 }
}
nginx -t
systemctl reload nginx
3) 错误日志 
a) 概述与格式

 

左边是最详细的.                             右边的简略的.
debug, info, notice, warn, error, crit, alert,emerg. 

 

每个网站有这自己独立的错误日志即可.
error_log   /var/log/nginx/www.oldboylinux.cnerror.log notice;
b) 案例-错误日志也按照域名分开存放. 
[root@web01 /etc/nginx/conf.d]# cat 
www.oldboylinux.cn.conf 

server {
 listen 80; 
 server_name www.oldboylinux.cn;
 access_log /var/log/nginx/www.oldboylinux.cn￾access.log main ;
 error_log   /var/log/nginx/www.oldboylinux.cn￾error.log notice;
 location / {
   root /app/code/www;
   index index.html;
 }
}

[root@web01 /etc/nginx/conf.d]# cat 
game.oldboylinux.cn.conf 

server {
 listen 80; 
 server_name game.oldboylinux.cn;
 access_log /var/log/nginx/game.oldboylinux.cn￾access.log main ;
 error_log   /var/log/nginx/game.oldboylinux.cn￾error.log notice;
 location / {
   root /app/code/game;
   index index.html;
 }
}

[root@web01 /etc/nginx/conf.d]# cat 
video.oldboylinux.cn.conf 
server {
 listen 80; 
 server_name video.oldboylinux.cn;
 access_log /var/log/nginx/video.oldboylinux.cnaccess.log main ;
 error_log   /var/log/nginx/video.oldboylinux.cnerror.log notice;
 location / {
   root /app/code/video;
   index index.html;
 }
}
nginx -t
systemctl reload nginx
4) 日志切割
  1. 防止单个日志过大而定期对文件切割.
  2. 方法01:通过系统配置即可logrotate命令+定时任务.
  3. 方法02:手动mv日志,重启服务+定时任务.

 logrotate 是一个 Bash 的 SHELL 脚本,可对日志文件进行切分,并将切分后的日志放在统一目录。

 

目录列表模块

 

 

3) 实战 
[root@web01 /etc/nginx/conf.d]# cat 
dl.oldboylinux.cn.conf 
server {
 listen 80;
 server_name dl.oldboylinux.cn;
 root /app/code/dl;
 access_log /var/log/nginx/dl.oldboylinux.cnaccess.log main;
 error_log /var/log/nginx/dl.oldboylinux.cnerror.log notice;
 autoindex on;
 autoindex_localtime on;
  
 location / {
   index index.html;
  }
}

 

 

Ngx状态模块

server {
 listen 80;
 server_name status.oldboylinux.cn;
  #allow 172.16.1.0/24;
  #deny all;
 stub_status;
}

Active connections: 65
server accepts handled requests
190 190 2626
Reading: 0 Writing: 1 Waiting: 64

 访问限制-alow-deny

ngx_http_access_module

访问限制模块

  • allow准许 某个ip或网段访问
  • deny 拒绝

 

server {
 listen 80;
 server_name dl.oldboylinux.cn;
 root /app/code/dl;
 access_log /var/log/nginx/dl.oldboylinux.cnaccess.log main;
 error_log /var/log/nginx/dl.oldboylinux.cnerror.log notice;
  #网站列表功能
 autoindex on;
 autoindex_localtime on;
  #网站认证功能
  #auth_basic "input password";
  #auth_basic_user_file /etc/nginx/key/pass;
  #屏蔽某个ip地址
  #deny 10.0.0.1;
  #屏蔽网段
 deny 10.0.0.0/24;
 location / {
   index index.html;
 }
}
b)白名单:默认是拒绝
  • allow 10.0.0.1;
  • allow 172.16.1.0/24;
  • deny all; #拒绝所有.
server {
 listen 80;
 server_name dl.oldboylinux.cn;
 root /app/code/dl;
 access_log /var/log/nginx/dl.oldboylinux.cnaccess.log main;
 error_log /var/log/nginx/dl.oldboylinux.cnerror.log notice;
  #网站列表功能
 autoindex on;
 autoindex_localtime on;
  #网站认证功能
  #auth_basic "input password";
  #auth_basic_user_file /etc/nginx/key/pass;
  #黑名单
  #屏蔽某个ip地址
  #deny 10.0.0.1;
  #屏蔽网段
  #deny 10.0.0.0/24;
  #白名单
 allow 10.0.0.1;
 allow 172.16.1.0/24;
 deny all; 
  
 location / {
   index index.html;
 }

 

认证功能模块:
auth_basic模块

 

1.创建密码文件
htpasswd 生成密码文件
yum install httpd-tools

a) 添加及创建密码文件
[root@web01 /etc/nginx/conf.d]# htpasswd -bc   /etc/nginx/key/pass oldboy 1 
#Adding password for user oldboy

b) 增加用户
[root@web01 /etc/nginx/conf.d]# htpasswd -b   /etc/nginx/key/pass lidao 1
Adding password for user lidao

[root@web01 /etc/nginx/conf.d]# cat /etc/nginx/key/pass
oldboy:$apr1$QfnPt6V.$yPoX0tfzBhhoOoZaOS.fU1
lidao:$apr1$VCseQ.WK$87O9KzY/.19nCUZAZtnIF.

c) 修改密码文件权限600 
[root@web01 /etc/nginx/conf.d]# chmod 600 /etc/nginx/key/pass 
[root@web01 /etc/nginx/conf.d]# ll 
/etc/nginx/key/pass
-rw------- 1 root root 89 Apr 20 12:23 
/etc/nginx/key/pass

2. 修改配置文件.
[root@web01 /etc/nginx/conf.d]# cat 

server {
     listen 80;
     server_name dl.oldboylinux.cn;
     root /app/code/dl;
     access_log /var/log/nginx/dl.oldboylinux.cn access.log main;
     error_log /var/log/nginx/dl.oldboylinux.cn error.log notice;
      #网站列表功能
     autoindex on;
     autoindex_localtime on;
      #网站认证功能
     auth_basic "input password";
     auth_basic_user_file /etc/nginx/key/pass;
      
     location / {
       index index.html;
     }
 }

 

给网站或某个uri增加认证功能 
进阶版本:仅对于ssssvip-si目录进行认证.
[root@web01 /etc/nginx/conf.d]# cat 
dl.oldboylinux.cn.conf 
server {
 listen 80;
 server_name dl.oldboylinux.cn;
 root /app/code/dl;
 access_log /var/log/nginx/dl.oldboylinux.cn access.log main;
 error_log /var/log/nginx/dl.oldboylinux.cn error.log notice;

  #网站列表功能
 autoindex on;
 autoindex_localtime on;
 #网站认证功能

 location / {
   index index.html;
 }

 location /ssssvip-si {              #这个配置是,只有用户访问/ssssvip-si uri的时候才会提示认证.
     auth_basic "input password";
     auth_basic_user_file /etc/nginx/key/pass
 }
}

各种限制模块

  • ·limit_req 模块 限制请求(http)
  • ·limit_conn 模块 限制连接(tcp)
  • limit_rate core模块 限速速度
  • 。请求的限制

limit_req 请求限制模块

 

 

http {
    1imit_req_zone $binary_remote_addr zone=one:l0m rate=lr/s;
    #$binaryIremote_addr 用户ip地址, 占用空间更少
    #zone=one:10m 指定空间名字:大小
    #rate=lr/s 指定木桶处理速度
}
#补充:客户端IP地址用作密钥。请注意,这里使用的不是$remote_addr,而是$binary_remote_addr变量。$binary_remote_addr变量的大小对于IPV4地址总是4字节,对于IPV6地址总是16字节

 

limit_req zone=one burst=5;
zone=one  #指定limit_req_zone 创建的木桶空间
burst=5#并发5

limit_reg_zone $binary_remote_addr zone=one:10m rate=1r/s,
server {
 location /search/ {
     limit_reg zone=one burst=5,
 }
 ......
}

# allow not more than l request per second at an average, with bursts notexceeding 5 requests.
#平均每秒允许不超过1个请求,突发请求不超过5个。

limit_reg_zone $binary_remote_addr zone=one:10m rate=1r/s,
server {
 location /search/ {
     limit_reg zone=one burst=5 nodelay,
 }
 ......
}

#nodelay #默认不加上nodelay,超过并发数后,排队(delay) #nodelay超过并发数后,报错

limit_conn 连接数限制模块

ngx_http_limit_conn模块用于限制每个已定义密钥的连接数,特别是来自单个IP地址的连接数。并非所有连接都被计算在内。只有当一个连接有一个正在由服务器处理的请求并且整个请求头已经被读取时,它才会被计数。

 

 3)limit rate 速率限制

  • limit_rate 限速 I
  • ·limit_rate_after 下载多少文件后再进行限速

 

 官网更多模块讲解:http://nginx.org/en/docs/

 

本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/18199538

posted on 2024-05-18 17:27  孙龙-程序员  阅读(22)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3