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/1943991008740044800.htm"
                           title="上位机知识篇---SD卡&U盘镜像" target="_blank">上位机知识篇---SD卡&U盘镜像</a>
                        <span class="text-muted"></span>

                        <div>常用的镜像烧录软件balenaEtcherbalenaEtcher是一个开源的、跨平台的工具,用于将操作系统镜像文件(如ISO和IMG文件)烧录到SD卡和USB驱动器中。以下是其使用方法、使用场景和使用注意事项的介绍:使用方法下载安装:根据自己的操作系统,从官方网站下载对应的安装包。Windows系统下载.exe文件后双击安装;Linux系统若下载的是.deb文件,可在终端执行“sudodpkg-</div>
                    </li>
                    <li><a href="/article/1943976258685693952.htm"
                           title="CentOS7环境卸载MySQL5.7" target="_blank">CentOS7环境卸载MySQL5.7</a>
                        <span class="text-muted">Hadoop_Liang</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                        <div>备份重要数据切记,卸载之前先备份mysql重要的数据。备份一个数据库例如:备份名为mydatabase的数据库到backup.sql的文件中mysqldump-uroot-ppassword123mydatabase>backup.sql备份所有数据库mysqldump-uroot-ppassword123--all-databases>all_databases_backup.sql注意:-p后</div>
                    </li>
                    <li><a href="/article/1943975626671190016.htm"
                           title="centos7安装 mysql5.7(安装包)" target="_blank">centos7安装 mysql5.7(安装包)</a>
                        <span class="text-muted">heiPony</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/mariadb/1.htm">mariadb</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                        <div>一.卸载centos7自带数据库查看系统自带的Mariadbrpm-qa|grepmariadbmariadb-libs-5.5.44-2.el7.centos.x86_64卸载rpm-e--nodepsmariadb-libs-5.5.44-2.el7.centos.x86_64删除etc目录下的my.cnfrm/etc/my.cnf二.检查mysql是否存在(有就卸载,删除相关文件)rpm-q</div>
                    </li>
                    <li><a href="/article/1943972727534710784.htm"
                           title="Linux/Centos7离线安装并配置MySQL 5.7" target="_blank">Linux/Centos7离线安装并配置MySQL 5.7</a>
                        <span class="text-muted">有事开摆无事百杜同学</span>
<a class="tag" taget="_blank" href="/search/LInux%2FCentOS7/1.htm">LInux/CentOS7</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>Linux/Centos7离线安装并配置MySQL5.7超详细教程一、环境准备1.下载MySQL5.7离线包2.使用rpm工具卸载MariaDB(避免冲突)3.创建系统级别的MySQL专用用户二、安装与配置1.解压并重命名MySQL目录2.创建数据目录和配置文件3.设置目录权限4.初始化MySQL5.配置启动脚本6.配置环境变量三、启动与验证1.启动MySQL服务2.获取初始密码3.登录并修改密码</div>
                    </li>
                    <li><a href="/article/1943971211692273664.htm"
                           title="Linux操作系统磁盘管理" target="_blank">Linux操作系统磁盘管理</a>
                        <span class="text-muted">CZZDg</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>目录一.硬盘介绍1.硬盘的物理结构2.CHS编号3.磁盘存储划分4.开机流程5.要点6.磁盘存储数据的形式二.Linux文件系统1.根文件系统2.虚拟文件系统3.真文件系统4.伪文件系统三.磁盘分区与挂载1.磁盘分区方式2.分区命令3.查看与识别命令4.格式化命令5.挂载命令四.LVM逻辑卷1.概述2.管理命令五.磁盘配额1.概述usrquota:支持对用户的磁盘配额grpquota:支持对组的磁</div>
                    </li>
                    <li><a href="/article/1943967429147291648.htm"
                           title="tcpdump交叉编译" target="_blank">tcpdump交叉编译</a>
                        <span class="text-muted">weixin_45673259</span>
<a class="tag" taget="_blank" href="/search/tcpdump/1.htm">tcpdump</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                        <div>1.下载路径官网:https://www.tcpdump.org/2.编译解压:tar-xflibpcap-1.10.4.tar.xztar-xftcpdump-4.99.4.tar.xz编译libpcap./configure--host=mips-v720s229-linux--target=mips-v720s229-linuxCC=/opt/A1/mips-gcc720-uclibc229</div>
                    </li>
                    <li><a href="/article/1943960117179379712.htm"
                           title="[特殊字符] 实时数据洪流突围战:Flink+Paimon实现毫秒级分析的架构革命(附压测报告)——日均百亿级数据处理成本降低60%的工业级方案" target="_blank">[特殊字符] 实时数据洪流突围战:Flink+Paimon实现毫秒级分析的架构革命(附压测报告)——日均百亿级数据处理成本降低60%的工业级方案</a>
                        <span class="text-muted">Lucas55555555</span>
<a class="tag" taget="_blank" href="/search/flink/1.htm">flink</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a>
                        <div>引言:流批一体的时代拐点据阿里云2025白皮书显示,实时数据处理需求年增速达240%,但传统Lambda架构资源消耗占比超运维成本的70%。某电商平台借助Flink+Paimon重构实时数仓后,端到端延迟从分钟级压缩至800ms,计算资源节省5.6万核/月。技术红利窗口期:2025年ApachePaimon1.0正式发布,支持秒级快照与湖仓一体,成为替代Iceberg的新范式一、痛点深挖:实时数仓</div>
                    </li>
                    <li><a href="/article/1943954700055408640.htm"
                           title="【Linux内核模块】Linux内核模块程序结构" target="_blank">【Linux内核模块】Linux内核模块程序结构</a>
                        <span class="text-muted">byte轻骑兵</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8FLinux%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98/1.htm">嵌入式Linux驱动开发实战</a><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>如果你已经写过第一个"HelloWorld"内核模块,可能会好奇:为什么那个几行代码的程序能被内核识别?那些module_init、MODULE_LICENSE到底是什么意思?今天咱们就来扒一扒内核模块的程序结构,搞清楚一个合格的内核模块到底由哪些部分组成,每个部分又承担着什么角色。目录一、内核模块的"骨架":最简化结构解析二、头文件:内核模块的"说明书"2.1最常用的三个头文件2.2按需添加的其</div>
                    </li>
                    <li><a href="/article/1943953314710351872.htm"
                           title="LVM逻辑卷扩容" target="_blank">LVM逻辑卷扩容</a>
                        <span class="text-muted"></span>

                        <div>目录1.逻辑卷的简介2.逻辑卷的概念3.相关命令4.建立逻辑卷1.逻辑卷的简介1.LVM是逻辑卷管理(LogicalVolumeManager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。2.LVM最大的特点就是可以对磁盘进行动态管理。使用了LVM管理分区,动态的调整分区的大小,标准分区是做不到的。2.逻辑卷的概念</div>
                    </li>
                    <li><a href="/article/1943952432815992832.htm"
                           title="Rocky Linux 8.5/CentOS 8 安装Wine" target="_blank">Rocky Linux 8.5/CentOS 8 安装Wine</a>
                        <span class="text-muted">chen_teacher</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>RockyLinux8.5/CentOS8安装Wine首先配置EPEL镜像配置方法安装Wine首先配置EPEL镜像EPEL(ExtraPackagesforEnterpriseLinux),是由FedoraSpecialInterestGroup维护的EnterpriseLinux(RHEL、CentOS)中经常用到的包。下载地址:https://mirrors.aliyun.com/epel/相</div>
                    </li>
                    <li><a href="/article/1943949028848889856.htm"
                           title="系统迁移从CentOS7.9到Rocky8.9" target="_blank">系统迁移从CentOS7.9到Rocky8.9</a>
                        <span class="text-muted"></span>

                        <div>我有两台阿里云上的服务器是CentOS7.9,由于CentOS7已经停止支持,后续使用的话会有安全漏洞,所以需要尽快迁移,个人使用的话目前兼容性好的还是RockyLinux8,很多脚本改改就能用了。一、盘点系统和迁移应用查看当前系统发行版版本cat/etc/os-release盘点迁移清单服务器应用部署方式docker镜像来源v1wordpressdockerdockerhubv1zdirdock</div>
                    </li>
                    <li><a href="/article/1943945625670316032.htm"
                           title="【Linux内核模块】Linux内核模块简介" target="_blank">【Linux内核模块】Linux内核模块简介</a>
                        <span class="text-muted">byte轻骑兵</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8FLinux%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98/1.htm">嵌入式Linux驱动开发实战</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>你是否好奇过,为什么Linux系统可以在不重启的情况下支持新硬件?为什么修改一个驱动程序不需要重新编译整个内核?这一切都离不开Linux的"模块化魔法"——内核模块(KernelModule)。作为Linux内核最灵活的特性之一,内核模块让开发者可以动态扩展内核功能,今天就来揭开这个神秘组件的面纱。目录一、什么是内核模块?1.1先打个比方:给内核装"插件"1.2技术定义:动态加载的内核代码段1.3</div>
                    </li>
                    <li><a href="/article/1943944995484528640.htm"
                           title="Linux中LVM逻辑卷扩容" target="_blank">Linux中LVM逻辑卷扩容</a>
                        <span class="text-muted"></span>

                        <div>在Linux系统中对根目录所在的LVM逻辑卷进行扩容,需要依次完成物理卷扩容➔卷组扩容➔逻辑卷扩容➔文件系统扩容四个步骤。以下是详细操作流程:一、确认当前磁盘和LVM状态#1.查看磁盘空间使用情况df-h/#2.查看块设备及LVM层级关系lsblk#3.查看LVM详细信息(物理卷PV、卷组VG、逻辑卷LV)pvdisplayvgdisplaylvdisplay二、扩容物理卷(PV)场景1:已有未分</div>
                    </li>
                    <li><a href="/article/1943943987777826816.htm"
                           title="自动化运维工程师面试题解析【真题】" target="_blank">自动化运维工程师面试题解析【真题】</a>
                        <span class="text-muted"></span>

                        <div>ZabbixAgent默认监听的端口是A.10050。以下是关键分析:选项排除:C.80是HTTP默认端口,与ZabbixAgent无关。D.5432是PostgreSQL数据库的默认端口,不涉及ZabbixAgent。B.10051是ZabbixServer的默认监听端口,用于接收Agent发送的数据,而非Agent自身的监听端口。ZabbixAgent的配置:根据官方文档,ZabbixAgen</div>
                    </li>
                    <li><a href="/article/1943930755528847360.htm"
                           title="在 Windows 上安装 Docker Desktop" target="_blank">在 Windows 上安装 Docker Desktop</a>
                        <span class="text-muted">不老刘</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</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>
                        <div>还是简单说一下,如何在Windows上安装DockerDesktop,具体步骤如下:系统要求Windows10/1164-bit(专业版、企业版或教育版,版本21H2或更高)启用WSL2(WindowsSubsystemforLinux2)或Hyper-V至少4GB内存BIOS中启用虚拟化(VT-x/AMD-V)安装步骤1.下载DockerDesktop访问Docker官网下载页面。下载Docke</div>
                    </li>
                    <li><a href="/article/1943919279413981184.htm"
                           title="【运维实战】解决 K8s 节点无法拉取 pause:3.6 镜像导致 API Server 启动失败的问题" target="_blank">【运维实战】解决 K8s 节点无法拉取 pause:3.6 镜像导致 API Server 启动失败的问题</a>
                        <span class="text-muted">gs80140</span>
<a class="tag" taget="_blank" href="/search/%E5%90%84%E7%A7%8D%E9%97%AE%E9%A2%98/1.htm">各种问题</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</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>
                        <div>目录【运维实战】解决K8s节点无法拉取pause:3.6镜像导致APIServer启动失败的问题问题分析✅解决方案:替代拉取方式导入pause镜像Step1.从私有仓库拉取pause镜像Step2.重新打tag为Kubernetes默认命名Step3.导出镜像为tar包Step4.拷贝镜像到目标节点Step5.在目标节点导入镜像到containerd的k8s.io命名空间Step6.验证镜像是否导</div>
                    </li>
                    <li><a href="/article/1943915121613008896.htm"
                           title="【Linux】进程间通信-管道通信实验" target="_blank">【Linux】进程间通信-管道通信实验</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/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a>
                        <div>要求:利用有名管道编写简单的聊天程序,聊天双方在线才能说话,一方说话后需另一方应答才能继续说话,即一来一往的聊天模式,如果输入quit则退出聊天程序。代码实现:进程A#include#include#include#include#include#include#defineFIFO_A"/tmp/chat_fifo_a"//进程A写消息,进程B读消息#defineFIFO_B"/tmp/chat</div>
                    </li>
                    <li><a href="/article/1943912847750787072.htm"
                           title="Centos7安装uwsgi详细步骤" target="_blank">Centos7安装uwsgi详细步骤</a>
                        <span class="text-muted">快乐骑行^_^</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/Centos7/1.htm">Centos7</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E8%A3%85uwsgi/1.htm">安装uwsgi</a>
                        <div>Centos7安装uwsgi详细步骤步骤一:下载源码到centos7服务器步骤二:解压步骤三:编译环境准备步骤四:进入解压目录,并且编译uwsgi步骤五:准备测试安装是否成功的python代码testUwsgi步骤六:启动uWSGI来运行一个HTTP服务器步骤七:服务器ip+端口号访问步骤一:下载源码到centos7服务器uwsgi最新版2.0.20下载地址如下:https://github.co</div>
                    </li>
                    <li><a href="/article/1943909574130069504.htm"
                           title="安装Uwsgi" target="_blank">安装Uwsgi</a>
                        <span class="text-muted"></span>

                        <div>在CentOS7里面安装Uwsgi时通常使用sudopipinstalluwsgi但是可能会遇到问题所以也可以使用yum-yinstalluwsgi来安装</div>
                    </li>
                    <li><a href="/article/1943904277726556160.htm"
                           title="Python uWSGI 安装配置" target="_blank">Python uWSGI 安装配置</a>
                        <span class="text-muted">AI老李</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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>关键要点uWSGI安装和配置适合PythonWSGI应用,资源丰富,适合初学者和中级用户。推荐菜鸟教程和官方文档,涵盖Linux和Windows环境。配置需注意操作系统差异和框架(如Django、Flask)需求。安装步骤uWSGI安装通常通过pip或源码编译完成。以下是基本步骤:Linux:安装依赖(如build-essentialpython-dev),然后用pipinstalluwsgi或编</div>
                    </li>
                    <li><a href="/article/1943891927694897152.htm"
                           title="上位机知识篇---Linux中的文件挂载" target="_blank">上位机知识篇---Linux中的文件挂载</a>
                        <span class="text-muted">Atticus-Orion</span>
<a class="tag" taget="_blank" href="/search/%E4%B8%8A%E4%BD%8D%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%AF%87/1.htm">上位机操作篇</a><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/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E4%BB%B6/1.htm">文件</a><a class="tag" taget="_blank" href="/search/%E6%8C%82%E8%BD%BD/1.htm">挂载</a>
                        <div>文章目录前言1.挂载的基本概念文件系统挂载点设备文件2.挂载的命令挂载文件系统示例卸载文件系统示例3.挂载的常用选项示例4.自动挂载(/etc/fstab文件)示例使用UUID挂载5.挂载网络文件系统(NFS)挂载NFS示例6.挂载ISO文件挂载ISO文件示例7.查看已挂载的文件系统8.挂载的注意事项9.挂载的常见问题挂载失败卸载失败10.总结前言在Linux系统中,文件挂载是指将一个文件系统(如</div>
                    </li>
                    <li><a href="/article/1943883862312546304.htm"
                           title="《C++性能优化指南》 linux版代码及原理解读 第一章" target="_blank">《C++性能优化指南》 linux版代码及原理解读 第一章</a>
                        <span class="text-muted">v俊逸</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E6%8C%87%E5%8D%97/1.htm">C++性能优化指南</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/C%2B%2B%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">C++性能优化</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a>
                        <div>概述:目录概述:性能优化的必要性:C++代码优化策略总结用好的编译器并用好编译器使用更好的算法使用更好的库减少内存分配和复制移除计算使用更好的数据结构提高并发性优化内存管理性能优化的必要性:按照当今的CPU运行速度来说,执行一条指令所需要的时间是10的-9次方的时间单位,如此快速的执行速度是否就没有性能优化的必要了呢?其实不然,性能优化与CPU的执行速度并无非常大的关系,试想一下,一段代码,如果用</div>
                    </li>
                    <li><a href="/article/1943883863096881152.htm"
                           title="《C++性能优化指南》 linux版代码及原理解读 第四章" target="_blank">《C++性能优化指南》 linux版代码及原理解读 第四章</a>
                        <span class="text-muted">v俊逸</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E6%8C%87%E5%8D%97/1.htm">C++性能优化指南</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/C%2B%2B%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E6%8C%87%E5%8D%97/1.htm">C++性能优化指南</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a>
                        <div>目录概述为什么字符串很麻烦字符串是动态分配的字符串赋值背后的操作如何面对字符串会进行大量复制写时复制COW(copyonwrite)尝试优化字符串避免临时字符串通过预留存储空间减少内存分配通过传递引用减少实参复制使用迭代器操作减少循环中的比较操作减少返回值的复制还没有结束,使用字符数组代替字符串再次优化字符串尝试其他的算法叠加以前的优化方式使用其他的编译器使用其他字符串的库功能丰富的字符串库使用s</div>
                    </li>
                    <li><a href="/article/1943881842402848768.htm"
                           title="如何在 Linux 上安装 RTX 5090 / 5080 /5070 Ti / 5070 驱动程序 — 详细指南" target="_blank">如何在 Linux 上安装 RTX 5090 / 5080 /5070 Ti / 5070 驱动程序 — 详细指南</a>
                        <span class="text-muted">知识大胖</span>
<a class="tag" taget="_blank" href="/search/NVIDIA/1.htm">NVIDIA</a><a class="tag" taget="_blank" href="/search/GPU%E5%92%8C%E5%A4%A7%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/1.htm">GPU和大语言模型开发教程</a><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>简介为了获得最佳性能,您需要在Linux上运行5090/5080/5070Ti/5070或其他50系列GPU(或Windows上的WSL)。这篇文章将包含有关如何操作的详细指南。主线内核和驱动程序怪癖之旅Nvidia50系列GPU拥有最新的Nvidia技术。但是,新硬件需要一些新软件或更新,这需要一些耐心。如果您在这里,您可能会遇到Ubuntu默认设置的障碍。不要害怕!我最近自己摸索了这个迷宫,结</div>
                    </li>
                    <li><a href="/article/1943878433025093632.htm"
                           title="STM32 CubMax 6.1.1 版本安装包" target="_blank">STM32 CubMax 6.1.1 版本安装包</a>
                        <span class="text-muted">姜奇惟Sparkling</span>

                        <div>STM32CubMax6.1.1版本安装包【下载地址】STM32CubMax6.1.1版本安装包本仓库提供STM32CubeMX6.1.1版本的安装包,支持Linux、macOS和Windows64位系统。STM32CubeMX是STMicroelectronics推出的一款图形化配置工具,能够自动生成适用于STM32微控制器的初始化代码,极大地简化了开发流程。用户只需根据操作系统选择相应的安装包</div>
                    </li>
                    <li><a href="/article/1943878433524215808.htm"
                           title="在 Linux(openEuler 24.03 LTS-SP1)上安装 Kubernetes + KubeSphere 的防火墙放行全攻略" target="_blank">在 Linux(openEuler 24.03 LTS-SP1)上安装 Kubernetes + KubeSphere 的防火墙放行全攻略</a>
                        <span class="text-muted"></span>

                        <div>目录在Linux(openEuler24.03LTS-SP1)上安装Kubernetes+KubeSphere的防火墙放行全攻略一、为什么要先搞定防火墙?二、目标环境三、需放行的端口和协议列表四、核心工具说明1.修正后的exec.sh脚本(支持管道/重定向)2.批量放行脚本:open_firewall.sh五、使用示例1.批量放行端口2.查看当前防火墙规则3.仅开放单一端口(临时需求)4.检查特定</div>
                    </li>
                    <li><a href="/article/1943868477316067328.htm"
                           title="解决Linux绑定失败地址已使用(端口被占用)的问题" target="_blank">解决Linux绑定失败地址已使用(端口被占用)的问题</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/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                        <div>文章目录解决`bindfailed:Addressalreadyinuse`问题一、问题原因1.**端口已经被其他程序占用**2.**端口处于`TIME_WAIT`状态**3.**未正确关闭套接字**二、如何排查和解决问题1.**确认端口是否被占用**2.**查找并杀掉占用端口的进程**3.**等待端口释放(`TIME_WAIT`状态)**4.**强制重用端口**(仅限开发环境)5.**使用其他端</div>
                    </li>
                    <li><a href="/article/1943865073860669440.htm"
                           title="为什么你的服务器总被攻击?运维老兵的深度分析" target="_blank">为什么你的服务器总被攻击?运维老兵的深度分析</a>
                        <span class="text-muted"></span>

                        <div>作为运维人员,最头疼的莫过于服务器在毫无征兆的情况下变得异常缓慢、服务中断,甚至数据泄露。事后查看日志,常常发现一些“莫名其妙”的攻击痕迹。为什么服务器会成为攻击者的目标?这些攻击又是如何悄无声息发生的?今天,我们就从实战角度分析几种常见且容易被忽视的攻击模式,并教你如何通过日志分析初步定位问题。一、服务器被攻击的常见“莫名其妙”原因“扫楼式”探测与弱口令爆破:现象:服务器CPU、内存无明显异常,</div>
                    </li>
                    <li><a href="/article/1943864442009743360.htm"
                           title="linux/ubuntu启动引导过程详细分析" target="_blank">linux/ubuntu启动引导过程详细分析</a>
                        <span class="text-muted">奇妙之二进制</span>
<a class="tag" taget="_blank" href="/search/%23/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/postgresql/1.htm">postgresql</a>
                        <div>文章目录**一、固件初始化阶段(BIOS/UEFI)****1.BIOS(基本输入输出系统)模式****2.UEFI(统一可扩展固件接口)模式****二、引导加载程序阶段(GRUB2)****1.GRUB2的加载过程****2.GRUB配置解析****3.内核参数传递****三、内核加载与初始化****1.内核解压缩与启动****2.initramfs(初始内存文件系统)加载****3.根文件系统</div>
                    </li>
                    <li><a href="/article/1943863558789984256.htm"
                           title="如何在Windows系统下使用Dockerfile构建Docker镜像:完整指南" target="_blank">如何在Windows系统下使用Dockerfile构建Docker镜像:完整指南</a>
                        <span class="text-muted">996蹲坑</span>
<a class="tag" taget="_blank" href="/search/windows/1.htm">windows</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>
                        <div>前言Docker作为当前最流行的容器化技术,已经成为开发、测试和运维的必备工具。本文将详细介绍在Windows系统下使用Dockerfile构建Docker镜像的完整流程,包括两种镜像构建方式的对比、Dockerfile核心指令详解、实战案例演示以及Windows系统下的特殊注意事项。一、Docker镜像构建的两种方式1.容器转为镜像(不推荐)这种方式适合临时保存容器状态,但不适合生产环境使用:#</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>