发光的椰子 發表於 2023-11-11 00:00:00

PHP程序员玩转Linux系列 nginx初学者引导

<p>
        PHP程序员玩转Linux系列文章:</p>
<p>
        1.PHP程序员玩转Linux系列-怎么安装使用CentOS</p>
<p>
        2.PHP程序员玩转Linux系列-lnmp环境的搭建</p>
<p>
        3.PHP程序员玩转Linux系列-搭建FTP代码开发环境</p>
<p>
        4.PHP程序员玩转Linux系列-备份还原MySQL</p>
<p>
        5.PHP程序员玩转Linux系列-自动备份与SVN</p>
<p>
        6.PHP程序员玩转Linux系列-Linux和Windows安装nginx</p>
<p>
        <strong>翻译自官网文档</strong></p>
<p>
        nginx有一个master进程和很多个worker进程.master进程的主要目的是读取和执行配置文件,维持worker进程.worker进程真正处理请求.nginx基于事件模型和操作系统来分配worker进程,配置文件中的worker进程数一般配置成CPU的内核数.默认的配置文件名是<span>nginx.conf</span>,目录地址一般在<span>/usr/local/nginx/conf, /etc/nginx</span>, 或者<span>/usr/local/etc/nginx</span></p>
<p>
        <strong>开始,关闭和重载配置</strong></p>
<p>
        nginx 开启</p>
<p>
        nginx -s reload 重新载入配置文件</p>
<p>
        nginx -s quit 优雅的退出</p>
<p>
        nginx -s reopen 重新打开日志文件</p>
<p>
        <strong>静态内容服务</strong></p>
<p>
        打开配置文件,里面已经包含了一个server块的例子</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_665924">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">http {</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">server {</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">}</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        默认的nginx配置文件<span>nginx.conf</span>里面,使用include指令包含了<span>/etc/nginx/conf.d/</span>此目录下后缀为.conf的所有配置文件</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_523575">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">http {</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">include </code><code class="bash plain">/etc/nginx/mime</code><code class="bash plain">.types;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">default_type application</code><code class="bash plain">/octet-stream</code><code class="bash plain">;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                         </div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">log_format main </code><code class="bash string">'$remote_addr - $remote_user [$time_local] "$request" '</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash spaces">   </code><code class="bash string">'$status $body_bytes_sent "$http_referer" '</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash spaces">   </code><code class="bash string">'"$http_user_agent" "$http_x_forwarded_for"'</code><code class="bash plain">;</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                         </div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">access_log </code><code class="bash plain">/var/log/nginx/access</code><code class="bash plain">.log main;</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                         </div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">sendfile on;</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash comments">#tcp_nopush on;</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                         </div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">keepalive_timeout 65;</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                         </div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash comments">#gzip on;</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                         </div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">include </code><code class="bash plain">/etc/nginx/conf</code><code class="bash plain">.d/*.conf;</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="bash plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        在<span>/etc/nginx/conf.d/目</span>录下,编辑<span>default.conf</span>文件,通常会有很多的配置文件,每个配置文件中都有一个<span>server</span>块,<span>nginx</span>通过他们监听的端口和<span>server_name</span>来区分,它还会对请求头和server块里面location指令参数比较.</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_43292">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">server {</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">location / {</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">root </code><code class="bash plain">/var/www/html</code><code class="bash plain">;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">}</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        这个location块指定了"/"前缀,比较请求的URI,对于匹配到的URI,这个URI会被拼接到root指令指定路径的后面.换句话说,在本地文件系统中去构成路径,就是去请求/var/www/html.</p>
<p>
        如果这里有很多location指令,nginx会选择最长前缀的.上面的location块提供了一个最短前缀,只有当其他所有的location都没有匹配到,才会使用它.</p>
<p>
        下一步,增加第二个localtion块</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_379884">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">server {</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">location / {</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">root </code><code class="bash plain">/var/www/html</code><code class="bash plain">;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">}</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">location </code><code class="bash plain">/images/</code> <code class="bash plain">{</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">root </code><code class="bash plain">/data</code><code class="bash plain">;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">}</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="bash plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        当请求以<span>/images/</span>开始,第二个location将会匹配到 (<span>location / </span>也会匹配到这个请求,但是他的前缀比第二个短)</p>
<p>
        现在它已经可以作为web服务的配置文件正常工作了,监听80端口.在本地机器输入<span>http://localhost</span>就可以访问到该服务.当请求URI以/images/开头,服务器会响应<span>/data/images</span>目录下的文件.举例:当请求是<span>http://localhost/images/example.png,nginx</span>会响应/data/images/example.png文件.如果该文件不存在,nginx会响应404错误.</p>
<p>
        当请求的URI不以<span>/images/</span>开头,该请求会被映射到/var/www/html目录.举例:请求的URI是http://localhost/some/example.html,nginx会响应<span>/var/www/html/some/example.html</span>文件.</p>
<p>
        应用新的配置,开启nginx或者发送reload信号给nginx的master进程,执行以下命令:</p>
<p>
        nginx -s reload</p>
<p>
        万一有不可预料的错误发生,去<span>access.log </span>和<span>error.log</span>中找原因,这两个文件的目录在/usr/local/nginx/logs或者/var/log/nginx</p>
<p>
        <strong>配置简单的反向代理服务</strong></p>
<p>
        nginx最常用的功能就是作为反向代理服务器,意味着这个服务要接收请求,把请求引到被代理的服务,从那里取回响应,发送给客户端.</p>
<p>
        我们将配置基本的反向代理服务器,这个服务处理来自本地目录的图片文件的请求,并把其他的所有请求发给代理服务器.在这个例子中,两个服务都会被定义在一个nginx实例中.</p>
<p>
        首先,定义一个代理服务器,在nginx配置文件中新添加一个server块,如下:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_21590">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">server {</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">listen 8080;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">root </code><code class="bash plain">/data/up1</code><code class="bash plain">;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                         </div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">location / {</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">}</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        这个简单的服务监听8080端口(之前,我们没有使用过listen指令,因为默认是监听的80端口),映射所有的请求到本地文件系统的<span>/data/up1</span>目录.创建这个目录,在里面放入<span>index.html</span>文件.注意root指令放在了server上下文了.当<span>location</span>块下没有root指令时,这个root指令将会被使用.</p>
<p>
        下一步,使用上一步中的服务配合,修改一下作为反向代理服务器配置.在第一个location块中,添加一个proxy_pass指令,在参数中指明协议名和代理服务的端口(在本例,它是http://localhost:8080)</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_649022">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">server {</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">location / {</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">proxy_pass http:</code><code class="bash plain">//localhost</code><code class="bash plain">:8080;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">}</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                         </div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">location ~ \.(gif|jpg|png)$ {</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">root </code><code class="bash plain">/data/images</code><code class="bash plain">;</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">}</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="bash plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        在第二个<span>location</span>块中,参数是个正则表达式,匹配所有后缀是.gif.jpg或者.png的请求,使用正则表达式,应该在前面加上~ .符合的请求将会被映射到/data/images目录下</p>
<p>
        <strong>配置FastCGI代理服务</strong></p>
<p>
        nginx可以用作去路由请求到FastCGI服务,这样就可以运行一些各种框架和PHP的应用</p>
<p>
        最基本的nginx配置,使用<span>fastcgi_pass</span>指令替换proxy_pass指令<span>,fastcgi_param</span>指令设置传递给FastCGI服务器的参数.假定FastCGI服务器运行在localhost:9000.把上一部分中的反向代理配置例子拿过来,修改参数为<span>localhost:9000.</span>在PHP中,SCRIPT_FILENAME参数被用作确定脚本名称<span>,QUERY_STRING </span>被用作传递请求参数,配置如下:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_597182">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">server {</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">location / {</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">fastcgi_pass localhost:9000;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">fastcgi_param QUERY_STRING $query_string;</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">}</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                         </div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">location ~ \.(gif|jpg|png)$ {</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">root </code><code class="bash plain">/data/images</code><code class="bash plain">;</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">}</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="bash plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        现在就创建了一个服务,这个服务将路由出了静态图片文件之外的所有请求到被代理的服务器.这个被代理的服务器是通过FastCGI协议运行在<span>localhost:9000</span>上的.</p>
<p>
        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
        原文链接:http://www.cnblogs.com/taoshihan/p/6674019.html</p>
頁: [1]
查看完整版本: PHP程序员玩转Linux系列 nginx初学者引导