zutuanxue.com-nginx与LNMP

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 官网

http://www.nginx.cn/doc/index.html 中文文档

为什么选择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源码下载

官网:http://nginx.org/

源码包:nginx-1.15.12.tar.gz

源码包下载:wget http://nginx.org/download/nginx-1.15.12.tar.gz -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

测试页面内容如下

zutuanxue.com-nginx与LNMP_第1张图片

三 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

        
                ce shi<<span class="token operator">/</span>title>
                <body>
                        <a href=<span class="token string">"http://192.168.11.16/1.png"</span>>daolian<<span class="token operator">/</span>a>
                <<span class="token operator">/</span>body>
        <<span class="token operator">/</span>head>
<<span class="token operator">/</span>html>

systemctl restart httpd
</code></pre> 
  <h2>五 虚拟主机</h2> 
  <hr> 
  <h3>1 虚拟主机介绍</h3> 
  <p>就是把一台物理服务器划分成多个“虚拟”的服务器,每一个虚拟主机都可以有独立的域名和独立的目录</p> 
  <p>同时发布两个网站:</p> 
  <p>DocumentRoot /usr/local/nginx/html/web1</p> 
  <p>DocumentRoot /usr/local/nginx/html/web2</p> 
  <h3>2 基于IP的虚拟主机</h3> 
  <p>应用场景:IP充足的环境</p> 
  <pre><code class="prism language-powershell">server <span class="token punctuation">{</span>
    listen       192<span class="token punctuation">.</span>168<span class="token punctuation">.</span>11<span class="token punctuation">.</span>251:80<span class="token punctuation">;</span>
    location <span class="token operator">/</span> <span class="token punctuation">{</span>
        root   html/web1<span class="token punctuation">;</span>
        index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm index<span class="token punctuation">.</span>php<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
server <span class="token punctuation">{</span>
    listen       192<span class="token punctuation">.</span>168<span class="token punctuation">.</span>11<span class="token punctuation">.</span>252:80<span class="token punctuation">;</span>
location <span class="token operator">/</span> <span class="token punctuation">{</span>
        root   html/web2<span class="token punctuation">;</span>
        index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> 
  <h4>基于IP的虚拟主机特点</h4> 
  <p>不同IP对应不同网站</p> 
  <p>访问方便,用户直接使用默认端口即可访问</p> 
  <p>服务器需要有多个IP地址(一个公网IP大概一年的费用是600左右)</p> 
  <p>维护方便,基于独立IP的站点,便于监控、维护。</p> 
  <h3>3 基于端口的虚拟主机</h3> 
  <p>#只需要一个IP</p> 
  <p>#缺点 端口你是无法告诉公网用户 无法适用于公网客户 适合内部用户</p> 
  <pre><code class="prism language-powershell">基于端口
server <span class="token punctuation">{</span>
    listen       80<span class="token punctuation">;</span>
    <span class="token comment">#server_name  www.abc.com;</span>
    location <span class="token operator">/</span> <span class="token punctuation">{</span>
        root   html/web1<span class="token punctuation">;</span>
        index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm index<span class="token punctuation">.</span>php<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
server <span class="token punctuation">{</span>
    listen       8080<span class="token punctuation">;</span>
    <span class="token comment">#server_name  www.abc.com;</span>
    location <span class="token operator">/</span> <span class="token punctuation">{</span>
        root   html/web2<span class="token punctuation">;</span>
        index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> 
  <h4>基于端口的虚拟主机特点</h4> 
  <p>不同端口对应不同网站</p> 
  <p>访问需要加端口</p> 
  <p>节省IP地址</p> 
  <p>适合私网运行</p> 
  <h3>4 基于域名的虚拟主机</h3> 
  <p>#一个网站必然有一个域名</p> 
  <pre><code class="prism language-powershell">基于域名
server <span class="token punctuation">{</span>
    listen       80<span class="token punctuation">;</span>
    server_name  web1<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com<span class="token punctuation">;</span>

    location <span class="token operator">/</span> <span class="token punctuation">{</span>
        root   html/web1<span class="token punctuation">;</span>
        index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm index<span class="token punctuation">.</span>php<span class="token punctuation">;</span>

    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>


server <span class="token punctuation">{</span>
    listen       80<span class="token punctuation">;</span>
    server_name  web2<span class="token punctuation">.</span>b<span class="token punctuation">.</span>com<span class="token punctuation">;</span>

    location <span class="token operator">/</span> <span class="token punctuation">{</span>
        root   html/web2<span class="token punctuation">;</span>
        index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> 
  <h4>基于域名的虚拟主机特点</h4> 
  <p>不同域名对应不同网站</p> 
  <p>需要多个域名 可以是二级或三级域名</p> 
  <p>每个站点使用默认端口,方便用户访问</p> 
  <p>只需要一个IP地址,节约成本</p> 
  <p>适合公网环境</p> 
  <h2>六 反向代理</h2> 
  <hr> 
  <h3>1 代理介绍</h3> 
  <p>代理在网络中使用是比较常见的,比如大家去国外网站查找学习资料的时候就会用到代理。其原理也比较简单:</p> 
  <p>1)用户将请求发给代理服务器</p> 
  <p>2)代理服务器代用户去访问数据</p> 
  <p>3)代理服务器将数据给用户</p> 
  <p><strong>正常没有代理情况上网</strong><br> <a href="http://img.e-com-net.com/image/info8/8ec54646a0a64c2894e9e13457a05846.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/8ec54646a0a64c2894e9e13457a05846.jpg" alt="zutuanxue.com-nginx与LNMP_第2张图片" width="650" height="131" style="border:1px solid black;"></a></p> 
  <p><strong>代理服务器场景</strong></p> 
  <p><a href="http://img.e-com-net.com/image/info8/8b78d3d502a74fed954a6fe335b9243c.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/8b78d3d502a74fed954a6fe335b9243c.jpg" alt="请添加图片描述" width="650" height="98"></a></p> 
  <p><strong>代理服务器扮演的就是一个中间人的角色。</strong></p> 
  <p>代理分为正向代理和反向代理两种类型:</p> 
  <p>正向代理:代理用户访问其他网站,比如ss,蓝灯。</p> 
  <p>反向代理:用来发布服务器,比如nginx</p> 
  <p>我们主要介绍的是反向代理,使用反向代理发布公司的站点。<strong>(国家严厉打击私单乱建代理服务器)</strong></p> 
  <h3>2 应用场景</h3> 
  <p>1)堡垒机:堡垒机承担所有的外部访问,保护后端服务器的安全</p> 
  <p><a href="http://img.e-com-net.com/image/info8/0c0cedc7645b49b39f7e30afd2cb99c7.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/0c0cedc7645b49b39f7e30afd2cb99c7.jpg" alt="zutuanxue.com-nginx与LNMP_第3张图片" width="650" height="178" style="border:1px solid black;"></a></p> 
  <p>2)业务发布服务器:将多个服务器通过虚拟主机的方式发布到公网</p> 
  <p><a href="http://img.e-com-net.com/image/info8/a2a4236c80a6481190fe71d501ac8a97.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a2a4236c80a6481190fe71d501ac8a97.jpg" alt="zutuanxue.com-nginx与LNMP_第4张图片" width="650" height="379" style="border:1px solid black;"></a></p> 
  <p>3)缓存服务器:CDN加速</p> 
  <p><a href="http://img.e-com-net.com/image/info8/16cb4bb01a554cfdbe77f4ae631771b6.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/16cb4bb01a554cfdbe77f4ae631771b6.jpg" alt="zutuanxue.com-nginx与LNMP_第5张图片" width="650" height="146" style="border:1px solid black;"></a></p> 
  <h3>3 反向代理原理</h3> 
  <ol> 
   <li>客户端通过浏览器 发起请求 代理服务器</li> 
  </ol> 
  <p>2)代理服务器 接受请求</p> 
  <ol start="3"> 
   <li>代理服务器 发起请求 业务服务器</li> 
  </ol> 
  <p>4)业务服务器 接受请求</p> 
  <p>5)业务服务器 处理请求</p> 
  <ol start="6"> 
   <li>业务服务器 响应请求 代理服务器</li> 
  </ol> 
  <p>7)代理服务器 响应请求 客户端</p> 
  <p>8)客户端通过浏览器渲染请求并展示给用户</p> 
  <h3>4 反向代理实现</h3> 
  <p><strong>proxy_pass: nginx反向代理指令</strong></p> 
  <p><strong>反向代理实现</strong></p> 
  <p>location / {</p> 
  <p>index index.php index.html index.htm; #定义首页索引文件的名称</p> 
  <p>proxy_pass http://mysvr ;#请求转向mysvr 定义的服务器列表</p> 
  <p>}</p> 
  <p><strong>反向代理优化</strong></p> 
  <p>proxy_set_header Host $host;</p> 
  <p>proxy_set_header X-Real-IP $remote_addr;</p> 
  <p>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</p> 
  <p>client_max_body_size 10m; #允许客户端请求的最大单文件字节数</p> 
  <p>client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,</p> 
  <p>proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)</p> 
  <p>proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)</p> 
  <p>proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)</p> 
  <p>proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小</p> 
  <p>proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置</p> 
  <p>proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)</p> 
  <p>proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传</p> 
  <h2>七 下载限速</h2> 
  <hr> 
  <h3>1 限速介绍</h3> 
  <p>在生产环境中,为了保护WEB服务器的安全,我们都会对用户的访问做出一些限制,保证服务器的安全及资源的合理分配。</p> 
  <p>限流(rate limiting)是NGINX众多特性中最有用的,也是经常容易被误解和错误配置的,特性之一访问请求限速。该特性可以限制某个用户在一个给定时间段内能够产生的HTTP请求数。请求可以简单到就是一个对于主页的GET请求或者一个登陆表格的POST请求。用于安全目的上,比如减慢暴力密码破解攻击。通过限制进来的请求速率,并且(结合日志)标记出目标URLs来帮助防范DDoS攻击。一般地说,限流是用在保护上游应用服务器不被在同一时刻的大量用户请求湮没</p> 
  <p>限速说的很笼统,其实限速分为很多种限速方法:</p> 
  <p>1)下载速度限速</p> 
  <p>2)单位时间内请求数限制</p> 
  <p>3)基于客户端的并发连接限速</p> 
  <p>nginx限速模块</p> 
  <p>Nginx官方版本限制IP的连接和并发分别有两个模块:</p> 
  <p>limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 “leaky bucket”。</p> 
  <p>limit_req_conn 用来限制同一时间连接数,即并发限制。</p> 
  <h3>2 应用场景</h3> 
  <p>下载限速:限制下载速度及并发连接数,应用在下载服务器中,保护带宽及服务器的IO资源。</p> 
  <p>请求限速:限制单位时间内用户访问请求,防止恶意攻击,保护服务器及资源安全。</p> 
  <h3>3 限速原理</h3> 
  <p>漏桶原理</p> 
  <p><a href="http://img.e-com-net.com/image/info8/4edab5f4cb0c438dac4f7e41abe85b35.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/4edab5f4cb0c438dac4f7e41abe85b35.jpg" alt="zutuanxue.com-nginx与LNMP_第6张图片" width="650" height="387" style="border:1px solid black;"></a></p> 
  <pre><code class="prism language-powershell">算法思想是:
    水(请求)从上方倒入水桶,从水桶下方流出(被处理);
    来不及流出的水存在水桶中(缓冲),以固定速率流出;
    水桶满后水溢出(丢弃)。
    这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃。
    相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的。
</code></pre> 
  <h3>4 限速实现</h3> 
  <p>1)单位时间内请求数限制</p> 
  <pre><code class="prism language-powershell"><span class="token comment">#基于IP对下载速率做限制  限制每秒处理1次请求,对突发超过5个以后的请求放入缓存区 </span>
http <span class="token punctuation">{</span>
    limit_req_zone <span class="token variable">$binary_remote_addr</span> zone=test:10m rate=1r/s<span class="token punctuation">;</span>
    server <span class="token punctuation">{</span>
        location <span class="token operator">/</span>abc <span class="token punctuation">{</span>
            limit_req zone=test burst=5 nodelay<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
limit_req_zone <span class="token variable">$binary_remote_addr</span> zone=test:10m rate=1r/s<span class="token punctuation">;</span>
第一个参数:<span class="token variable">$binary_remote_addr</span> 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。
第二个参数:zone=test:10m表示生成一个大小为10M,名字为test的内存区域,用来存储访问的频次信息。
第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。

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

重启nginx服务

测试机
<span class="token namespace">[root@slave tmp]</span><span class="token comment"># for i in `seq 1 10`; do (wget http://192.168.11.16/abc/bigfile -P /tmp) & done</span>
<span class="token namespace">[root@slave tmp]</span><span class="token comment"># killall wget 会出现不同的状态,有的是以退出有的是已终止</span>
</code></pre> 
  <p>2)限制并发连接数</p> 
  <pre><code class="prism language-powershell"><span class="token comment">#基于IP做连接限制  限制同一IP并发为1</span>
limit_conn_zone <span class="token variable">$binary_remote_addr</span> zone=addr:10m<span class="token punctuation">;</span>

server <span class="token punctuation">{</span>
        listen       80<span class="token punctuation">;</span>
        server_name  localhost<span class="token punctuation">;</span>

        location <span class="token operator">/</span> <span class="token punctuation">{</span>
            root   html<span class="token punctuation">;</span>
            index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>

        location <span class="token operator">/</span>abc <span class="token punctuation">{</span>
           limit_conn addr 1<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>

    <span class="token punctuation">}</span>

<span class="token punctuation">}</span>
重启nginx服务

测试机
<span class="token namespace">[root@slave tmp]</span><span class="token comment"># for i in `seq 1 10`; do (wget http://192.168.11.16/abc/bigfile -P /tmp) & done</span>
<span class="token comment">#退出了9个只能开启一个</span>
</code></pre> 
  <p>3)限制下载速度</p> 
  <pre><code class="prism language-powershell">下载速度为100k
server <span class="token punctuation">{</span>
        listen       80<span class="token punctuation">;</span>
        server_name  localhost<span class="token punctuation">;</span>

        location <span class="token operator">/</span> <span class="token punctuation">{</span>
            root   html<span class="token punctuation">;</span>
            index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>

        location <span class="token operator">/</span>abc <span class="token punctuation">{</span>
           limit_rate 100k<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>

    <span class="token punctuation">}</span>

<span class="token punctuation">}</span>

重启nginx服务

测试机使用wget命令测试
</code></pre> 
  <p>4)综合案例</p> 
  <p>限制web服务器请求处理为1秒一个,触发值为5;</p> 
  <p>限制并发连接数为4;</p> 
  <p>限制下载速度为100.</p> 
  <pre><code class="prism language-powershell">http <span class="token punctuation">{</span>
    include       mime<span class="token punctuation">.</span>types<span class="token punctuation">;</span>
    default_type  application/octet-stream<span class="token punctuation">;</span>

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

        location <span class="token operator">/</span> <span class="token punctuation">{</span>
            root   html<span class="token punctuation">;</span>
            index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>

        location <span class="token operator">/</span>abc <span class="token punctuation">{</span>
           limit_req zone=one burst=5 nodelay<span class="token punctuation">;</span>
           limit_conn addr 4<span class="token punctuation">;</span>
           limit_rate 100k<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>

    <span class="token punctuation">}</span>

<span class="token punctuation">}</span>
</code></pre> 
  <h2>八 URL重写</h2> 
  <hr> 
  <h3>1 URL重写介绍</h3> 
  <p>和apache等web服务软件一样,rewrite的主要功能是实现URL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持。</p> 
  <p>Rewrite功功能是Nginx服务器提供的一个重要功能。几乎是所有的web产品必备技能,用于实现URL重写。URL重写是非常有用的功能,比如它可以在我们在改变网站结构后,不需要客户端修改原来的书签,也不需要其他网站修改对我们网站的友情链接,还可以在一定程度上提高网站的安全性,能够让我们的网站显得更专业。</p> 
  <h3>2 应用场景</h3> 
  <p>域名变更 (京东)</p> 
  <p>用户跳转 (从某个连接跳到另一个连接)</p> 
  <p>伪静态场景 (便于CDN缓存动态页面数据)</p> 
  <h3>3 URL重写原理</h3> 
  <p><a href="http://img.e-com-net.com/image/info8/b3117740cddd452d92ca617a1d1bedd5.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b3117740cddd452d92ca617a1d1bedd5.jpg" alt="zutuanxue.com-nginx与LNMP_第7张图片" width="650" height="438" style="border:1px solid black;"></a></p> 
  <h3>4 URL重写</h3> 
  <p><strong>URL 模块语法</strong></p> 
  <ul> 
   <li>set 设置变量</li> 
   <li>if 负责语句中的判断</li> 
   <li>return 返回返回值或URL</li> 
   <li>break 终止后续的rewrite规则</li> 
   <li>rewrite 重定向URL</li> 
  </ul> 
  <p><strong>set指令 自定义变量</strong></p> 
  <p>Syntax: set $variable value;</p> 
  <p>Default: —</p> 
  <p>Context: server, location, if</p> 
  <pre><code class="prism language-powershell">将http:<span class="token operator">/</span><span class="token operator">/</span>www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com  重写为 http:<span class="token operator">/</span><span class="token operator">/</span>www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com/hello
location <span class="token operator">/</span> <span class="token punctuation">{</span>
                <span class="token function">set</span> <span class="token variable">$name</span> hello<span class="token punctuation">;</span>
                rewrite ^<span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token operator">*</span><span class="token punctuation">)</span>$ http:<span class="token operator">/</span><span class="token operator">/</span>www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com/<span class="token variable">$name</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
重启nginx服务
测试机打开浏览器可以看到页面跳转
</code></pre> 
  <p><strong>if 指令 负责判断</strong></p> 
  <p>Syntax: if (condition) { … }</p> 
  <p>Default: —</p> 
  <p>Context: server, location</p> 
  <p>条件匹配</p> 
  <p>#模糊匹配 ~匹配 !~不匹配 ~* 不区分大小写的匹配</p> 
  <p>#精确匹配 = !=</p> 
  <pre><code class="prism language-powershell">location <span class="token operator">/</span> <span class="token punctuation">{</span>
                root html<span class="token punctuation">;</span>
                index index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
                <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$http_user_agent</span> ~<span class="token operator">*</span> <span class="token string">'Firefox'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                        <span class="token keyword">return</span> 403<span class="token punctuation">;</span>
                <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
重启nginx
客户机打开火狐浏览器测试,看看能否看到403
</code></pre> 
  <p><strong>return 指令 定义返回数据</strong></p> 
  <p>Syntax: return code [text];</p> 
  <p>return code URL;</p> 
  <p>return URL;</p> 
  <p>Default: —</p> 
  <p>Context: server, location, if</p> 
  <pre><code class="prism language-powershell">location <span class="token operator">/</span> <span class="token punctuation">{</span>
                root html<span class="token punctuation">;</span>
                index index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
                <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$http_user_agent</span> ~<span class="token operator">*</span> <span class="token string">'Firefox'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                        <span class="token keyword">return</span> 403<span class="token punctuation">;</span>
                <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
</code></pre> 
  <p><strong>rewrite指令 实现重写url</strong></p> 
  <p><strong>rewrite [flag];</strong></p> 
  <p><strong>关键字 正则 替代内容 flag标记</strong></p> 
  <p><strong>flag:</strong></p> 
  <ul> 
   <li>last #本条规则匹配完成后,继续向下匹配新的location URI规则</li> 
   <li>break #本条规则匹配完成即终止,不再匹配后面的任何规则</li> 
   <li>redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址</li> 
   <li>permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址</li> 
  </ul> 
  <p><strong>permanent标志:永久重定向</strong></p> 
  <pre><code class="prism language-powershell">域名跳转
www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com     重写为  www<span class="token punctuation">.</span>b<span class="token punctuation">.</span>com
server <span class="token punctuation">{</span>
        listen        80<span class="token punctuation">;</span>
        server_name www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com<span class="token punctuation">;</span>
        location <span class="token operator">/</span> <span class="token punctuation">{</span>
            rewrite ^<span class="token operator">/</span>$ http:<span class="token operator">/</span><span class="token operator">/</span>www<span class="token punctuation">.</span>b<span class="token punctuation">.</span>com permanent<span class="token punctuation">;</span>

          <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> 
  <p><strong>redirect标志:临时重定向</strong></p> 
  <pre><code class="prism language-powershell">域名跳转
www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com     重写为  www<span class="token punctuation">.</span>b<span class="token punctuation">.</span>com
server <span class="token punctuation">{</span>
        listen        80<span class="token punctuation">;</span>
        server_name www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com<span class="token punctuation">;</span>
        location <span class="token operator">/</span> <span class="token punctuation">{</span>
            rewrite ^<span class="token operator">/</span>$ http:<span class="token operator">/</span><span class="token operator">/</span>www<span class="token punctuation">.</span>b<span class="token punctuation">.</span>com redirect<span class="token punctuation">;</span>

          <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> 
  <p><strong>break标志: 类似临时重定向</strong></p> 
  <pre><code class="prism language-powershell">域名跳转
www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com     重写为  www<span class="token punctuation">.</span>b<span class="token punctuation">.</span>com
server <span class="token punctuation">{</span>
        listen        80<span class="token punctuation">;</span>
        server_name www<span class="token punctuation">.</span>a<span class="token punctuation">.</span>com<span class="token punctuation">;</span>
        location <span class="token operator">/</span> <span class="token punctuation">{</span>
            rewrite ^<span class="token operator">/</span>$ http:<span class="token operator">/</span><span class="token operator">/</span>www<span class="token punctuation">.</span>b<span class="token punctuation">.</span>com <span class="token keyword">break</span><span class="token punctuation">;</span>

          <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> 
  <p><strong>last标志:</strong></p> 
  <p>url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变</p> 
  <p>last 一般出现在server或if中</p> 
  <p>根据用户浏览器重写访问目录</p> 
  <pre><code class="prism language-powershell">如果是firefox浏览器  就将  
http:<span class="token operator">/</span><span class="token operator">/</span>192<span class="token punctuation">.</span>168<span class="token punctuation">.</span>11<span class="token punctuation">.</span>16/<span class="token variable">$URI</span>
   重写为  
http:<span class="token operator">/</span><span class="token operator">/</span>192<span class="token punctuation">.</span>168<span class="token punctuation">.</span>11<span class="token punctuation">.</span>16/firefox/<span class="token variable">$URI</span>

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



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


       location <span class="token operator">/</span>firefox <span class="token punctuation">{</span>
          root html <span class="token punctuation">;</span>
          index index<span class="token punctuation">.</span>html<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token namespace">[root@localhost html]</span><span class="token comment"># pwd</span>
<span class="token operator">/</span>usr/local/nginx/html
<span class="token namespace">[root@localhost html]</span><span class="token comment"># mkdir firefox</span>
<span class="token namespace">[root@localhost html]</span><span class="token comment"># echo firefox > firefox/index.html</span>
<span class="token namespace">[root@localhost html]</span><span class="token comment"># killall  nginx</span>
<span class="token namespace">[root@localhost html]</span><span class="token comment"># /usr/local/nginx/sbin/nginx </span>
客户机浏览器测试
</code></pre> 
  <h2>九 nginx优化</h2> 
  <hr> 
  <h3>1 并发优化</h3> 
  <p>nginx工作模式:主进程+工作进程</p> 
  <pre><code class="prism language-powershell">启动工作进程数量
worker_processes  4<span class="token punctuation">;</span>
<span class="token comment">#指定运行的核的编号,采用掩码的方式设置编号</span>
worker_cpu_affinity   0001 0010 0100 1000<span class="token punctuation">;</span>


events <span class="token punctuation">{</span>
单个工作进程维护的请求队列长度
    worker_connections  1024<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> 
  <h3>2 长连接</h3> 
  <p>减少服务器维护因为与客户端建立http连接产生的大量tcp三次握手四次断开的开销</p> 
  <pre><code class="prism language-powershell">keepalive_timeout  0<span class="token punctuation">;</span>  0代表关闭
<span class="token comment">#keepalive_timeout  100;</span>
<span class="token comment">#keepalive_requests 8192;</span>
</code></pre> 
  <h3>3 压缩</h3> 
  <p>降低传输时间,增加用户体验度;降低公司带宽费用。</p> 
  <pre><code class="prism language-powershell">gzip  on<span class="token punctuation">;</span>
gzip_proxied any<span class="token punctuation">;</span>
gzip_min_length 1k<span class="token punctuation">;</span>
gzip_buffers 4 8k<span class="token punctuation">;</span>
gzip_comp_level 6<span class="token punctuation">;</span>
gzip_types text/plain text/css application/x-javascript application/javascript application/xml<span class="token punctuation">;</span>


<span class="token comment"># 开启gzip</span>
    gzip off<span class="token punctuation">;</span>

    <span class="token comment"># 启用gzip压缩的最小文件,小于设置值的文件将不会压缩</span>
    gzip_min_length 1k<span class="token punctuation">;</span>

    <span class="token comment"># gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明</span>
    gzip_comp_level 1<span class="token punctuation">;</span>

    <span class="token comment"># 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。</span>
    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<span class="token punctuation">.</span>ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml<span class="token punctuation">;</span>

    <span class="token comment"># 是否在http header中添加Vary: Accept-Encoding,建议开启</span>
    gzip_vary on<span class="token punctuation">;</span>

    <span class="token comment"># 禁用IE 6 gzip</span>
    gzip_disable <span class="token string">"MSIE [1-6]\."</span><span class="token punctuation">;</span>

    <span class="token comment"># 设置压缩所需要的缓冲区大小     </span>
    gzip_buffers 32 4k<span class="token punctuation">;</span>

    <span class="token comment"># 设置gzip压缩针对的HTTP协议版本</span>
    gzip_http_version 1<span class="token punctuation">.</span>0<span class="token punctuation">;</span>
</code></pre> 
  <h3>4 静态缓存</h3> 
  <p>将部分数据缓存在用户本地磁盘,用户加载时,如果本地和服务器的数据一致,则从本地加载。提升用户访问速度,提升体验度。节省公司带宽成本。</p> 
  <pre><code class="prism language-powershell">expires指令:开启缓存并指定静态缓存时间

location ~<span class="token operator">*</span>  \<span class="token punctuation">.</span><span class="token punctuation">(</span>png<span class="token punctuation">|</span>gif<span class="token punctuation">)</span>$ <span class="token punctuation">{</span>
              expires 1h<span class="token punctuation">;</span>
         <span class="token punctuation">}</span>
</code></pre> 
  <h2>十 LNMP</h2> 
  <h3>介绍</h3> 
  <p>说到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程序。</p> 
  <p><strong>LNMP</strong></p> 
  <p>是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写。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服务)。</p> 
  <p>Nginx会把用户的动态页面请求交给php服务去处理,这个php服务就会去和数据库进行交互。用户的静态页面请求Nginx会直接处理,Nginx处理静态请求的速度要比apache快很多性能上要好,所以apache和Nginx在动态请求处理上区别不大,但如果是静态请求处理的话就会明显发现Nginx要快于apache,而且Nginx能承受的并发量要比apache大,可以承受好几万的并发量,所以大一些的网站都会使用Nginx作为web服务器。</p> 
  <h3>动态页面和静态页面</h3> 
  <p><strong>静态网页:</strong></p> 
  <p>(1)静态网页不能简单地理解成静止不动的网页,他主要指的是网页中没有程序代码,只有HTML(即:超文本标记语言),一般后缀为.html,.htm,或者.xml等。虽然静态网页的页面一旦做成,内容就不会再改变了。但是,静态网页也包括一些能动的部分,这些主要是一些GIF动画等</p> 
  <p>(2)静态网页的打开,用户可以直接双击,并且不管任何人任何时间打开的页面的内容都是不变的。</p> 
  <p><strong>动态网页:</strong></p> 
  <p>(1)动态网页是指跟静态网页相对的一种网页编程技术。动态网页的网页文件中除了HTML标记以外,还包括一些特定功能的程序代码,这些代码可以使得浏览器和服务器可以交互,所以服务器端根据客户的不同请求动态的生成网页内容。即:动态网页相对于静态网页来说,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。</p> 
  <p>(2)动态网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,只要是采用了动态网站技术(如PHP、ASP、JSP等)生成的网页都可以称为动态网页。</p> 
  <p><strong>动态网页和静态网页的区别:</strong></p> 
  <p><strong>(1)更新和维护:</strong></p> 
  <p>静态网页内容一经发布到网站服务器上,无论是否有用户访问,这些网页内容都是保存在网站服务器上的。如果要修改网页的内容,就必须修改其源代码,然后重新上传到服务器上。静态网页没有数据库的支持,当网站信息量很大的时候网页的制作和维护都很困难</p> 
  <p>动态网页可以根据不同的用户请求,时间或者环境的需求动态的生成不同的网页内容,并且动态网页一般以数据库技术为基础,可以大大降低网站维护的工作量</p> 
  <p><strong>(2)交互性:</strong></p> 
  <p>静态网页由于很多内容都是固定的,在功能方面有很大的限制,所以交互性较差</p> 
  <p>动态网页则可以实现更多的功能,如用户的登录、注册、查询等</p> 
  <p><strong>(3)响应速度:</strong></p> 
  <p>静态网页内容相对固定,容易被搜索引擎检索,且不需要连接数据库,因此响应速度较快</p> 
  <p>动态网页实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页,其中涉及到数据的连接访问和查询等一系列过程,所以响应速度相对较慢</p> 
  <p><strong>(4)访问特点:</strong></p> 
  <p>静态网页的每个网页都有一个固定的URL,且网页URL以.htm、.html、.shtml等常见形式为后缀,而不含有“?”,可以直接双击打开</p> 
  <p>动态网页中的“?”对搜索引擎检索存在一定的问题,搜索引擎一般不可能从一个网站的数据库中访问全部网页,或者出于技术方面的考虑,搜索之中不去抓取网址中“?”后面的内容,不能直接双击打开</p> 
  <p><strong>综上所述</strong></p> 
  <p>如果网页内容相对的简单,不需要频繁的进行改动,或者只是为了展示信息等,就用静态网页,简单易操作,不需要管理数据库等</p> 
  <p>如果网页内容相对复杂,功能多,改动频繁,实时性的内容多,就用动态网页</p> 
  <h3>LNMP架构工作流程</h3> 
  <p><a href="http://img.e-com-net.com/image/info8/3e1e3cd5d6ac48ce9691e4440a7fc159.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/3e1e3cd5d6ac48ce9691e4440a7fc159.jpg" alt="zutuanxue.com-nginx与LNMP_第8张图片" width="538" height="239" style="border:1px solid black;"></a></p> 
  <ul> 
   <li>用户发送http请求到达http服务器</li> 
   <li>httpd解析URL获取需要的资源的路径,通过内核空间来读取硬盘资源,如果是静态资源,则构建响应报文发回给用户。</li> 
   <li>如果是动态资源,将资源地址发送给php解析器,解析php程序文件,解析完毕将内容发回给httpd,httpd构建响应报文,发回给用户。</li> 
   <li>如果涉及到数据库操作,则利用php-mysql驱动,获取数据库数据,返回给PHP解析器。</li> 
  </ul> 
  <h3>案例</h3> 
  <p>利用LNMP+wordpress搭建博客网站</p> 
  <p><strong>WordPress</strong></p> 
  <p>一款使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统来使用。WordPress以上手简单、功能强大、扩展性与灵活性著称,加上开源免费,主题插件极其丰富,无论作为新手学习搭建个人博客,还是专业用户用于架设复杂的企业电商网站、论坛等,WP 都能完美满足需求。你几乎能用 WP 打造成任何类型的网站,只有想不到,没有做不到。而且全球数以亿计各类知名网站都是基于 WP 构建,根据官方统计,目前全球有 32% 的网站都由 WP 搭建,由于它实在太过流行,因此无论插件、主题、教程、文档等资源都极其丰富,你选都选不完。而且网上关于性能优化、问题解决等讨论也非常的全面。基本上学习建网站这事,您只需玩转 WP 就够了!所以,如果要建站或想尝试学习建站,那 WP 绝对值得你优先考虑。</p> 
  <p>wordpress官网:https://cn.wordpress.org打开可能会有问题 (429错误),可以去https://ww.wp.xz.cn下载软件包</p> 
  <p><strong>环境介绍</strong></p> 
  <p>一台安装CentOS8的主机</p> 
  <p>关闭SElinux和防火墙</p> 
  <p>配置好yum源</p> 
  <p>挂载光盘</p> 
  <p>可以联网</p> 
  <p>wordpress软件包下载地址:https://ww.wp.xz.cn/latest.zip</p> 
  <p><strong>流程</strong></p> 
  <p>step1 部署LNMP架构</p> 
  <pre><code class="prism language-powershell"><span class="token namespace">[root@client ~]</span><span class="token comment"># dnf -y install nginx php* mariadb-server mariadb -y</span>
</code></pre> 
  <p>step2 设置php-fpm</p> 
  <pre><code class="prism language-powershell"><span class="token namespace">[root@client ~]</span><span class="token comment"># vim /etc/php-fpm.d/www.conf </span>
user = nginx
<span class="token function">group</span> = nginx

<span class="token comment">#php-fpm服务默认以apache用户启动,将启动用户身份修改nginx</span>
</code></pre> 
  <p>step3 启动服务</p> 
  <pre><code class="prism language-powershell"><span class="token namespace">[root@client ~]</span><span class="token comment"># systemctl restart nginx.service php-fpm.service mariadb.service </span>
</code></pre> 
  <p>step4 生成php测试页面</p> 
  <pre><code class="prism language-powershell"><span class="token namespace">[root@client ~]</span><span class="token comment"># echo "<?php phpinfo();?>" >> /usr/share/nginx/html/index.php</span>
<span class="token comment">#系统自带的nginx的页面文件存放在/usr/share/nginx/html/目录中</span>
</code></pre> 
  <p>step5 打开浏览器测试</p> 
  <p><a href="http://img.e-com-net.com/image/info8/cc6615f02ff84a0faddcf7ed79c8cad6.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/cc6615f02ff84a0faddcf7ed79c8cad6.jpg" alt="zutuanxue.com-nginx与LNMP_第9张图片" width="650" height="197" style="border:1px solid black;"></a></p> 
  <p>step6 为数据库设置密码并创建相应的数据库</p> 
  <pre><code class="prism language-powershell"><span class="token namespace">[root@client ~]</span><span class="token comment"># mysqladmin -u root password 123456</span>
<span class="token namespace">[root@client ~]</span><span class="token comment"># mysql -u root -p</span>
Enter password: 

MariaDB <span class="token punctuation">[</span><span class="token punctuation">(</span>none<span class="token punctuation">)</span><span class="token punctuation">]</span>> create database wordpress charset=utf8<span class="token punctuation">;</span>
Query OK<span class="token punctuation">,</span> 1 row affected <span class="token punctuation">(</span>0<span class="token punctuation">.</span>001 sec<span class="token punctuation">)</span>

MariaDB <span class="token punctuation">[</span><span class="token punctuation">(</span>none<span class="token punctuation">)</span><span class="token punctuation">]</span>> quit
Bye
</code></pre> 
  <p>step7 准备wordpress</p> 
  <pre><code class="prism language-powershell"><span class="token namespace">[root@client ~]</span><span class="token comment"># cd /usr/share/nginx/html/</span>
<span class="token namespace">[root@client html]</span><span class="token comment"># rm -fr *</span>
<span class="token comment">#####删除nginx自带的页面文件,以及刚才测试生成的php页面</span>


<span class="token namespace">[root@client ~]</span><span class="token comment"># unzip latest-zh_CN.zip </span>
<span class="token namespace">[root@client ~]</span><span class="token comment"># cd wordpress/</span>
<span class="token namespace">[root@client wordpress]</span><span class="token comment"># mv * /usr/share/nginx/html/</span>
<span class="token comment">####将wordpress文件移动到nginx页面文件存放的目录</span>


<span class="token namespace">[root@client wordpress]</span><span class="token comment"># cd /usr/share/nginx/html/</span>
<span class="token namespace">[root@client html]</span><span class="token comment"># chown -R nginx.nginx *</span>
<span class="token comment">###文件的默认所有者是root,为了避免权限的问题,将所有者改为nginx</span>
</code></pre> 
  <p>step8 安装wordpress</p> 
  <p><strong>后续图片步骤见标题,图片太多,调整不过来了…</strong></p> 
  <h2>总结</h2> 
  <p>什么是nginx</p> 
  <p>​ 它可以做什么</p> 
  <p>​ nginx有哪些优点和缺点</p> 
  <p>​ 如何安装部署</p> 
  <p>​ 配置文件的字段含义</p> 
  <p>​ nginx的基本使用</p> 
  <p>​ 虚拟主机的使用</p> 
  <p>​ 反向代理、限速</p> 
  <p>​ URL重写、优化</p> 
  <p>重点:nginx的安装部署,配置文件字段含义,基本功能的使用,虚拟主机的使用,如何实现反向代理,如何实现URL重写</p> 
  <p>难点:配置文件字段及格式,各种基本功能使用,虚拟主机如何去设置,反向代理如何去设置,如何实现URL重写</p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1686445266166689792"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Linux,云计算,CentOS,linux,运维,centos,云计算)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1950230678201233408.htm"
                           title="centos7出现 bash: ip: command not found" target="_blank">centos7出现 bash: ip: command not found</a>
                        <span class="text-muted">微信圈</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a>
                        <div>centos7出现bash:ip:commandnotfoundyum-yinstallinitscripts</div>
                    </li>
                    <li><a href="/article/1950227023859347456.htm"
                           title="Linux系统配置(应用程序)" target="_blank">Linux系统配置(应用程序)</a>
                        <span class="text-muted">1风天云月</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/1.htm">应用程序</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85/1.htm">编译安装</a><a class="tag" taget="_blank" href="/search/rpm/1.htm">rpm</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a>
                        <div>目录前言一、应用程序概述1、命令与程序的关系2、程序的组成3、软件包封装类型二、RPM1、RPM概述2、RPM用法三、编译安装1、解包2、配置3、编译4、安装5、启用httpd服务结语前言在Linux中的应用程序被视为将软件包安装到系统中后产生的各种文档,其中包括可执行文件、配置文件、用户手册等内容,这些文档被组织为一个有机的整体,为用户提供特定的功能,因此对于“安装软件包”与“安装应用程序”这两</div>
                    </li>
                    <li><a href="/article/1950223356833886208.htm"
                           title="CentOS容器没有ip addr命令" target="_blank">CentOS容器没有ip addr命令</a>
                        <span class="text-muted">BLZxiaopang</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a>
                        <div>centos容器没有ip命令[root@Centos/]#ipadd-bash:ip:commandnotfound[root@Centos/]#yum-yinstallinitscripts</div>
                    </li>
                    <li><a href="/article/1950219166367674368.htm"
                           title="包含日志获取webshell" target="_blank">包含日志获取webshell</a>
                        <span class="text-muted">陈望_ning</span>

                        <div>日志文件关闭:Apache目录下的httpd.conf文件#ErrorLog"logs/error.log"#CustomLog"logs/access.log"common加#号为注释不产生日志文件如果去掉#将会在Apache/logs/目录下产生日志文件linux:access_logerror_logwindows:access.logerror.logaccess_log每一行记录了一次网</div>
                    </li>
                    <li><a href="/article/1950209621381672960.htm"
                           title="Android 应用权限管理详解" target="_blank">Android 应用权限管理详解</a>
                        <span class="text-muted"></span>

                        <div>文章目录1.权限类型2.权限请求机制3.权限组和分级4.权限管理的演进5.权限监控和SELinux强制访问控制6.应用权限审核和GooglePlayProtect7.开发者最佳实践8.用户权限管理9.Android应用沙箱模型10.ScopedStorage(分区存储)11.背景位置权限(BackgroundLocationAccess)12.权限回收和自动清理13.权限请求的用户体验设计14.G</div>
                    </li>
                    <li><a href="/article/1950202054706262016.htm"
                           title="centos7安装配置 Anaconda3" target="_blank">centos7安装配置 Anaconda3</a>
                        <span class="text-muted"></span>

                        <div>Anaconda是一个用于科学计算的Python发行版,Anaconda于Python,相当于centos于linux。下载[root@testsrc]#mwgethttps://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.2.0-Linux-x86_64.shBegintodownload:Anaconda3-5.2.0-L</div>
                    </li>
                    <li><a href="/article/1950201675771867136.htm"
                           title="分布式链路追踪系统架构设计:从理论到企业级实践" target="_blank">分布式链路追踪系统架构设计:从理论到企业级实践</a>
                        <span class="text-muted">ma451152002</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a>
                        <div>分布式链路追踪系统架构设计:从理论到企业级实践本文深入探讨分布式链路追踪系统的架构设计原理、关键技术实现和企业级应用实践,为P7架构师提供完整的技术方案参考。目录引言:分布式链路追踪的重要性核心概念与技术原理系统架构设计数据模型与协议标准核心组件架构设计性能优化与扩展性设计企业级实施策略技术选型与对比分析监控与运维体系未来发展趋势P7架构师面试要点引言:分布式链路追踪的重要性微服务架构下的挑战在现</div>
                    </li>
                    <li><a href="/article/1950192091439099904.htm"
                           title="K8S 常用命令全解析:高效管理容器化集群" target="_blank">K8S 常用命令全解析:高效管理容器化集群</a>
                        <span class="text-muted">恩爸编程</span>
<a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/k8s%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/1.htm">k8s常用命令</a><a class="tag" taget="_blank" href="/search/k8s%E6%9C%89%E5%93%AA%E4%BA%9B%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/1.htm">k8s有哪些常用命令</a><a class="tag" taget="_blank" href="/search/k8s%E5%91%BD%E4%BB%A4%E6%9C%89%E5%93%AA%E4%BA%9B/1.htm">k8s命令有哪些</a><a class="tag" taget="_blank" href="/search/K8S%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E6%9C%89%E5%93%AA%E4%BA%9B/1.htm">K8S常用命令有哪些</a>
                        <div>K8S常用命令全解析:高效管理容器化集群一、引言Kubernetes(K8S)作为强大的容器编排平台,其丰富的命令行工具(kubectl)为用户提供了便捷的方式来管理集群中的各种资源。熟练掌握K8S常用命令对于开发人员和运维人员至关重要,能够有效提高容器化应用的部署、监控与维护效率。本文将详细介绍一些K8S常用命令及其使用案例。二、基础资源操作命令(一)kubectlcreate功能:用于创建K8</div>
                    </li>
                    <li><a href="/article/1950183899388768256.htm"
                           title="修改CentOS的SSH登录端口(22端口)" target="_blank">修改CentOS的SSH登录端口(22端口)</a>
                        <span class="text-muted">❀͜͡傀儡师</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/ssh/1.htm">ssh</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>要修改CentOS系统的SSH服务默认端口(22端口),请按照以下步骤操作:备份SSH配置文件sudocp/etc/ssh/sshd_config/etc/ssh/sshd_config.bak编辑SSH配置文件sudovi/etc/ssh/sshd_config查找并修改端口设置找到以下行(大约在第13行左右):#Port22取消注释并添加新端口(例如使用56001):#Port22Port56</div>
                    </li>
                    <li><a href="/article/1950175199089455104.htm"
                           title="PDF转Markdown - Python 实现方案与代码" target="_blank">PDF转Markdown - Python 实现方案与代码</a>
                        <span class="text-muted">Eiceblue</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/PDF/1.htm">PDF</a><a class="tag" taget="_blank" href="/search/pdf/1.htm">pdf</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/vscode/1.htm">vscode</a>
                        <div>PDF作为广泛使用的文档格式,转换为轻量级标记语言Markdown后,可无缝集成到技术文档、博客平台和版本控制系统中,提高内容的可编辑性和可访问性。本文将详细介绍如何使用国产Spire.PDFforPython库将PDF文档转换为Markdown格式。技术优势:精准保留原始文档结构(段落/列表/表格)完整提取文本和图像内容无需Adobe依赖的纯Python实现支持Linux/Windows/mac</div>
                    </li>
                    <li><a href="/article/1950170537426743296.htm"
                           title="在Windows11上安装Linux操作系统的几种技术方案" target="_blank">在Windows11上安装Linux操作系统的几种技术方案</a>
                        <span class="text-muted">yuanpan</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>在Windows11上安装Linux主要有以下几种技术方案,每种方案适用于不同的需求场景:1.WindowsSubsystemforLinux(WSL)适用场景:开发、命令行工具、轻量级Linux环境支持发行版:Ubuntu、Debian、KaliLinux、Fedora等优点:轻量级:无需虚拟机,直接在Windows上运行Linux命令行环境。无缝集成:可访问Windows文件系统,支持VSCo</div>
                    </li>
                    <li><a href="/article/1950169525244719104.htm"
                           title="从零到一:基于差分隐私决策树的客户购买预测系统实战开发" target="_blank">从零到一:基于差分隐私决策树的客户购买预测系统实战开发</a>
                        <span class="text-muted">笙囧同学</span>
<a class="tag" taget="_blank" href="/search/%E5%86%B3%E7%AD%96%E6%A0%91/1.htm">决策树</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a>
                        <div>作者简介:笙囧同学,中科院计算机大模型方向硕士,全栈开发爱好者联系方式:3251736703@qq.com各大平台账号:笙囧同学座右铭:偷懒是人生进步的阶梯文章导航快速导航前言-项目背景与价值项目概览-系统架构与功能技术深度解析-核心算法原理️系统实现详解-工程实践细节性能评估与分析-实验结果分析Web系统开发-前后端开发部署与运维-DevOps实践完整复现指南-手把手教程️实践案例与故障排除-问</div>
                    </li>
                    <li><a href="/article/1950169523193704448.htm"
                           title="Claude Code 超详细完整指南(2025最新版)" target="_blank">Claude Code 超详细完整指南(2025最新版)</a>
                        <span class="text-muted">笙囧同学</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>终端AI编程助手|高频使用点+生态工具+完整命令参考+最新MCP配置目录快速开始(5分钟上手)详细安装指南系统要求Windows安装(WSL方案)macOS安装Linux安装安装验证配置与认证首次认证环境变量配置代理配置⚡基础命令详解启动命令会话管理文件操作Think模式完全指南MCP服务器配置详解MCP基础概念添加MCP服务器10个必备MCP服务器MCP故障排除记忆系统详解高级使用技巧成本控制策</div>
                    </li>
                    <li><a href="/article/1950166876634017792.htm"
                           title="如何在 Ubuntu 24.04 或 22.04 Linux 上安装和运行 Redis 服务器" target="_blank">如何在 Ubuntu 24.04 或 22.04 Linux 上安装和运行 Redis 服务器</a>
                        <span class="text-muted">山岚的运维笔记</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4%E5%8F%8A%E4%BD%BF%E7%94%A8/1.htm">运维及使用</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>Redis(RemoteDictionaryServer,远程字典服务器)是一种内存数据结构存储,通常用作NoSQL数据库、缓存和消息代理。它是开源的,因此用户可以免费安装,无需支付任何费用。Redis旨在为需要快速数据访问和低延迟的应用程序提供速度和效率。Redis支持多种数据类型,包括字符串(Strings)、列表(Lists)、集合(Sets)、哈希(Hashes)、有序集合(SortedS</div>
                    </li>
                    <li><a href="/article/1950163093577330688.htm"
                           title="Linux中Samba服务器安装与配置文件" target="_blank">Linux中Samba服务器安装与配置文件</a>
                        <span class="text-muted">長樂.-</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>Samba简述27zkqsamba是一个基于TCP/IP协议的开源软件套件,可以在Linux、Windows、macOS等操作系统上运行。它允许不同操作系统的计算机之间实现文件和打印机共享。samba提供了一个服务,使得Windows操作系统可以像访问本地文件一样访问Linux、Mac等操作系统上的共享文件。实现跨平台的文件共享,提高办公环境的效率和便利性。samba也支持Windows网络邻居协</div>
                    </li>
                    <li><a href="/article/1950154523955752960.htm"
                           title="Docker" target="_blank">Docker</a>
                        <span class="text-muted">℡余晖^</span>
<a class="tag" taget="_blank" href="/search/%E9%BB%91%E9%A9%AC%E7%82%B9%E8%AF%84%E9%A1%B9%E7%9B%AE%E7%9B%B8%E5%85%B3%E9%97%AE%E9%A2%98%E5%92%8C%E7%AC%94%E8%AE%B0/1.htm">黑马点评项目相关问题和笔记</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/eureka/1.htm">eureka</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a>
                        <div>在黑马点评项目中,在谈到Redisson解决redis的主从一致性问题时,弹幕提到了Docker,本文来简单了解一下Docker,我的初步理解运维是维护多个集群的稳定,那它和VM虚拟机的区别又是什么?,如果要更深入地理解与学习(运维工程师),可以到b站搜索专门的课程(SpringCloud)。一、Docker是什么?重新理解“容器化”的本质1.1Docker的定义Docker是一个开源的容器化平台</div>
                    </li>
                    <li><a href="/article/1950152629841620992.htm"
                           title="ubuntu qt环境下出现No suitable kits found解决方案" target="_blank">ubuntu qt环境下出现No suitable kits found解决方案</a>
                        <span class="text-muted"></span>

                        <div>1.清理QtCreator缓存QtCreator会缓存项目配置、索引等数据,可能导致某些异常。清理方法:(1)删除QtCreator配置目录bashrm-rf~/.config/QtProject/(Ubuntu/Linux)或Windows:cmdrmdir/s/q"%APPDATA%\QtProject"(2)清除QtCreator的编译缓存bashrm-rf~/.cache/QtProjec</div>
                    </li>
                    <li><a href="/article/1950152503563710464.htm"
                           title="如何在 Ubuntu 24.04 或 22.04 Linux 上安装和使用 NoMachine" target="_blank">如何在 Ubuntu 24.04 或 22.04 Linux 上安装和使用 NoMachine</a>
                        <span class="text-muted">山岚的运维笔记</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4%E5%8F%8A%E4%BD%BF%E7%94%A8/1.htm">运维及使用</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/nomachine/1.htm">nomachine</a><a class="tag" taget="_blank" href="/search/%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5/1.htm">远程连接</a>
                        <div>NoMachine是一款适用于Linux(Ubuntu)及其他支持的操作系统的远程桌面应用程序,允许用户通过本地或远程系统从世界任何地方控制计算机。它可以在低带宽连接下工作,被专业人士和家庭用户广泛使用。NoMachine的主要功能高性能远程访问跨平台兼容性易于使用,因为用户界面友好提供强大的加密协议,如SSH、SSL及其他安全标准支持远程文件传输和打印服务允许从远程计算机进行音频和视频流媒体传输</div>
                    </li>
                    <li><a href="/article/1950144063588069376.htm"
                           title="Serverless架构下Spring Function的创新实践" target="_blank">Serverless架构下Spring Function的创新实践</a>
                        <span class="text-muted">tmjpz04412</span>
<a class="tag" taget="_blank" href="/search/serverless/1.htm">serverless</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                        <div>引言:Serverless与Spring生态的交汇背景介绍:云计算与Serverless架构的兴起Spring生态的演进与云原生适配性核心问题:传统Spring应用如何融入Serverless范式Serverless架构的核心特征与挑战事件驱动、弹性伸缩与按需计费冷启动问题与性能优化需求Spring应用在Serverless环境中的典型瓶颈(如依赖注入、上下文初始化)SpringFunction的</div>
                    </li>
                    <li><a href="/article/1950135356531732480.htm"
                           title="linux实战--日志管理" target="_blank">linux实战--日志管理</a>
                        <span class="text-muted"></span>

                        <div>简介日志文件重要的信息系统文件,及了许多重要的系统事件,包括用户的登录信息,系统的启动信息,系统的安全信息,邮寄相关信息,各种服务相关的信息。日志对安全也很重要。每天记录系统发生的各种事情,通过日志检查错误发生的原因或受到攻击时攻击者留下的痕迹。总的来说,日志是记录重大事件的文件。处理日志的工具rsyslog系统日志管理专职管理日志的工具,它产生各种信息文件,主要存放在/var/loglogrot</div>
                    </li>
                    <li><a href="/article/1950131321980383232.htm"
                           title="深入了解 Kubernetes(k8s):从概念到实践" target="_blank">深入了解 Kubernetes(k8s):从概念到实践</a>
                        <span class="text-muted"></span>

                        <div>目录一、k8s核心概念二、k8s的优势三、k8s架构组件控制平面组件节点组件四、k8s+docker运行前后端分离项目的例子1.准备前端项目2.准备后端项目3.创建k8s部署配置文件4.部署应用到k8s集群在当今云计算和容器化技术飞速发展的时代,Kubernetes(简称k8s)已成为容器编排领域的事实标准。无论是互联网巨头、传统企业还是初创公司,都在广泛采用k8s来管理和部署容器化应用。本文将带</div>
                    </li>
                    <li><a href="/article/1950114557917720576.htm"
                           title="Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法" target="_blank">Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法</a>
                        <span class="text-muted">灬爱码士灬</span>
<a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>明确需要编辑器和编译器,并选择自己要用什么(我选的编辑器是VSCode:VisualStudioCode;编译器是gcc)下载VSCode并配置环境变量(这里没啥问题),安装C/C++的拓展安装Cygwin,用来在Windows操作系统上模拟Unix/Linux环境(Cygwin官网:https://www.cygwin.com/。)安装过程中镜像可以选择https://mirrors.aliyu</div>
                    </li>
                    <li><a href="/article/1950110777142734848.htm"
                           title="一篇教你学会Git" target="_blank">一篇教你学会Git</a>
                        <span class="text-muted">编程界的彭于晏qaq</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/GIT/1.htm">GIT</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a>
                        <div>从安装到高级使用(2025最新版)引言:为什么Git是开发者必备技能Git(GlobalInformationTracker)作为最流行的分布式版本控制系统,由Linux之父LinusTorvalds于2005年创建,现已成为软件开发的基础设施。与传统集中式版本控制系统(如SVN)相比,Git具有三大核心优势:分布式架构:每个开发者本地都有完整仓库副本,支持离线工作高效分支管理:创建和切换分支几乎</div>
                    </li>
                    <li><a href="/article/1950102202521546752.htm"
                           title="基本服务 FTP & SMB" target="_blank">基本服务 FTP & SMB</a>
                        <span class="text-muted">会飞的灰大狼</span>
<a class="tag" taget="_blank" href="/search/Centos7/1.htm">Centos7</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>基本服务FTP&SMB前言:FTP简称为文件传输协议前面说的他可以做到备份的功能那么它可以做到文件传输的过程smb我们简单来说共享文件夹‍NFSNFS(NetworkFileSystem,网络文件系统)是一种分布式文件系统协议,允许不同计算机之间通过网络共享文件和目录,使远程文件系统像本地文件系统一样被访问。它最初由SunMicrosystems开发,现在已成为UNIX/Linux系统中常用的网络</div>
                    </li>
                    <li><a href="/article/1950102076155555840.htm"
                           title="Centos7防火墙" target="_blank">Centos7防火墙</a>
                        <span class="text-muted">会飞的灰大狼</span>
<a class="tag" taget="_blank" href="/search/Centos7/1.htm">Centos7</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>Centos7防火墙前言:本来想在系统那里去说防火墙但防火墙要说的要很多使用单独做一章文章去讲防火墙~~‍在CentOS7中,防火墙是保障系统网络安全的核心组件,默认采用firewalld作为防火墙管理工具(替代了CentOS6的iptables服务),底层仍基于iptables内核模块实现规则控制。‍iptablesiptables命令的完整格式较为复杂,其核心结构由命令选项、表(table)、</div>
                    </li>
                    <li><a href="/article/1950099173521027072.htm"
                           title="Ubuntu lamp" target="_blank">Ubuntu lamp</a>
                        <span class="text-muted">会飞的灰大狼</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a>
                        <div>Ubuntulamp前言在Ubuntu安装lamp架构我们了解到lamp是完整的架构我们前面了解到了集合了Linux系统apacheMySQL和PHP语言的完整架构我们前面说了Centos7中编译安装lamp那么我们去说一下在Ubuntu中安装‍‍安装apache2‍apt直接安装apache2apt-yinstallapache2‍启动apache2systemctlstartapache2#测</div>
                    </li>
                    <li><a href="/article/1950089974804180992.htm"
                           title="9、Docker Compose 实战" target="_blank">9、Docker Compose 实战</a>
                        <span class="text-muted">小醉你真好</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E9%83%A8%E7%BD%B2%E4%B8%8D%E6%B1%82%E4%BA%BA/1.htm">部署不求人</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>DockerCompose实战教程(含完整Nginx案例+配置项详解)适合读者:开发者、后端工程师、运维工程师、初学者环境要求:CentOS9+Docker已安装教程亮点:实战驱动、配置项详解、挂载说明、可直接复制使用标签:#Docker#DockerCompose#运维实战#Nginx部署一、什么是DockerCompose?DockerCompose是Docker官方推出的多容器应用编排工具,</div>
                    </li>
                    <li><a href="/article/1950089975504629760.htm"
                           title="CentOS 7 安装最新版Docker教程" target="_blank">CentOS 7 安装最新版Docker教程</a>
                        <span class="text-muted">朽~</span>
<a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a>
                        <div>CentOS7Docker安装教程1、更新yum2、安装`yum-utils`3、通过`yum-config-manager`添加dockerrepository4、安装docker4.1、直接安装最新版本4.2、或者安装指定版本5、启动docker6、测试7、卸载dockerdocker安装官方文档:InstallDockerEngineonCentOS1、更新yumyumupdate-y2、安</div>
                    </li>
                    <li><a href="/article/1950088840886677504.htm"
                           title="Linux文件权限与进程管理解析" target="_blank">Linux文件权限与进程管理解析</a>
                        <span class="text-muted">雨季西柚</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>控制对文件的访问1。什么是文件系统权限?它是如何工作的?如何查看文件的权限?答:文件系统权限就是规定谁能对文件/文件夹做什么(比如看、改、删)的规则。简单说,就是分"所有者、所属组、其他人"三类,给每类分配"读、写、执行"三种权限。操作时系统先看你属于哪类,再查有没有对应权限,有就允许,没有就拦着。查看方式:Linux/mac:终端输ls-l文件名,看开头的rwxr--r--这类字符(3个一组,对</div>
                    </li>
                    <li><a href="/article/1950087454002311168.htm"
                           title="<六> CentOS 8 配置YUM源超详细教程(本地源+网络源)" target="_blank"><六> CentOS 8 配置YUM源超详细教程(本地源+网络源)</a>
                        <span class="text-muted">随风fraya</span>
<a class="tag" taget="_blank" href="/search/Docker/1.htm">Docker</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>一、本地YUM源配置(离线环境适用)1.挂载ISO镜像创建挂载目录并执行挂载命令:sudomkdir-p/mnt/cdrom sudomount/app/CentOS-8.1.1911-x86_64-dvd1.iso/mnt/cdrom #mount后第一个参数为ISO文件路径,也可替换为/dev/sr0为光驱设备注意:若提示设备未就绪,需检查虚拟机光驱设置或ISO文件完整性13。2.配置仓库文件</div>
                    </li>
                                <li><a href="/article/51.htm"
                                       title="mondb入手" target="_blank">mondb入手</a>
                                    <span class="text-muted">木zi_鸣</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a>
                                    <div>windows 启动mongodb  编写bat文件, 
 
mongod --dbpath D:\software\MongoDBDATA 
mongod --help  查询各种配置 
配置在mongob 
 
打开批处理,即可启动,27017原生端口,shell操作监控端口  扩展28017,web端操作端口 
 
启动配置文件配置, 
 
数据更灵活 </div>
                                </li>
                                <li><a href="/article/178.htm"
                                       title="大型高并发高负载网站的系统架构" target="_blank">大型高并发高负载网站的系统架构</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/%E9%AB%98%E5%B9%B6%E5%8F%91/1.htm">高并发</a><a class="tag" taget="_blank" href="/search/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/1.htm">负载均衡</a>
                                    <div>        扩展Web应用程序 
一.概念 
        简单的来说,如果一个系统可扩展,那么你可以通过扩展来提供系统的性能。这代表着系统能够容纳更高的负载、更大的数据集,并且系统是可维护的。扩展和语言、某项具体的技术都是无关的。扩展可以分为两种: 
        1.</div>
                                </li>
                                <li><a href="/article/305.htm"
                                       title="DISPLAY变量和xhost(原创)" target="_blank">DISPLAY变量和xhost(原创)</a>
                                    <span class="text-muted">czmmiao</span>
<a class="tag" taget="_blank" href="/search/display/1.htm">display</a>
                                    <div>DISPLAY 
在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量, 输出结果中有如下内容:DISPLAY=:0.0</div>
                                </li>
                                <li><a href="/article/432.htm"
                                       title="获取B/S客户端IP" target="_blank">获取B/S客户端IP</a>
                                    <span class="text-muted">周凡杨</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E6%B5%8F%E8%A7%88%E5%99%A8/1.htm">浏览器</a>
                                    <div>   最近想写个B/S架构的聊天系统,因为以前做过C/S架构的QQ聊天系统,所以对于Socket通信编程只是一个巩固。对于C/S架构的聊天系统,由于存在客户端Java应用,所以直接在代码中获取客户端的IP,应用的方法为: 
   String ip = InetAddress.getLocalHost().getHostAddress(); 
然而对于WEB</div>
                                </li>
                                <li><a href="/article/559.htm"
                                       title="浅谈类和对象" target="_blank">浅谈类和对象</a>
                                    <span class="text-muted">朱辉辉33</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a>
                                    <div>    类是对一类事物的总称,对象是描述一个物体的特征,类是对象的抽象。简单来说,类是抽象的,不占用内存,对象是具体的, 
占用存储空间。 
    类是由属性和方法构成的,基本格式是public  class 类名{ 
 
 //定义属性 
 private/public 数据类型 属性名; 
 
 //定义方法 
 publ</div>
                                </li>
                                <li><a href="/article/686.htm"
                                       title="android activity与viewpager+fragment的生命周期问题" target="_blank">android activity与viewpager+fragment的生命周期问题</a>
                                    <span class="text-muted">肆无忌惮_</span>
<a class="tag" taget="_blank" href="/search/viewpager/1.htm">viewpager</a>
                                    <div>有一个Activity里面是ViewPager,ViewPager里面放了两个Fragment。 
第一次进入这个Activity。开启了服务,并在onResume方法中绑定服务后,对Service进行了一定的初始化,其中调用了Fragment中的一个属性。 
		super.onResume();
		bindService(intent, conn, BIND_AUTO_CREATE);
</div>
                                </li>
                                <li><a href="/article/813.htm"
                                       title="base64Encode对图片进行编码" target="_blank">base64Encode对图片进行编码</a>
                                    <span class="text-muted">843977358</span>
<a class="tag" taget="_blank" href="/search/base64/1.htm">base64</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E7%89%87/1.htm">图片</a><a class="tag" taget="_blank" href="/search/encoder/1.htm">encoder</a>
                                    <div>/**
	 * 对图片进行base64encoder编码
	 * 
	 * @author mrZhang
	 * @param path
	 * @return
	 */
	public static String encodeImage(String path) {
		BASE64Encoder encoder = null;
		byte[] b = null;
		I</div>
                                </li>
                                <li><a href="/article/940.htm"
                                       title="Request Header简介" target="_blank">Request Header简介</a>
                                    <span class="text-muted">aigo</span>
<a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a>
                                    <div>当一个客户端(通常是浏览器)向Web服务器发送一个请求是,它要发送一个请求的命令行,一般是GET或POST命令,当发送POST命令时,它还必须向服务器发送一个叫“Content-Length”的请求头(Request   Header)   用以指明请求数据的长度,除了Content-Length之外,它还可以向服务器发送其它一些Headers,如:    </div>
                                </li>
                                <li><a href="/article/1067.htm"
                                       title="HttpClient4.3 创建SSL协议的HttpClient对象" target="_blank">HttpClient4.3 创建SSL协议的HttpClient对象</a>
                                    <span class="text-muted">alleni123</span>
<a class="tag" taget="_blank" href="/search/httpclient/1.htm">httpclient</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/ssl/1.htm">ssl</a>
                                    <div>public class HttpClientUtils
{
	public static CloseableHttpClient createSSLClientDefault(CookieStore cookies){
		SSLContext sslContext=null;
		
		try
		{
			sslContext=new SSLContextBuilder().l</div>
                                </li>
                                <li><a href="/article/1194.htm"
                                       title="java取反 -右移-左移-无符号右移的探讨" target="_blank">java取反 -右移-左移-无符号右移的探讨</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97%E7%AC%A6+%E4%BD%8D%E7%A7%BB/1.htm">位运算符 位移</a>
                                    <div>取反:
		在二进制中第一位,1表示符数,0表示正数
		byte a = -1;
		原码:10000001
		反码:11111110
		补码:11111111
      //异或: 00000000
		byte b = -2;
		原码:10000010
		反码:11111101
		补码:11111110
      //异或: 00000001
		
	</div>
                                </li>
                                <li><a href="/article/1321.htm"
                                       title="java多线程join的作用与用法" target="_blank">java多线程join的作用与用法</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a>
                                    <div>        对于JAVA的join,JDK 是这样说的:join public final void join (long millis )throws InterruptedException Waits at most millis milliseconds for this thread to die. A timeout of 0 means t</div>
                                </li>
                                <li><a href="/article/1448.htm"
                                       title="Java发送http请求(get 与post方法请求)" target="_blank">Java发送http请求(get 与post方法请求)</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>PostRequest.java 
package com.bijian.study;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURL</div>
                                </li>
                                <li><a href="/article/1575.htm"
                                       title="【Struts2二】struts.xml中package下的action配置项默认值" target="_blank">【Struts2二】struts.xml中package下的action配置项默认值</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/struts.xml/1.htm">struts.xml</a>
                                    <div>在第一部份,定义了struts.xml文件,如下所示: 
  
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts</div>
                                </li>
                                <li><a href="/article/1702.htm"
                                       title="【Kafka十三】Kafka Simple Consumer" target="_blank">【Kafka十三】Kafka Simple Consumer</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/simple/1.htm">simple</a>
                                    <div>代码中关于Host和Port是割裂开的,这会导致单机环境下的伪分布式Kafka集群环境下,这个例子没法运行。 
实际情况是需要将host和port绑定到一起, 
  
package kafka.examples.lowlevel;

import kafka.api.FetchRequest;
import kafka.api.FetchRequestBuilder;
impo</div>
                                </li>
                                <li><a href="/article/1829.htm"
                                       title="nodejs学习api" target="_blank">nodejs学习api</a>
                                    <span class="text-muted">ronin47</span>
<a class="tag" taget="_blank" href="/search/nodejs+api/1.htm">nodejs api</a>
                                    <div>NodeJS基础 什么是NodeJS 
JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。 
每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了docum</div>
                                </li>
                                <li><a href="/article/1956.htm"
                                       title="java-64.寻找第N个丑数" target="_blank">java-64.寻找第N个丑数</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>


public class UglyNumber {

	/**
	 * 64.查找第N个丑数
具体思路可参考 [url] http://zhedahht.blog.163.com/blog/static/2541117420094245366965/[/url]
	 * 
题目:我们把只包含因子
2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14</div>
                                </li>
                                <li><a href="/article/2083.htm"
                                       title="二维数组(矩阵)对角线输出" target="_blank">二维数组(矩阵)对角线输出</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">二维数组</a>
                                    <div>

/**
二维数组 对角线输出 两个方向
例如对于数组:
{ 1, 2, 3, 4 }, 
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }, 
{ 13, 14, 15, 16 },

slash方向输出:
1 
5 2 
9 6 3 
13 10 7 4 
14 11 8 
15 12 
16 

backslash输出:
4 
3</div>
                                </li>
                                <li><a href="/article/2210.htm"
                                       title="[JWFD开源工作流设计]工作流跳跃模式开发关键点(今日更新)" target="_blank">[JWFD开源工作流设计]工作流跳跃模式开发关键点(今日更新)</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C%E6%B5%81/1.htm">工作流</a>
                                    <div>   既然是做开源软件的,我们的宗旨就是给大家分享设计和代码,那么现在我就用很简单扼要的语言来透露这个跳跃模式的设计原理 
 
   大家如果用过JWFD的ARC-自动运行控制器,或者看过代码,应该知道在ARC算法模块中有一个函数叫做SAN(),这个函数就是ARC的核心控制器,要实现跳跃模式,在SAN函数中一定要对LN链表数据结构进行操作,首先写一段代码,把</div>
                                </li>
                                <li><a href="/article/2337.htm"
                                       title="redis常见使用" target="_blank">redis常见使用</a>
                                    <span class="text-muted">cuityang</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E5%B8%B8%E8%A7%81%E4%BD%BF%E7%94%A8/1.htm">常见使用</a>
                                    <div>redis 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets 
 
引入jar包 jedis-2.1.0.jar  (本文下方提供下载) 
 
package redistest; 
 
import redis.clients.jedis.Jedis; 
 
public class Listtest</div>
                                </li>
                                <li><a href="/article/2464.htm"
                                       title="配置多个redis" target="_blank">配置多个redis</a>
                                    <span class="text-muted">dalan_123</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a>
                                    <div>配置多个redis客户端 
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi=&quo</div>
                                </li>
                                <li><a href="/article/2591.htm"
                                       title="attrib命令" target="_blank">attrib命令</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/attr/1.htm">attr</a>
                                    <div>     
attrib指令用于修改文件的属性.文件的常见属性有:只读.存档.隐藏和系统.      
  只读属性是指文件只可以做读的操作.不能对文件进行写的操作.就是文件的写保护.  
 
  存档属性是用来标记文件改动的.即在上一次备份后文件有所改动.一些备份软件在备份的时候会只去备份带有存档属性的文件.  
 </div>
                                </li>
                                <li><a href="/article/2718.htm"
                                       title="Yii使用公共函数" target="_blank">Yii使用公共函数</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a>
                                    <div>在网站项目中,没必要把公用的函数写成一个工具类,有时候面向过程其实更方便。   在入口文件index.php里添加   require_once('protected/function.php');   即可对其引用,成为公用的函数集合。   function.php如下:   
   <?php   /**     * This is the shortcut to D</div>
                                </li>
                                <li><a href="/article/2845.htm"
                                       title="linux 系统资源的查看(free、uname、uptime、netstat)" target="_blank">linux 系统资源的查看(free、uname、uptime、netstat)</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/netstat/1.htm">netstat</a><a class="tag" taget="_blank" href="/search/linux+uname/1.htm">linux uname</a><a class="tag" taget="_blank" href="/search/linux+uptime/1.htm">linux uptime</a><a class="tag" taget="_blank" href="/search/linux+free/1.htm">linux free</a>
                                    <div>linux 系统资源的查看 
转载请出自出处:http://eksliang.iteye.com/blog/2167081 
  
http://eksliang.iteye.com 一、free查看内存的使用情况 
语法如下: 
  
free [-b][-k][-m][-g] [-t]
参数含义
-b:直接输入free时,显示的单位是kb我们可以使用b(bytes),m</div>
                                </li>
                                <li><a href="/article/2972.htm"
                                       title="JAVA的位操作符" target="_blank">JAVA的位操作符</a>
                                    <span class="text-muted">greemranqq</span>
<a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a><a class="tag" taget="_blank" href="/search/JAVA%E4%BD%8D%E7%A7%BB/1.htm">JAVA位移</a><a class="tag" taget="_blank" href="/search/%3C%3C/1.htm"><<</a><a class="tag" taget="_blank" href="/search/%3E%3E%3E/1.htm">>>></a>
                                    <div>最近几种进制,加上各种位操作符,发现都比较模糊,不能完全掌握,这里就再熟悉熟悉。 
  
1.按位操作符 : 
   按位操作符是用来操作基本数据类型中的单个bit,即二进制位,会对两个参数执行布尔代数运算,获得结果。 
   与(&)运算: 
   1&1 = 1, 1&0 = 0, 0&0 &</div>
                                </li>
                                <li><a href="/article/3099.htm"
                                       title="Web前段学习网站" target="_blank">Web前段学习网站</a>
                                    <span class="text-muted">ihuning</span>
<a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a>
                                    <div>  
Web前段学习网站 
菜鸟学习:http://www.w3cschool.cc/ 
  
JQuery中文网:http://www.jquerycn.cn/ 
  
内存溢出:http://outofmemory.cn/#csdn.blog 
  
http://www.icoolxue.com/ 
  
http://www.jikexue</div>
                                </li>
                                <li><a href="/article/3226.htm"
                                       title="强强联合:FluxBB 作者加盟 Flarum" target="_blank">强强联合:FluxBB 作者加盟 Flarum</a>
                                    <span class="text-muted">justjavac</span>
<a class="tag" taget="_blank" href="/search/r/1.htm">r</a>
                                    <div>原文:FluxBB Joins Forces With Flarum作者:Toby Zerner译文:强强联合:FluxBB 作者加盟 Flarum译者:justjavac  
FluxBB 是一个快速、轻量级论坛软件,它的开发者是一名德国的 PHP 天才 Franz Liedke。FluxBB 的下一个版本(2.0)将被完全重写,并已经开发了一段时间。FluxBB 看起来非常有前途的,</div>
                                </li>
                                <li><a href="/article/3353.htm"
                                       title="java统计在线人数(session存储信息的)" target="_blank">java统计在线人数(session存储信息的)</a>
                                    <span class="text-muted">macroli</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a>
                                    <div>这篇日志是我写的第三次了 前两次都发布失败!郁闷极了! 
  
由于在web开发中常常用到这一部分所以在此记录一下,呵呵,就到备忘录了! 
我对于登录信息时使用session存储的,所以我这里是通过实现HttpSessionAttributeListener这个接口完成的。 
1、实现接口类,在web.xml文件中配置监听类,从而可以使该类完成其工作。 
public class Ses</div>
                                </li>
                                <li><a href="/article/3480.htm"
                                       title="bootstrp carousel初体验 快速构建图片播放" target="_blank">bootstrp carousel初体验 快速构建图片播放</a>
                                    <span class="text-muted">qiaolevip</span>
<a class="tag" taget="_blank" href="/search/%E6%AF%8F%E5%A4%A9%E8%BF%9B%E6%AD%A5%E4%B8%80%E7%82%B9%E7%82%B9/1.htm">每天进步一点点</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%B0%B8%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">学习永无止境</a><a class="tag" taget="_blank" href="/search/bootstrap/1.htm">bootstrap</a><a class="tag" taget="_blank" href="/search/%E7%BA%B5%E8%A7%82%E5%8D%83%E8%B1%A1/1.htm">纵观千象</a>
                                    <div>img{
			border: 1px solid white;
			box-shadow: 2px 2px 12px #333;
			_width: expression(this.width > 600 ? "600px" : this.width + "px");
			_height: expression(this.width &</div>
                                </li>
                                <li><a href="/article/3607.htm"
                                       title="SparkSQL读取HBase数据,通过自定义外部数据源" target="_blank">SparkSQL读取HBase数据,通过自定义外部数据源</a>
                                    <span class="text-muted">superlxw1234</span>
<a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/sparksql/1.htm">sparksql</a><a class="tag" taget="_blank" href="/search/sparksql%E8%AF%BB%E5%8F%96hbase/1.htm">sparksql读取hbase</a><a class="tag" taget="_blank" href="/search/sparksql%E5%A4%96%E9%83%A8%E6%95%B0%E6%8D%AE%E6%BA%90/1.htm">sparksql外部数据源</a>
                                    <div>关键字:SparkSQL读取HBase、SparkSQL自定义外部数据源 
  
  
前面文章介绍了SparSQL通过Hive操作HBase表。 
  
SparkSQL从1.2开始支持自定义外部数据源(External DataSource),这样就可以通过API接口来实现自己的外部数据源。这里基于Spark1.4.0,简单介绍SparkSQL自定义外部数据源,访</div>
                                </li>
                                <li><a href="/article/3734.htm"
                                       title="Spring Boot 1.3.0.M1发布" target="_blank">Spring Boot 1.3.0.M1发布</a>
                                    <span class="text-muted">wiselyman</span>
<a class="tag" taget="_blank" href="/search/spring+boot/1.htm">spring boot</a>
                                    <div>    Spring Boot 1.3.0.M1于6.12日发布,现在可以从Spring milestone repository下载。这个版本是基于Spring Framework 4.2.0.RC1,并在Spring Boot 1.2之上提供了大量的新特性improvements and new features。主要包含以下: 
  
1.提供一个新的sprin</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>