nginx基础01

nginx

网络IO模型

同步 (关注的是消息通知机制)

nginx用户进程发指令给内核,内核需要获取一些资源返回给nginx,nginx需要等待内核返回消息,啥也干不了

异步

nginx用户进程发指令给内核,内核需要获取一些资源返回给nginx,内核会主动通知运行状态

阻塞 (关注的是nginx在等待内核通知之前所处的状态)

在内核返回结果之前,nginx被挂起停用

非阻塞

在内核返回结果的过程中,nginx可以去处理别的请求,直到内核通知去处理

同步阻塞

nginx下发请求后,一直等待

同步非阻塞

下发请求后,可以去处理别的情况,还是不是去看状态

异步阻塞

下发请求后,还是在旁边等着,内核会主动通知

异步非阻塞

下发请求后,可以去处理别的请求,内核会主动通知处理结果

nginx

就是一个web服务器

nginx优势

    1.高性能,近w个连接请求时,他的响应要比其他的web要快。

    2.高扩展性:nginx功能模块化。官方提供了很多的优秀模块。

    3.高可靠性:9999  99999 (宕机时间)

    4.热部署:不停止服务的情况下进行升级。 

    5.互联网公司都选择Nginx  代理、缓存、负载均衡、静态资源处理、动静分离、LNMP、LNMT、LNMG 架构。

nginx应用场景

web服务

负载均衡

代理缓存

安全服务 Https Lua

动静分离

静态资源服务

nginx基本组件

nginx二进制可执行文件 nginx的主体构成

nginx.conf配置文件 主要用来控制软件的行为

nginx access 日志 分析用户访问相关数据

nginx error 日志 用来分析运行过程中的错误

nginx配置文件

cat /etc/nginx/nginx.conf

全局配置

user  nginx;            (nginx进程是哪个用户来运行)

worker_processes  1;      (启动了多少个work进程)

error_log  /var/log/nginx/error.log warn;  (错误日志的存放位置)

pid        /var/run/nginx.pid;       (每个进程运行起来的都会存在一个pid文件,里面存放的是该进程的ID)

事件驱动模型

events {

worker_connections  1024; (worker接收的连接数)

}

http模型

http {

include       /etc/nginx/mime.types;

default_type  application/octet-stream;  (当nignx无法识别一个文件,默认已访问就下载)

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;   (nginx操作日志)

sendfile        on;

#tcp_nopush     on;

keepalive_timeout  65;         (长链接)

#gzip  on;       

include /etc/nginx/conf.d/*.conf;       (包含所有.conf的文件)

}

cat /etc/nginx/conf.d/default.conf
server { (serve表示配置网站,每一个{}代表一个网站,简称虚拟主机)
listen 80; (监听端口)
server_name localhost; (网站的域名)

#charset koi8-r;
#access_log  /var/log/nginx/host.access.log  main;

location / {          (控制网站访问的路径)
    root   /usr/share/nginx/html;  (定义网站源代码的存放位置)
    index  index.html index.htm;        (默认访问哪个文件作为默认返回页)
}

包含关系
http {

   server {

            location {

}

}

}

nginx中的http、server、 location之间的关系是?

http:主要用来解决用户的请求和响应。

server:主要用来响应具体的某一个网站。

location:用于匹配网站的uri路径。

在本地自己做一个游戏网页

vim /etc/nginx/conf.d/文件名.conf

server{
        listen 80;

        server_name game.sang.com;

        location / {
                
                    root /code;

                    index index.html;

}

}

}

创建 code目录

把代码包上传到code目录下

nginx -t 检查语法

windows电脑 点击C盘/Windows/system32/drives/etc/hosts

把 IP地址 域名 (10.0.0.7 game.sang.com 写上保存)

重启 systemctl restart nginx

nginx访问网站的原理(详细过程)

第一步:浏览器请求  game.oldxu.com 

第二步:浏览会将请求的 game.oldxu.com   -->  http://game.oldxu.com/

第三步:浏览器对 域名进行解析    DNS解析  ( 我们域名是假的,所以,我们配置 hosts 劫持 )

第四步:浏览器通过随机端口,像服务端 80 端口建立TCP连接

第五步:浏览器发起HTTP的请求

第六步:请求被80端口对应的Nginx应用所接受,会交给http层,发现请求的域名是  game.oldxu.com 

第七步:接下来检查所有配文件,看是否有配置文件 满足用户请求的域名。   server_name 

第八步:满足域名匹配之后,检查用户 请求的路径,   /    就会被location /   所匹配

第九步:返回结果,/code下面的index.html 给用户

第十步:nginx应用程序像内核发送请求,获取磁盘中的某个文件,磁盘将数据拷贝至内核的缓存区,然后在 拷贝到nginx应用进程的缓存区

第十一步:nginx应用进程封装数据报文,回传给客户端浏览器。

DAY 02

第一部分 基于多个IP实现方式 (很少)

[root@web01 ~]# cat /etc/nginx/conf.d/ip.conf

server {
listen 10.0.0.7:80;

    location / {
            root /ip1;
            index index.html; (返回 hello 10.7)
    }

}

server {
listen 172.16.1.7:80;

    location / {
            root /ip2;
            index index.html; (返回 hello 172.7)
    }

}

基于不同的端口方式 (测试)

[root@web01 ~]# cat /etc/nginx/conf.d/port.conf
server {
listen 8081;

location / {
    root /port1;
    index index.html; (8081)
}

}

server {
listen 8082;

location / {
    root /port2;
    index index.html; (8082)
}

}

基于不同的域名方式 (生产,实际生产都是一个域名对应一个文件,这样能够清晰找到对应的配置))

[root@web01 ~]# cat /etc/nginx/conf.d/all.oldxu.com.conf

server {
listen 80;
server_name docs.oldxu.com;

location / {
    root /docs;
    index index.html;
}

}

server {
listen 80;
server_name test.oldxu.com;

location / {
    root /test;
    index index.html;
}

}

记得配置域名解析(我们由于是假的域名,所以配置DNS劫持即可)

nginx模块

第二部分 阿里云镜像源站点搭建操作

[root@web01 mirror]# cat /etc/nginx/conf.d/mirror.oldxu.com.conf

server {

listen 80;

server_name mirror.oldxu.com;

charset utf-8;

root /mirror;

#跳转主页

location / {

    index index.html;
}

#提供yum源的仓库

location /repo {

    autoindex on;

    autoindex_exact_size off;

    autoindex_localtime on;

}

}

同步源至本地

[root@web01 mirror]# rsync -avz rsync://rsync.mirrors.ustc.edu.cn/repo/centos/ /mirror/repo/

第三部分 访问控制

基于来源IP实现访问控制

allow 10.0.0.7/24; (允许10.0.0.7访问)

deny 10.0.0.7/24;  (禁止10.0.0.7访问)

默认情况从第一条规则开始匹配

如果匹配成功,检查规则是允许还是拒绝,但不在继续匹配下面的内容

如果匹配不成功,则继续往下匹配

基于用户名和密码的访问控制

准备一个密码文件 touch /etc/nginx/auth_pass

yum install httpd-tools -y

htpasswd -cb /etc/nginx/auth_pass sang 123456

server {
listen 80;
server_name mirror.oldxu.com;
charset utf-8;
root /mirror;

location / {
    index index.html;
}

location /repo {
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;

auth_basic "hello";
auth_basic_user_file  "/etc/nginx/auth_pass";
}

}

第四部分 nginx限流限速

[root@web01 mirror]# vim /etc/nginx/conf.d/limit.sang.com.conf

请求限制:定义了一个10m内存空间,名称叫req_one 限制的速率是 每S 1个请求,针对的来源的IP地址

limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;

连接限制: 定义了一个10m内存空间,名称叫conn_od,针对的是来源的IP

limit_conn_zone $binary_remote_addr zone=conn_od:10m;

server {

listen 80;

server_name  limit.sang.com;

charset utf-8;   (避免出现乱码)

limit_req zone=req_one burst=5 nodelay; (5个请求限制)

limit_conn  conn_od 2; (2个连接限制)

limit_rate_after 100m; (先让其最快速下载100m,然后开始限速)

limit_rate 200k;   (限速)

location / {

    root /limit;         (如果没有 需要自己建目录)

    index index.html;
}

error_page 503 @err; (如果同时下载超过2个视频,会出现503错误,那么我们把503改成提示 "请联系oldxu进行会员充值"。)

location @err {       (@err是一个特殊的重定向)  

    default_type text/html;

    return 200 '请联系oldxu充值,联系qq:552408925';
}

}

注:在server层上面写

下载限制 使用nginx ngx_http_core_module

请求限制 使用nginx ngx_http_limit_req_module

连接限制 使用nginx ngx_http_limit_conn_module

总结 综合案例

[root@web01 mirror]# vim /etc/nginx/conf.d/mirror.oldxu.com.conf

limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;

limit_conn_zone $binary_remote_addr zone=conn_od:10m;

server {

listen 80;

server_name mirror.sang.com;

charset utf-8;

root /mirror;

limit_req zone=req_one burst=5 nodelay; (5个请求限制)

limit_conn  conn_od 2; (2个连接限制)

limit_rate_after 100m; (先让其最快速下载100m,然后开始限速)

limit_rate 200k;   (限速)


location / {             

    index index.html; (a标签 跳转主页)
}

location /repo {                 (提供yum源的仓库)

    autoindex on;  (以目录结构显示)

    autoindex_exact_size off;

    autoindex_localtime on;

    auth_basic "hello";
    
    auth_basic_user_file  "/etc/nginx/auth_pass"; (登录网站的时候需要用户名密码)

}

error_page 503 @err; (如果同时下载超过2个视频,会出现503错误,那么我们把503改成提示 "请联系oldxu进行会员充值"。)

location @err {       (@err是一个特殊的重定向)  

    default_type text/html;

    return 200 '请联系oldxu充值,联系qq:552408925';
}

}

stub_status模块

location /status {  

stub_status 

}

访问game.sang.com/status

Active connections: 2 

server accepts handled requests

3 3 17 

Reading: 0 Writing: 1 Waiting: 1 

状态 含义

Active connections 当前活跃连接数,包括Waiting等待连接数。

accepts 已接收的总TCP连接数量。

handled 已处理的TCP连接数量。

requests 当前总http请求数量。

Reading 当前读取的请求头数量。

Writing 当前响应的请求头数量。

Waiting 当前等待请求的空闲客户端连接数

Location匹配

location匹配规则

匹配符 匹配规则 优先级

=     精确匹配                 1            必须是百分百匹配才行

^~    以某个字符串开头           2

~     区分大小写的正则匹配        3

~*    不区分大小写的正则匹配       4

/     通用匹配,任何请求都会匹配到   5

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,
the “/documents/1.jpg” request will match configuration E.

[root@web01 conf.d]# cat location2.oldxu.com.conf

server {
listen 80;

server_name location2.oldxu.com;

# 通用匹配,任何请求都会匹配到
location / {

    root html;

    index index.html;
}

# 精准匹配,必须请求的uri是/nginx_status

location = /nginx_status {

    stub_status;
}

# 严格区分大小写,匹配以.php结尾的都走这个location            

location ~ \.php$ {

    default_type text/html;

    return 200 'php访问成功';
}

# 严格区分大小写,匹配以.jsp结尾的都走这个location 

location ~ \.jsp$ {

    default_type text/html;

    return 200 'jsp访问成功';
}

# 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location

location ~* \.(jpg|gif|png|js|css)$ {

    return 403;
}

# 不区分大小写匹配

location ~* \.(sql|bak|tgz|tar.gz|.git)$ {

    deny all;
}

}

location @ 内部重定向

error_page 404 403 401 @err;

location @err {

      default_type text/html;

     return 200 '你可能是不小心走丢了。';

}

nginx 日志

log_format: 定义日志格式:

关键字   变量
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 # 记录通用的本地时间time_iso8601 # 记录ISO8601标准格式下的本地时间
request # 记录请求的方法以及请求的http协议status # 记录请求状态码(用于定位错误信息)
body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小bytes_sent # 发送给客户端的总字节数
msec # 日志写入时间。单位为秒,精度是毫秒。http_referer # 记录从哪个页面链接访问过来的
http_user_agent # 记录客户端浏览器相关信息http_x_forwarded_for #记录客户端IP地址
request_length # 请求的长度(包括请求行, 请求头和请求正文)。request_time # 请求花费的时间,单位为秒,精度毫秒

access_log 可以定义在 http、server、location?

每一个server都会定义一个access_log。为了区分网站的访问记录


http {
    access_log   /var/log/nginx/access.log main;
    server {
        # access_log /var/log/nginx/log.oldxu.com.log main;
    }


    #如果某个网站不想记录日志,则可以通过如下两种方式去实现?
    server {
        access_log off;
        #access_log /dev/null;
    }
}

error_log:错误日志
error_log /var/log/nginx/error.log warn; #几乎是所有Nginx统一的一个位置。(全局,作用于所有的网站)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341