Nginx - 配置

时间:2016-06-03 19:36:28   收藏:0   阅读:199

Nginx

标签 : nginx


Nginx

    nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru, VK, and Rambler. According to Netcraft, nginx served or proxied 25.64% busiest sites in April 2016. Here are some of the success stories: Netflix, Wordpress.com, FastMail.FM.
    The sources and documentation are distributed under the 2-clause BSD-like license.
    Commercial support is available from Nginx, Inc.

技术分享

Nginx是一款轻量级的Web服务器/反向代理服务器电子邮件(IMAP/POP3)代理服务器,由俄罗斯工程师Igor Sysoev开发,供俄国大型入口网站及搜索引擎Rambler使用.其源代码以BSD-like协议发布. 其特点是内存占用少,并发能力强, 因此被国内很多大型网站(如京东/淘宝)采用. 
(主页/介绍/文档).


编译安装

目录 描述
conf nginx配置文件
html 网页文件
logs nginx日志文件
sbin nginx可执行文件

Nginx信号

关于Linux信号相关知识, 可参考系列博客Linux信号实践, 在此, 我们仅介绍Nginx捕获的几个信号.

nginx can be controlled with signals.

信号名 作用
TERM/INT fast shutdown
QUIT graceful shutdown
HUP changing configuration, keeping up with a changed time zone , starting new worker processes with a new configuration, graceful shutdown of old worker processes
USR1 re-opening log files
USR2 upgrading an executable file
WINCH graceful shutdown of worker processes

以上信号作用亦可通过编译出的nginx二进制文件实现:

To start nginx, run the executable file. Once nginx is started, it can be controlled by invoking the executable with the -s parameter. Use the following syntax: 
nginx -s signal


配置

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#运行服务的用户及用户组 </span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#user  nobody;</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#工作进程数(一般设置为CPU数*核心数)</span>
worker_processes  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#全局错误日志(位置/级别) </span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#error_log  logs/<span class="hljs-keyword" style="box-sizing: border-box;">error</span>.log;</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#error_log  logs/<span class="hljs-keyword" style="box-sizing: border-box;">error</span>.log  notice;</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#error_log  logs/<span class="hljs-keyword" style="box-sizing: border-box;">error</span>.log  info;</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#PID文件</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#pid        logs/nginx.pid;</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#工作模式及连接数上限</span>
events {

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 采用epoll进行IO复用</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># use epoll;</span>

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 单进程所允许的最大连接数</span>
    worker_connections  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1024</span>;
}


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

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#                  '$status $body_bytes_sent "$http_referer" '</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#                  '"$http_user_agent" "$http_x_forwarded_for"';</span>

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#access_log  logs/access.log  main;</span>

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#是否激活sendfile()函数</span>
    sendfile        on;
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#将HTTP响应头压缩到一个包中发送,仅在sendfile开启时才能使用</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#tcp_nopush     on;</span>

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#keepalive_timeout  0;</span>
    keepalive_timeout  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">65</span>;

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#开启gzip模块</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#gzip  on;</span>

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#设定虚拟主机,默认监听80端口,可配置多个</span>
    server {
        listen       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">80</span>;
        server_name  localhost;

        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#charset koi8-r;</span>

        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#access_log  logs/host.access.log  main;</span>

        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 页面存放位置</span>
        location / {
            <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 页面存放根目录</span>
            root   html;
            <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 默认页面</span>
            index  index.html index.htm;
        }

        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#error_page  404              /404.html;</span>

        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># redirect server <span class="hljs-keyword" style="box-sizing: border-box;">error</span> pages to the static page /50x.html</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span>
        error_page   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">502</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">503</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">504</span>  /<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">50</span>x.html;
        location = /<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">50</span>x.html {
            root   html;
        }

        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># proxy the PHP scripts to Apache listening on 127.0.0.1:80</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#location ~ \.php$ {</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    proxy_pass   http://127.0.0.1;</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#}</span>

        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#location ~ \.php$ {</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    root           html;</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    fastcgi_pass   127.0.0.1:9000;</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    fastcgi_index  index.php;</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    include        fastcgi_params;</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#}</span>

        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># deny access to .htaccess files, <span class="hljs-keyword" style="box-sizing: border-box;">if</span> Apache's document root</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># concurs with nginx's one</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#location ~ /\.ht {</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    deny  all;</span>
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#}</span>
    }


    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># another virtual host using mix of IP-, name-, and port-based configuration</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#server {</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    listen       8000;</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    listen       somename:8080;</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    server_name  somename  alias  another.alias;</span>

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    location / {</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#        root   html;</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#        index  index.html index.htm;</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    }</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#}</span>


    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># HTTPS server</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#server {</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    listen       443 ssl;</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    server_name  localhost;</span>

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    ssl_certificate      cert.pem;</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    ssl_certificate_key  cert.key;</span>

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    ssl_session_cache    shared:SSL:1m;</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    ssl_session_timeout  5m;</span>

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    ssl_ciphers  HIGH:!aNULL:!MD5;</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    ssl_prefer_server_ciphers  on;</span>

    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    location / {</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#        root   html;</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#        index  index.html index.htm;</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#    }</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#}</span>
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li></ul>

Server

在Nginx内可配置虚拟主机, 只需在nginx.conf中添加一个server元素:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">server {
    listen <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">801</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    server_name www<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.feiqing</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.me</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    location / {
        root   /www<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.feiqing</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.me</span>/<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        index  index<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.html</span> index<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.htm</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

Log

<code class="hljs nginx has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">log_format</span>  fq_log_format   <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$remote_addr</span> - <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$remote_user</span> [<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$time_local</span>] "<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$request</span>" '</span>
        <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$status</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$body_bytes_sent</span> "<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$http_referer</span>" '</span>
        <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'"<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$http_user_agent</span>" "<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$http_x_forwarded_for</span>"'</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
<code class="hljs vbscript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">access_log logs/www.feiqing.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">me</span>.access.<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">log</span> fq_log_format;
   启用<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">log</span>       <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">log</span>位置                     <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">log</span>格式</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">server {
    listen <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">801</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    access_log logs/www<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.feiqing</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.me</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.access</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.log</span> main<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    server_name www<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.feiqing</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.me</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    location / {
        root   /www<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.feiqing</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.me</span>/<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        index  index<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.html</span> index<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.htm</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

Location

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Syntax:     location [ = | ~ | ~* | ^~ ] uri { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> }
location @name { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> }
Default:    —
Context:    server, location</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

Sets configuration depending on a request URI. 
Nginx允许自定义location块,通过指定的模式客户端请求的URI相匹配,Nginx可将网站根据URI进行划分,将网站的不同部分定位到不同的处理方式上:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">server {
    server_name     www<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.feiqing</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.me</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    location /admin/ {
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># The configuration you place here only applies to http://www.feiqing.me/admin/</span>
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
修饰符 描述
@ 指定一个命名的location,一般只用于内部重定向请求
= 精确匹配模式: URI的定位必须与指定的模式精确匹配
(无) 一般匹配模式: URI的定位必须以指定模式开始, 不可以使用正则表达式
~ 区分大小写的正则匹配模式: 客户端请求URI与指定正则表达式匹配必须区分大小写
~* 不区分大小写的正则匹配模式
^~ 类似于(无)模式的行为, URI的定位必须以指定模式开始, 不同的是, 如果模式匹配, 那么Nginx就停止搜索其他模式
!~/!~* 分别为区分大小写不匹配和不区分大小写不匹配的正则
/ 通用匹配, 任何请求都会匹配到
<code class="hljs javascript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">location ~* ^<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/\w*admin\w*/</span> {
    root   /<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span>/www/regexp/;
    index  index.html;
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

关于location详细内容可参考Nginx-ngx_http_core_module模块文档.


Rewrite

Rewrite用于实现URI重写, URI重写可以让我们在改变网站结构时,无需修改原先暴露出去的URL, 并且在一定程度上提高网站安全性;

The ngx_http_rewrite_module module is used to change request URI using regular expressions, return redirects, and conditionally select configurations.

Nginx的Rewrite的实现依赖于PCRE(Perl Compatible Regular Expressions:Perl兼容正则表达式)库, 因此在编译Nginx前, 需要确保系统中已经包含该依赖.

注意: 正则表达式的元字符{}会与nginx.conf中block定界符{ ... }有冲突, 如果需要在nginx.conf内写一个包含花括号的正则表达式,需要将表达式放在单引号/双引号之间.

如果其中某步URI被重写,则重新循环执行1-3步,直到找到真实存在的文件. 但循环次数不能超过10次, 否则Nginx返回500-Internal Server Error.


指令

if 指令

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Syntax:     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (condition) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> }
Default:    —
Context:    server, location</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

if条件可以是如下内容:

condition 描述
一个变量名 只有该变量是空字符串或者以0开始的字符串, 才为false
使用=/!= 比较一个变量和字符串
使用~/~* 变量与正则表达式进行匹配的变量
使用-f/!-f 检查一个文件是否存在
使用-d/!-d 检查一个目录是否存在
使用-e/!-e 检查一个文件、目录、符号链接是否存在
使用-x/!-x 检查一个文件是否可执行
<code class="hljs perl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">location ~* ^<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/\w*admin\w*/</span> {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$request_method</span> = GET) {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">405</span>;
    }

    root   /var/www/regexp/;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>.html;
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>
<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$http_user_agent</span> ~ MSIE) {
    rewrite ^(.*)$ /msie/<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
}

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$http_cookie</span> ~* <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"id=([^;]+)(?:;|$)"</span>) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">set</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$id</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$1</span>;
}

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$request_method</span> = POST) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">405</span>;
}

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$slow</span>) {
    limit_rate <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>k;
}

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$invalid_referer</span>) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">403</span>;
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>

break 指令

<code class="hljs http has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-attribute" style="box-sizing: border-box;">Syntax</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">    break;</span>
<span class="hljs-attribute" style="box-sizing: border-box;">Default</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">   —</span>
<span class="hljs-attribute" style="box-sizing: border-box;">Context</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">   server, location, if</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

return 指令

<code class="hljs vbnet has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Syntax: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> code [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">text</span>];
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> code URL;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> URL;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Default</span>:    —
Context:    server, location, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

该指令用于直接向客户端返回响应状态码,从0.8.42版本起,return支持响应URL重定向(对于301/302/303/307),或者文本响应(对于其他状态码).

注意: 对于302/307, 返回的URL中应包含"http://"/"https://".对于文本或者URL重定向可以包含变量.

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$http_user_agent</span> ~ Chrome) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">302</span> http:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//www.baidu.com;</span>
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

set 指令

<code class="hljs http has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-attribute" style="box-sizing: border-box;">Syntax</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">    set $variable value;</span>
<span class="hljs-attribute" style="box-sizing: border-box;">Default</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">   —</span>
<span class="hljs-attribute" style="box-sizing: border-box;">Context</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">   server, location, if</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

rewrite 指令

<code class="hljs http has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-attribute" style="box-sizing: border-box;">Syntax</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">    rewrite regex replacement [flag];</span>
<span class="hljs-attribute" style="box-sizing: border-box;">Default</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">   —</span>
<span class="hljs-attribute" style="box-sizing: border-box;">Context</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">   server, location, if</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

注意: 接收到的URI不包含host地址(如example.com), 也不包含URL中的请求参数(如?arg1=value1&arg2=value).


实例-伪静态化

使用Rewrite功能将JavaWeb中的动态URL(xx.do?arg1=xx&arg2=xx)以静态URL替换(xx-xx-xx.html).

<code class="hljs perl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">server {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">listen</span>       <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">800</span>;
        server_name  localhost;

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#charset koi8-r;</span>

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#access_log  logs/host.access.log  main;</span>

        location / {
            root   html;
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>.html <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>.htm;
        }

        location ~* (<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/javis/teacher</span><span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/).*(.html)$ {
        rewrite /javis</span><span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/teacher/</span>(\w+)-(\w+)-(\w+)\.html /javis/teacher/<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$1</span>.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">do</span>?name=<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$2</span>&password=<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$3</span>;
        }

        location ~* \.(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">do</span>|jsp|jspx)?$ {
            proxy_set_header X-Forwarded-For <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$remote_addr</span>;
            proxy_pass http:<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10.45</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">156.170</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">80</span>;
        }

    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul>

location ~* (/javis/teacher/).*(.html)$ { ... }会拦截所有/javis/teacher/ 目录下以.html结尾的静态URL,将其重写为.do结尾的动态URL(/javis/teacher/login-new_name-password.html -> /javis/teacher/login.do?name=new_name&password=password ), 然后location ~* \.(do|jsp|jspx)?$ { ... }提供反向代理功能,将所有以.do结尾的URL转发到http://10.45.156.170:80地址, 由Java的后端Server提供真正的服务(反向代理相关知识可参考我的下一篇Nginx博客).


Gzip

Gzip(GNU-ZIP)是一种压缩技术,经压缩后的页面可能只有原大小的30%,大大减小了网络传输开销,浏览器加载网页的速度也会提升不少,但这项技术需要浏览器的配合(在服务端对网页进行压缩, 在浏览器对其解压并解析),由于现代浏览都支持很多种解压缩的方式(如Chrome:Accept-Encoding:gzip, deflate, sdch), 因此浏览器方面不需要我们担心. 
Nginx的gzip模块是内置的, 由ngx_http_gzip_module 模块实现, 可在nginx.conf中配置使用:

The ngx_http_gzip_module module is a filter that compresses responses using the “gzip” method. This often helps to reduce the size of transmitted data by half or even more.


指令

Context: http, server, location, Gzip一共有9个指令可以设置:

指令 描述
gzip on | off; Enables or disables gzipping of responses.
gzip_buffers number size; Sets the number and size of buffers used to compress a response. By default, the buffer size is equal to one memory page. This is either 4K or 8K, depending on a platform.
gzip_comp_level level; Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9(推荐压缩级别为6).
gzip_disable regex ...; Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions.
gzip_min_length length; Sets the minimum length of a response that will be gzipped. The length is determined only from the“Content-Length” response header field.
gzip_http_version 1.0 | 1.1; Sets the minimum HTTP version of a request required to compress a response(default 1.1).
gzip_types mime-type ...; Enables gzipping of responses for the specified MIME types in addition to “text/html”. The special value “*” matches any MIME type (0.8.29). Responses with the “text/html” type are always compressed.
gzip_vary on | off; Enables or disables inserting the “Vary: Accept-Encoding” response header field if the directives gzip, gzip_static, or gunzip are active.
gzip_proxied [flag]; Enables or disables gzipping of responses for proxied requests depending on the request and response. The fact that the request is proxied is determined by the presence of the “Via” request header field. The directive accepts multiple parameters -> details

实例-常用Gzip配置

<code class="hljs applescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">http {
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## ...</span>

    gzip  <span class="hljs-function_start" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">on</span></span>;
    gzip_min_length <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1024</span>;
    gzip_buffers <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16</span>k;
    gzip_comp_level <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>;
    gzip_types <span class="hljs-type" style="box-sizing: border-box;">text</span>/plain <span class="hljs-type" style="box-sizing: border-box;">application</span>/x-javascript <span class="hljs-type" style="box-sizing: border-box;">application</span>/javascript <span class="hljs-type" style="box-sizing: border-box;">application</span>/xml <span class="hljs-type" style="box-sizing: border-box;">text</span>/css ;
    gzip_vary <span class="hljs-function_start" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">on</span></span>;

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## ...</span>
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

为了使Nginx能够在全局范围内使用gzip,故将其放在http全局模块中.如果需要对各个虚拟主机区别对待,可在对应的server块中添加自己的gzip指令.

通过以上Nginx服务器访问一个网页(前提: Content-Length > 1024), 会看到静态资源文件的Response中新增了如下三个响应头:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-constant" style="box-sizing: border-box;">Content</span>-<span class="hljs-constant" style="box-sizing: border-box;">Encoding</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:gzip</span>
<span class="hljs-constant" style="box-sizing: border-box;">Transfer</span>-<span class="hljs-constant" style="box-sizing: border-box;">Encoding</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:chunked</span>
<span class="hljs-constant" style="box-sizing: border-box;">Vary</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:Accept-Encoding</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

注意: 
1. 由于图片/视频/音频之类文件压缩比率很小, 且压缩过程非常耗费CPU资源, 因此这类资源推荐不对其压缩. 
2. 较小的文件压缩后很有可能会比原文件还大, 因此这类资源也推荐不对其压缩.


Expires

对于网站图片,尤其是新闻网站,图片一旦发布,改动的可能非常小.因此我们希望用户在第一访问之后,图片直接缓存在浏览器,而不再向服务端发送请求(不同于HTTP-304-Not Modified), 且能够自定义缓存配置.这就用到了Nginx的expires功能.

<code class="hljs vbnet has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Syntax: expires [modified] time;
expires epoch | max | <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">off</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Default</span>:    
expires <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">off</span>;
Context:    http, server, location, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> location</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

实例-图片缓存

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">location ~* (jpg|png|jpeg|gif)<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>{
    expires <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>d;
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

通过以上Nginx服务器访问一个图片(如nginx.png),会看到图片的Response中添加了如下两个响应头:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-constant" style="box-sizing: border-box;">Cache</span>-<span class="hljs-constant" style="box-sizing: border-box;">Control</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:max-age=</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">86400</span> 
<span class="hljs-constant" style="box-sizing: border-box;">Expires</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:Fri</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span> <span class="hljs-constant" style="box-sizing: border-box;">May</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2016</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">26</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">11</span> <span class="hljs-constant" style="box-sizing: border-box;">GMT</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

再次刷新该URL, 在浏览器(如Chrome)中会看到这张图片来自本地缓存: 
技术分享


原文:http://blog.csdn.net/yulei2008_/article/details/51566423

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!