Nginx使用

 

知识点

nginx的安装部署

nginx的相关配置文件

nginx的基本功能

nginx的虚拟主机

反向代理实现

如何实现下载限速

URL重写机制

nginx优化

 

课程目标

能够知道nginx的作用

能够知道nginx如何安装部署和设置

能够说出nginx有哪些基本功能

能够实现nginx的虚拟主机,下载限速

能够实现URL重写及优化

一 介绍

Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。和apache一样,都是web服务器软件,因为其性能优异,所以被广大运维喜欢。又因为nginx是一个轻量级的web服务器,相比apache来说资源消耗更低。

http://nginx.org 官网

 中文文档

 

为什么选择nginx

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:

作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。

nginx和apache对比

  1. 静态文件处理能力:nginx高于apache
  2. 资源消耗:nginx优于apache,因为nginx是异步处理模型,只需要几个进程就能够处理大量在线请求,而apache 2.4仍然是进程模型或者线程模型,即仍然采用大量线程来处理大量在线请求。
  3. Apache支持的模块很多,而且也比较稳定。而nginx由于出现的比较晚,所以在这方面可能比不上Apache。
  4. nginx本身就是一个反向代理服务器,而且支持7层负载均衡。
  5. nginx处理动态页面很鸡肋,一般只用与处理静态页面和反向代理。

 

二 nginx安装部署

 

1 nginx源码下载

官网:

源码包:nginx-1.15.12.tar.gz

源码包下载:wget  -P /usr/src

2 nginx安装

dnf -y install gcc pcre-devel zlib-devel make

cd /usr/src

tar xf nginx-1.15.12.tar.gz

cd nginx-1.15.12

./configure --prefix=/usr/local/nginx

配置目的:
1)检查环境 是否 满足安装条件 依赖解决
2)指定安装方式 配置文件 命令文件 各种文件放哪里 开启模块功能【内置模块 三方模块】
3)指定软件安装在那里

make -j4

make install

3 nginx相关目录

nginx path prefix: "/usr/local/nginx"

nginx binary file: "/usr/local/nginx/sbin/nginx"

nginx modules path: "/usr/local/nginx/modules"

nginx configuration prefix: "/usr/local/nginx/conf"

nginx configuration file: "/usr/local/nginx/conf/nginx.conf"

nginx pid file: "/usr/local/nginx/logs/nginx.pid"

nginx error log file: "/usr/local/nginx/logs/error.log"

nginx http access log file: "/usr/local/nginx/logs/access.log"

4 nginx启动管理

配置文件测试:/usr/local/nginx/sbin/nginx -t

Nginx启动:/usr/local/nginx/sbin/nginx

Nginx关闭:killall –s QUIT nginx

5 nginx测试

nginx安装完毕,接下来就可以启动nginx了,nginx启动后如何测试nginx的启动状态呢?可以通过以下三种方式去测试,这个可以根据自己的习惯选择一种测试就行了。

  • 使用netsata命令查看启动端口
    [root@zutuanxue ~]# netstat –ntpl
  • 使用losf命令查看启动端口
    [root@zutuanxue ~]# lsof -i :80
  • 使用文本浏览器访问nginx默认网站
    [root@zutuanxue ~]# elinks http://IP

测试页面内容如下

 

 

三 nginx配置文件

  • nginx配置文件详解
#启动子进程程序默认用户
#user  nobody;
#一个主进程和多个工作进程。工作进程是单进程的,且不需要特殊授权即可运行;这里定义的是工作进程数量
worker_processes  1;

#全局错误日志的位置及日志格式
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    #每个工作进程最大的并发数
    worker_connections  1024;
}


#http服务器设置
http {
    #设定mime类型,类型由mime.type文件定义
    include       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"';
    #$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
    #$remote_user:用来记录客户端用户名称;
    #$time_local: 用来记录访问时间与时区;
    #$request: 用来记录请求的url与http协议;
    #$status: 用来记录请求状态;成功是200,
    #$body_bytes_sent :记录发送给客户端文件主体内容大小;
    #$http_referer:用来记录从那个页面链接访问过来的;
    #$http_user_agent:记录客户浏览器的相关信息;

    #全局访问日志路径 
    #access_log  logs/access.log  main;
    #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    sendfile        on;

    #此选项可以减少网络报文段的数量
    #tcp_nopush     on;

    #长连接超时时间
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #开启压缩
    #gzip  on;

    #配置虚拟主机
    server {
        #虚拟主机使用的端口
        listen       80;
        #虚拟主机域名
        server_name  localhost;

        #虚拟主机支持的字符集
        #charset koi8-r;

        #虚拟主机的访问日志路径
        #access_log  logs/host.access.log  main;

        #定义web根路径
        location / {
            #根目录路径
            root   html;
            #索引页
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #

        #根据错误码 返回对应的页面
        error_page   500 502 503 504  /50x.html;

        #定义页面路径
        location = /50x.html {
            root   html;
        }

        #定义反向代理服务器 数据服务器是lamp模型
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}


        #定义PHP为本机服务的模型  
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #拒绝nginx DR目录及子目录下的.htaccess文件访问
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    #https的配置方案
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

 

 

四 默认网站及设置

 

1 默认网站

 

server {
    listen       80;

    server_name  localhost;

    location / {

        root   html;

        index  index.html index.htm;

        #支持目录浏览
         autoindex  on;

    }

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {

        root   html;

    }

}

2 访问控制

[root@localhost ~]# mkdir /usr/local/nginx/html/a
[root@localhost html]# vim /usr/local/nginx/conf/nginx.conf
location /a {
    autoindex on;
    deny 192.168.11.116;
    allow all;
    #基于客户端IP做过滤,符合条件的允许访问,不符合的禁止访问
    }
[root@localhost ~]# killall  -s HUP nginx

3 登陆验证

[root@localhost ~]# mkdir /usr/local/nginx/html/c
[root@localhost html]# vim /usr/local/nginx/conf/nginx.conf
location /c {
    auth_basic "登陆验证";
    auth_basic_user_file /etc/nginx/htpasswd;

}
[root@localhost ~]# killall  -s HUP nginx

4 日志管理

Nginx访问日志主要有两个参数控制

log_format #用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可)

access_log #用来指定日至文件的路径及使用的何种日志格式记录日志

access_log logs/access.log main;

log_format格式变量:
    $remote_addr  #记录访问网站的客户端地址
    $remote_user  #远程客户端用户名
    $time_local  #记录访问时间与时区
    $request  #用户的http请求起始行信息
    $status  #http状态码,记录请求返回的状态码,例如:200、301、404等
    $body_bytes_sent  #服务器发送给客户端的响应body字节数
    $http_referer  #记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置。
    $http_user_agent  #记录客户端访问信息,例如:浏览器、手机客户端等
    $http_x_forwarded_for  #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置

自定义一个json格式的访问日志

log_format main_json '{
        "@timestamp":"$time_local",
        "client_ip":"$remote_addr",
        "request":"$request",
        "status":"$status",
        "bytes":"$body_bytes_sent",
        "x_forwarded":"$http_x_forwarded_for",
        "referer":"$http_referer"
											}';
    access_log logs/access_json.log main_json;

#重新启动nginx服务查看访问日志
[root@localhost~]# tail -f /usr/local/nginx/logs/access_json.log

 

5 防盗链

[root@localhost html]# vim /usr/local/nginx/conf/nginx.conf
location / {
            root   html;
            index  index.html index.htm;
        }
        #定义访问资源为图片类型的
location ~* \.(gif|jpg|png|bmp)$ {
				#定义白名单	none代表直接访问的,blocked表示被防火墙标记过的请求最后一个是网址
           valid_referers none blocked *.baidu.com;
                 #如果不在白名单中则返回403
                 if ($invalid_referer) {
                        return 403;
                                        }
        }
[root@localhost ~]# killall  -s HUP nginx       
#在另外一台主机写一个盗链测试页面
dnf install httpd -y
vim /var/www/html/index.html
<html>
        <head>
                <title>ce shi</title>
                <body>
                        <a href="http://192.168.11.16/1.png">daolian</a>
                </body>
        </head>
</html>

systemctl restart httpd

 

 

五 虚拟主机

 

1 虚拟主机介绍

就是把一台物理服务器划分成多个“虚拟”的服务器,每一个虚拟主机都可以有独立的域名和独立的目录

同时发布两个网站:

DocumentRoot /usr/local/nginx/html/web1

DocumentRoot /usr/local/nginx/html/web2

2 基于IP的虚拟主机

应用场景:IP充足的环境

server {
    listen       192.168.11.251:80;
    location / {
        root   html/web1;
        index  index.html index.htm index.php;
    }
}
server {
    listen       192.168.11.252:80;
location / {
        root   html/web2;
        index  index.html index.htm;
    }
}

基于IP的虚拟主机特点

不同IP对应不同网站

访问方便,用户直接使用默认端口即可访问

服务器需要有多个IP地址(一个公网IP大概一年的费用是600左右)

维护方便,基于独立IP的站点,便于监控、维护。

3 基于端口的虚拟主机

#只需要一个IP

#缺点 端口你是无法告诉公网用户 无法适用于公网客户 适合内部用户

基于端口
server {
    listen       80;
    #server_name  www.abc.com;
    location / {
        root   html/web1;
        index  index.html index.htm index.php;
    }
}
server {
    listen       8080;
    #server_name  www.abc.com;
    location / {
        root   html/web2;
        index  index.html index.htm;
    }
}

基于端口的虚拟主机特点

不同端口对应不同网站

访问需要加端口

节省IP地址

适合私网运行

4 基于域名的虚拟主机

#一个网站必然有一个域名

基于域名
server {
    listen       80;
    server_name  web1.a.com;

    location / {
        root   html/web1;
        index  index.html index.htm index.php;

    }
}


server {
    listen       80;
    server_name  web2.b.com;

    location / {
        root   html/web2;
        index  index.html index.htm;
    }
}

基于域名的虚拟主机特点

不同域名对应不同网站

需要多个域名 可以是二级或三级域名

每个站点使用默认端口,方便用户访问

只需要一个IP地址,节约成本

适合公网环境

 

 

六 反向代理

 

1 代理介绍

代理在网络中使用是比较常见的,比如大家去国外网站查找学习资料的时候就会用到代理。其原理也比较简单:

1)用户将请求发给代理服务器

2)代理服务器代用户去访问数据

3)代理服务器将数据给用户

正常没有代理情况上网

 

 

 

代理服务器场景

 

 

 

代理服务器扮演的就是一个中间人的角色。

代理分为正向代理和反向代理两种类型:

正向代理:代理用户访问其他网站,比如ss,蓝灯。

反向代理:用来发布服务器,比如nginx

我们主要介绍的是反向代理,使用反向代理发布公司的站点。(国家严厉打击私单乱建FQ代理服务器)

2 应用场景

1)堡垒机:堡垒机承担所有的外部访问,保护后端服务器的安全

 

 

 

2)业务发布服务器:将多个服务器通过虚拟主机的方式发布到公网

 

 

 

3)缓存服务器:CDN加速

 

 

 

3 反向代理原理

1)客户端通过浏览器 发起请求 代理服务器

2)代理服务器 接受请求

3)代理服务器 发起请求 业务服务器

4)业务服务器 接受请求

5)业务服务器 处理请求

6)业务服务器 响应请求 代理服务器

7)代理服务器 响应请求 客户端

8)客户端通过浏览器渲染请求并展示给用户

4 反向代理实现

proxy_pass: nginx反向代理指令

反向代理实现

location / {
index index.php index.html index.htm; #定义首页索引文件的名称
proxy_pass http://mysvr ;#请求转向mysvr 定义的服务器列表
}

反向代理优化

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传

 

 

七 下载限速

 

1 限速介绍

在生产环境中,为了保护WEB服务器的安全,我们都会对用户的访问做出一些限制,保证服务器的安全及资源的合理分配。

限流(rate limiting)是NGINX众多特性中最有用的,也是经常容易被误解和错误配置的,特性之一访问请求限速。该特性可以限制某个用户在一个给定时间段内能够产生的HTTP请求数。请求可以简单到就是一个对于主页的GET请求或者一个登陆表格的POST请求。用于安全目的上,比如减慢暴力密码破解攻击。通过限制进来的请求速率,并且(结合日志)标记出目标URLs来帮助防范DDoS攻击。一般地说,限流是用在保护上游应用服务器不被在同一时刻的大量用户请求湮没

限速说的很笼统,其实限速分为很多种限速方法:

1)下载速度限速

2)单位时间内请求数限制

3)基于客户端的并发连接限速

nginx限速模块

Nginx官方版本限制IP的连接和并发分别有两个模块:

limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket"。

limit_req_conn 用来限制同一时间连接数,即并发限制。

2 应用场景

下载限速:限制下载速度及并发连接数,应用在下载服务器中,保护带宽及服务器的IO资源。

请求限速:限制单位时间内用户访问请求,防止恶意攻击,保护服务器及资源安全。

3 限速原理

漏桶原理

 

 

 

算法思想是:
    水(请求)从上方倒入水桶,从水桶下方流出(被处理);
    来不及流出的水存在水桶中(缓冲),以固定速率流出;
    水桶满后水溢出(丢弃)。
    这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃。
    相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的。

4 限速实现

1)单位时间内请求数限制

#基于IP对下载速率做限制  限制每秒处理1次请求,对突发超过5个以后的请求放入缓存区 
http {
    limit_req_zone $binary_remote_addr zone=test:10m rate=1r/s;
    server {
        location /abc {
            limit_req zone=test burst=5 nodelay;
        }
}
limit_req_zone $binary_remote_addr zone=test:10m rate=1r/s;
第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。
第二个参数:zone=test:10m表示生成一个大小为10M,名字为test的内存区域,用来存储访问的频次信息。
第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。

limit_req zone=test burst=5 nodelay;
第一个参数:zone=test 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。
第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。

重启nginx服务

测试机
[root@slave tmp]# for i in `seq 1 10`; do (wget http://192.168.11.16/abc/bigfile -P /tmp) & done
[root@slave tmp]# killall wget 会出现不同的状态,有的是以退出有的是已终止

2)限制并发连接数

#基于IP做连接限制  限制同一IP并发为1
limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
        listen       80;
        server_name  localhost;

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

        location /abc {
           limit_conn addr 1;
        }

    }

}
重启nginx服务

测试机
[root@slave tmp]# for i in `seq 1 10`; do (wget http://192.168.11.16/abc/bigfile -P /tmp) & done
#退出了9个只能开启一个

3)限制下载速度

下载速度为100k
server {
        listen       80;
        server_name  localhost;

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

        location /abc {
           limit_rate 100k;
        }

    }

}

重启nginx服务

测试机使用wget命令测试

4)综合案例

限制web服务器请求处理为1秒一个,触发值为5;

限制并发连接数为4;

限制下载速度为100.

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
#基于IP做连接限制  限制同一IP并发为1  下载速度为100K
limit_conn_zone $binary_remote_addr zone=addr:10m;
#基于IP对下载速率做限制  限制每秒处理1次请求,对突发超过5个以后的请求放入缓存区 
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        listen       80;
        server_name  localhost;

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

        location /abc {
           limit_req zone=one burst=5 nodelay;
           limit_conn addr 4;
           limit_rate 100k;
        }

    }

}

 

 

八 URL重写

 

1 URL重写介绍

和apache等web服务软件一样,rewrite的主要功能是实现URL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持。

Rewrite功功能是Nginx服务器提供的一个重要功能。几乎是所有的web产品必备技能,用于实现URL重写。URL重写是非常有用的功能,比如它可以在我们在改变网站结构后,不需要客户端修改原来的书签,也不需要其他网站修改对我们网站的友情链接,还可以在一定程度上提高网站的安全性,能够让我们的网站显得更专业。

2 应用场景

域名变更 (京东)

用户跳转 (从某个连接跳到另一个连接)

伪静态场景 (便于CDN缓存动态页面数据)

3 URL重写原理

 

 

 

4 URL重写

URL 模块语法

  • set 设置变量
  • if 负责语句中的判断
  • return 返回返回值或URL
  • break 终止后续的rewrite规则
  • rewrite 重定向URL

set指令 自定义变量

Syntax: set $variable value;

Default: —

Context: server, location, if

将http://www.a.com  重写为 http://www.a.com/hello
location / {
                set $name hello;
                rewrite ^(.*)$ http://www.a.com/$name;
        }
重启nginx服务
测试机打开浏览器可以看到页面跳转

if 指令 负责判断

Syntax: if (condition) { ... }

Default: —

Context: server, location

条件匹配

#模糊匹配 ~匹配 !~不匹配 ~* 不区分大小写的匹配

#精确匹配 = !=

location / {
                root html;
                index index.html index.htm;
                if ($http_user_agent ~* 'Firefox') {
                        return 403;
                }
        }
重启nginx
客户机打开火狐浏览器测试,看看能否看到403

return 指令 定义返回数据

Syntax: return code [text];

return code URL;

return URL;

Default: —

Context: server, location, if

location / {
                root html;
                index index.html index.htm;
                if ($http_user_agent ~* 'Firefox') {
                        return 403;
                }
        }

 

rewrite指令 实现重写url

rewrite [flag];

关键字 正则 替代内容 flag标记

flag:

  • last #本条规则匹配完成后,继续向下匹配新的location URI规则
  • break #本条规则匹配完成即终止,不再匹配后面的任何规则
  • redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
  • permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

permanent标志:永久重定向

域名跳转
www.a.com     重写为  www.b.com
server {
        listen        80;
        server_name www.a.com;
        location / {
            rewrite ^/$ http://www.b.com permanent;

          }
}

redirect标志:临时重定向

域名跳转
www.a.com     重写为  www.b.com
server {
        listen        80;
        server_name www.a.com;
        location / {
            rewrite ^/$ http://www.b.com redirect;

          }
}

break标志: 类似临时重定向

域名跳转
www.a.com     重写为  www.b.com
server {
        listen        80;
        server_name www.a.com;
        location / {
            rewrite ^/$ http://www.b.com break;

          }
}

last标志:

url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变

last 一般出现在server或if中

根据用户浏览器重写访问目录

如果是firefox浏览器  就将  
http://192.168.11.16/$URI
   重写为  
http://192.168.11.16/firefox/$URI

实现 步骤
1)URL重写
2)请求转给本机location



location / {
.....
if ($http_user_agent ~* 'firefox'){
          #^ 以什么开头 ^a
          #$ 以什么结尾 c$
          #. 除了回车以外的任意一个字符
          #* 前面的字符可以出现多次或者不出现
          #更多内容看正则表达式
          rewrite ^(.*)$ /firefox/$1 last;
          }


       location /firefox {
          root html ;
          index index.html;
        }
}
[root@localhost html]# pwd
/usr/local/nginx/html
[root@localhost html]# mkdir firefox
[root@localhost html]# echo firefox > firefox/index.html
[root@localhost html]# killall  nginx
[root@localhost html]# /usr/local/nginx/sbin/nginx 
客户机浏览器测试

 

 

 

九 nginx优化

 

1 并发优化

nginx工作模式:主进程+工作进程

启动工作进程数量
worker_processes  4;
#指定运行的核的编号,采用掩码的方式设置编号
worker_cpu_affinity   0001 0010 0100 1000;


events {
单个工作进程维护的请求队列长度
    worker_connections  1024;
}

2 长连接

减少服务器维护因为与客户端建立http连接产生的大量tcp三次握手四次断开的开销

keepalive_timeout  0;  0代表关闭
#keepalive_timeout  100;
#keepalive_requests 8192;

3 压缩

降低传输时间,增加用户体验度;降低公司带宽费用。

gzip  on;
gzip_proxied any;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 6;
gzip_types text/plain text/css application/x-javascript application/javascript application/xml;


# 开启gzip
    gzip off;

    # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
    gzip_min_length 1k;

    # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
    gzip_comp_level 1;

    # 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;

    # 是否在http header中添加Vary: Accept-Encoding,建议开启
    gzip_vary on;

    # 禁用IE 6 gzip
    gzip_disable "MSIE [1-6]\.";

    # 设置压缩所需要的缓冲区大小     
    gzip_buffers 32 4k;

    # 设置gzip压缩针对的HTTP协议版本
    gzip_http_version 1.0;

4 静态缓存

将部分数据缓存在用户本地磁盘,用户加载时,如果本地和服务器的数据一致,则从本地加载。提升用户访问速度,提升体验度。节省公司带宽成本。

expires指令:开启缓存并指定静态缓存时间

location ~*  \.(png|gif)$ {
              expires 1h;
         }

 

十 LNMP

介绍

说到LNMP,我们不得不提到LAMP,我们知道,LAMP是一个多C/S架构的平台,在此架构中web客户端基于TCP/IP通过http协议发起传送,这个请求可能是静态的也可能是动态的。所以web服务器通过发起请求的后缀来判断,如果是静态的就由web服务器自行处理,然后将资源发给客户端。如果是动态的web服务器会通过CGI(Common Gateway Interfence)协议发起给php。如果php以模块形式与web服务器联系,那么它们是通过内部共享内存的方式,如果php单独的一台服务器,那么它们是以sockets套接字的方式进行通信(这又是一个C/S架构),这时php会相应的执行一段程序,如果在程序执行时需要一些数据,那么php就会通过 mysql协议发送给mysql服务器(这也可以看作是一个C/S架构),由mysql服务器处理,将数据供给php程序。

 

LNMP

是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写。L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指PHP,也可以指Perl或Python。LNMP架构和LAMP架构挺像的,只不过一个用的Apache一个用的Nginx。LNMP就是Linux+Nginx+MySQL/mairadb+PHP,Nginx和Apache一样都是web服务器。还有一点不同的是在LNMP结构里php会启动一个php-fpm服务,而大多数时候LANP中的php只是作为Apache的一个模块存在(在CentOS8中LAMP架构也启动php-fpm服务)。

Nginx会把用户的动态页面请求交给php服务去处理,这个php服务就会去和数据库进行交互。用户的静态页面请求Nginx会直接处理,Nginx处理静态请求的速度要比apache快很多性能上要好,所以apache和Nginx在动态请求处理上区别不大,但如果是静态请求处理的话就会明显发现Nginx要快于apache,而且Nginx能承受的并发量要比apache大,可以承受好几万的并发量,所以大一些的网站都会使用Nginx作为web服务器。

 

 

 

动态页面和静态页面

静态网页:

(1)静态网页不能简单地理解成静止不动的网页,他主要指的是网页中没有程序代码,只有HTML(即:超文本标记语言),一般后缀为.html,.htm,或者.xml等。虽然静态网页的页面一旦做成,内容就不会再改变了。但是,静态网页也包括一些能动的部分,这些主要是一些GIF动画等

(2)静态网页的打开,用户可以直接双击,并且不管任何人任何时间打开的页面的内容都是不变的。

动态网页:

(1)动态网页是指跟静态网页相对的一种网页编程技术。动态网页的网页文件中除了HTML标记以外,还包括一些特定功能的程序代码,这些代码可以使得浏览器和服务器可以交互,所以服务器端根据客户的不同请求动态的生成网页内容。即:动态网页相对于静态网页来说,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。

(2)动态网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,只要是采用了动态网站技术(如PHP、ASP、JSP等)生成的网页都可以称为动态网页。

动态网页和静态网页的区别:

(1)更新和维护:

静态网页内容一经发布到网站服务器上,无论是否有用户访问,这些网页内容都是保存在网站服务器上的。如果要修改网页的内容,就必须修改其源代码,然后重新上传到服务器上。静态网页没有数据库的支持,当网站信息量很大的时候网页的制作和维护都很困难

动态网页可以根据不同的用户请求,时间或者环境的需求动态的生成不同的网页内容,并且动态网页一般以数据库技术为基础,可以大大降低网站维护的工作量

(2)交互性:

静态网页由于很多内容都是固定的,在功能方面有很大的限制,所以交互性较差

动态网页则可以实现更多的功能,如用户的登录、注册、查询等

(3)响应速度:

静态网页内容相对固定,容易被搜索引擎检索,且不需要连接数据库,因此响应速度较快

动态网页实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页,其中涉及到数据的连接访问和查询等一系列过程,所以响应速度相对较慢

(4)访问特点:

静态网页的每个网页都有一个固定的URL,且网页URL以.htm、.html、.shtml等常见形式为后缀,而不含有“?”,可以直接双击打开

动态网页中的“?”对搜索引擎检索存在一定的问题,搜索引擎一般不可能从一个网站的数据库中访问全部网页,或者出于技术方面的考虑,搜索之中不去抓取网址中“?”后面的内容,不能直接双击打开

 

综上所述

如果网页内容相对的简单,不需要频繁的进行改动,或者只是为了展示信息等,就用静态网页,简单易操作,不需要管理数据库等

如果网页内容相对复杂,功能多,改动频繁,实时性的内容多,就用动态网页

 

LNMP架构工作流程

 

 

 

  • 用户发送http请求到达http服务器
  • httpd解析URL获取需要的资源的路径,通过内核空间来读取硬盘资源,如果是静态资源,则构建响应报文发回给用户。
  • 如果是动态资源,将资源地址发送给php解析器,解析php程序文件,解析完毕将内容发回给httpd,httpd构建响应报文,发回给用户。
  • 如果涉及到数据库操作,则利用php-mysql驱动,获取数据库数据,返回给PHP解析器。

 

案例

利用LNMP+wordpress搭建博客网站

WordPress

一款使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统来使用。WordPress以上手简单、功能强大、扩展性与灵活性著称,加上开源免费,主题插件极其丰富,无论作为新手学习搭建个人博客,还是专业用户用于架设复杂的企业电商网站、论坛等,WP 都能完美满足需求。你几乎能用 WP 打造成任何类型的网站,只有想不到,没有做不到。而且全球数以亿计各类知名网站都是基于 WP 构建,根据官方统计,目前全球有 32% 的网站都由 WP 搭建,由于它实在太过流行,因此无论插件、主题、教程、文档等资源都极其丰富,你选都选不完。而且网上关于性能优化、问题解决等讨论也非常的全面。基本上学习建网站这事,您只需玩转 WP 就够了!所以,如果要建站或想尝试学习建站,那 WP 绝对值得你优先考虑。

wordpress官网:https://cn.wordpress.org打开可能会有问题 (429错误),可以去https://ww.wp.xz.cn下载软件包

环境介绍

一台安装CentOS8的主机

关闭SElinux和防火墙

配置好yum源

挂载光盘

可以联网

wordpress软件包下载地址:

 

流程

step1 部署LNMP架构

[root@client ~]# dnf -y install nginx php* mariadb-server mariadb -y

 

step2 设置php-fpm

[root@client ~]# vim /etc/php-fpm.d/www.conf 
user = nginx
group = nginx

#php-fpm服务默认以apache用户启动,将启动用户身份修改nginx

 

step3 启动服务

[root@client ~]# systemctl restart nginx.service php-fpm.service mariadb.service 

 

step4 生成php测试页面

[root@client ~]# echo "<?php phpinfo();?>" >> /usr/share/nginx/html/index.php
#系统自带的nginx的页面文件存放在/usr/share/nginx/html/目录中

 

step5 打开浏览器测试

 

 

 

 

step6 为数据库设置密码并创建相应的数据库

[root@client ~]# mysqladmin -u root password 123456
[root@client ~]# mysql -u root -p
Enter password: 

MariaDB [(none)]> create database wordpress charset=utf8;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> quit
Bye

 

step7 准备wordpress

[root@client ~]# cd /usr/share/nginx/html/
[root@client html]# rm -fr *
#####删除nginx自带的页面文件,以及刚才测试生成的php页面


[root@client ~]# unzip latest-zh_CN.zip 
[root@client ~]# cd wordpress/
[root@client wordpress]# mv * /usr/share/nginx/html/
####将wordpress文件移动到nginx页面文件存放的目录


[root@client wordpress]# cd /usr/share/nginx/html/
[root@client html]# chown -R nginx.nginx *
###文件的默认所有者是root,为了避免权限的问题,将所有者改为nginx

 

step8 安装wordpress

 

 

 

 

 

 

 

 

 

复制提示页面内容,按照要求手工创建wp-config.php文件并将内容粘贴
[root@client html]# vim /usr/share/nginx/html/wp-config.php

 

切换到安装页面点击现在安装

 

 

 

 

 

 

step9 登录与用户注册设置

 

 

 

 

 

 

 

 

 

 

开启用户注册功能

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发送测试邮件

注意:公网的邮箱需要在设置里开启SMTP/POP等功能,在按照提示操作就可以了

 

 

 

 

收到测试邮件之后,注销管理员账号,返回登录界面,选择注册

 

 

 

 

 

 

 

 

 

将邮件中的链接复制到浏览器中粘贴

 

 

 

 

 

 

 

 

 

 

如果想在其它主机可以直接访问而不需要修改URL的话

 

 

 

 

wordpress打开速度慢

有的时候wordpress访问的时候会非常慢,尤其是登录进入后台时,主要是因为wordpress应用了一些外部的资源,如google的资源;如果你的主机没有联网,那么打开的速度确实非常的慢,但有时,即便是联网也会由于无法访问这些外部资源导致速度慢,此时,可以在wordpress中搜索安装一个叫“WP Acceleration for China"的加速插件并启用,将这些无法访问的外部资源换成国内的相应资源。就可以解决访问慢的问题

 

总结

什么是nginx

它可以做什么

nginx有哪些优点和缺点

如何安装部署

配置文件的字段含义

nginx的基本使用

虚拟主机的使用

反向代理、限速

URL重写、优化

重点:nginx的安装部署,配置文件字段含义,基本功能的使用,虚拟主机的使用,如何实现反向代理,如何实现URL重写

难点:配置文件字段及格式,各种基本功能使用,虚拟主机如何去设置,反向代理如何去设置,如何实现URL重写
原文连接:https://zhuanlan.zhihu.com/p/423431832

posted @ 2021-11-02 15:04  招花  阅读(165)  评论(0编辑  收藏  举报