NGINX 配置文件笔记

配置文件组成部分

  • main 用于进行 nginx 全局信息的配置
  • events 用于 nginx 工作模式的配置
  • http 用于进行 http 协议信息的一些配置
  • server 用于进行服务器访问信息的配置
  • location 用于进行访问路由的配置
  • upstream 用于进行负载均衡的配置

Nginx中的web配置

  • http {} 由 ngx_http_core_module 模块所引入

server 模块

server 模块配置是 http 模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息

location 模块

location 模块是 nginx 配置中出现最多的一个配置,主要用于配置路由访问信息
在路由访问信息配置中关联到反向代理等各项功能,所以 location 模块也是一个非常重要的配置模块

location [ = | ~ | ~* | ^~ ] uri {
    ...
}

允许根据用户请求的 URI 来匹配定义的各 location;

  • = 精确匹配检查
  • ~ 正则表达式模式匹配检查,区分字符大小写;
  • ~*正则表达式模式匹配检查,不区分字符大小写;
  • ^~ URI 的前半部匹配,不支持正则表达式;

匹配的优先级 = > ^~ > ~ > ~* > 不带任何符号的 location

反向代理配置方式

location / {
    proxy_pass http://localhost:8888;
}

以上是最简单的基础配置,详细配置见下。

upstream 模块

upstream 模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器

虚拟主机

一台主机上运行许多站点,这些站点通过Host来甄别。因此,通过这种方式配置的站点,称为虚拟主机

server {
    listen 80 default_server;
    server_name _;
    return 444; # 过滤其他域名的请求,返回444状态码
}
# 通过反向代理提供服务
server {
    listen 80;
    server_name www.aaa.com; # www.aaa.com域名
    location / {
        proxy_pass http://localhost:8080; # 对应端口号8080
    }
}
# 直接通过nginx提供web服务
server {
    listen 80;
    server_name www.bbb.com; # www.bbb.com域名
    index index.html
    root /var/www/html
}

FastCGI

Nginx 本身不支持 PHP 等语言,但是它可以通过 FastCGI 来将请求扔给某些语言或框架处理(例如 PHP、Python、Perl)。

server {
    listen 80;
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /phpFilePath$fastcgi_script_name; # PHP文件路径
        fastcgi_pass 127.0.0.1:9000; # PHP-FPM地址和端口号
        # 另一种方式:
        # fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
}

Nginx 中的常用正则

正则说明
.匹配除换行符以外的任意字符 $ 匹配字符串的结束
?重复 0 次或 1 次 {n} 重复 n 次
+重复 1 次或更多次 {n,} 重复 n 次或更多次
*重复 0 次或更多次 [c] 匹配单个字符 c
\d匹配数字 [a-z] 匹配 a-z 小写字母的任意一个
^匹配字符串的开始
$匹配字符串的结束
{n,}重复 n 次或更多次
[a-z]匹配 a-z 小写字母的任意一个
[c]匹配单个字符 c

nginx 中的全局变量

变量说明
$args这个变量等于请求行中的参数,同$query_string
$request_filename当前请求的文件路径,由 root 或 alias 指令与 URI 请求生成。
$schemeHTTP 方法(如 http,https)
$request_uri包含请求参数的原始 URI,不包含主机名,如:/foo/bar.php?arg=baz
$uri不带请求参数的当前 URI,$uri 不包含主机名,如/foo/bar.html
$host请求主机头字段,否则为服务器名称。
$request_method客户端请求的动作,通常为 GET 或 POST

负载均衡

upstream模块能够使用 3 种负载均衡算法:轮询、IP 哈希、最少连接数。

  • 轮询

默认情况下使用轮询算法,不需要配置指令来激活它,它是基于在队列中谁是下一个的原理确保访问均匀地分布到每个上游服务器

  • IP 哈希

通过ip_hash指令来激活,Nginx 通过 IPv4 地址的前 3 个字节或者整个 IPv6 地址作为哈希键来实现,同一个 IP 地址总是能被映射到同一个上游服务器

  • 最少连接数

通过least_conn指令来激活,该算法通过选择一个活跃数最少的上游服务器进行连接。如果上游服务器处理能力不同,可以通过给server配置weight权重来说明,该算法将考虑到不同服务器的加权最少连接数。

轮询 (默认策略)

upstream my-server {
    server 192.168.1.100:8000 weight=2; #轮询权重
    server 192.168.1.100:8001 down; # 表示该主机暂停服务
    server 192.168.1.100:8002 max_fails=3; # max_fails:表示失败最大次数,超过失败最大次数暂停服务
    server 192.168.1.100:8003 fail_timeout=20s; # 表示如果请求受理失败,暂停指定的时间之后重新发起请求
    server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
server {
    listen       80;
    server_name  localhost;
    client_max_body_size 1024M;

    location / {
        proxy_pass http://my-server;
        proxy_set_header Host $host:$server_port;
    }
}

ip_hash

上面的 2 种方式都有一个问题,

那就是下一个请求来的时候请求可能分发到另外一个服务器,

当我们的程序不是无状态的时候(采用了 session 保存数据),这时候就有一个很大的很问题了,

比如把登录信息保存到了 session 中,那么跳转到另外一台服务器的时候就需要重新登录了,

所以很多时候我们需要一个客户只访问一个服务器,那么就需要用 iphash 了

iphash 的每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,

可以解决 session 的问题。

upstream test {
    ip_hash;
    server localhost:8080;
    server localhost:8081;
}

server 指令可选参数

  • weight 设置一个服务器的访问权重,数值越高,收到的请求也越多;
  • fail_timeout 在这个指定的时间内服务器必须提供响应,如果在这个时间内没有收到响应,那么服务器将会被标记为 down 状态;
  • max_fails 设置在 fail_timeout 时间之内尝试对一个服务器连接的最大次数,如果超过这个次数,那么服务器将会被标记为 down;
  • down 标记一个服务器不再接受任何请求;
  • backup 一旦其他服务器宕机,那么有该标记的机器将会接收请求。

屏蔽 ip

可以放入 http, server, location, limit_except 语句块

deny IP;   # 屏蔽单个ip访问
allow IP;  # 允许单个ip访问
deny all;  # 屏蔽所有ip访问
allow all; # 允许所有ip访问
deny 123.0.0.0/8   # 屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令
deny 124.45.0.0/16 # 屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令
deny 123.45.6.0/24 # 屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令

# 如果你想实现这样的应用,除了几个IP外,其他全部拒绝
allow 1.1.1.1;
allow 1.1.1.2;
deny all;

重定向

  • permanent 永久性重定向。请求日志中的状态码为 301
  • redirect 临时重定向。请求日志中的状态码为 302

重定向整个网站

server {
    server_name old_name;
    return 301 $scheme://new_name$request_uri;
}

重定向单页

server {
    location = /oldpage.html {
        return 301 http://mydomain.com/newpage.html;
    }
}

重定向整个子路径

server {
    location /old-dir {
        rewrite ^/old-dir/(.*) http://mydomain.com/new-dir/$1 permanent;
    }
}

性能

缓存

location /static {
    root /data;
    expires max;
    # 不要缓存
    # expires -1;
}
  • 文件缓存
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
  • SSL 缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

Gzip 压缩

http compression method is not secure in https, opens you up to vulnerabilities like BREACH, CRIME

这个一般给http使用的。

gzip  on;
gzip_buffers 16 8k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
    text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
    text/javascript application/javascript application/x-javascript
    text/x-json application/json application/x-web-app-manifest+json
    text/css text/plain text/x-component
    font/opentype application/x-font-ttf application/vnd.ms-fontobject
    image/x-icon;
gzip_disable  "msie6";

防盗链

location ~* \.(gif|jpg|png|swf|flv)$ {
   root html
   valid_referers none blocked *.nginxcn.com;
   if ($invalid_referer) {
     rewrite ^/ www.nginx.cn
     #return 404;
   }
}

虚拟目录配置

location /img/ {
    # 访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
    alias /var/www/image/; # alias 是绝对的路径
}
location /img/ {
    # 访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。]
    root /var/www/image; # root 指定目录的上级目录
}

屏蔽.git 等文件

location ~ (.git|.gitattributes|.gitignore|.svn) {
    deny all;
}

域名路径去除文件后缀

rewrite ^/(.*)/$ /index.php?/$1 permanent;
if (!-d $request_filename){
        set $rule_1 1$rule_1;
}
if (!-f $request_filename){
        set $rule_1 2$rule_1;
}
if ($rule_1 = "21"){
        rewrite ^/ /index.php last;
}

ssl 配置

配置 ssl 需要证书,可以去letsencrypt申请。

当然,你也可以自己生成证书,只不过浏览器不会信任罢了。

这里不再累述。

# 监听端口,启用http2
listen 443 ssl http2;
listen [::]:443 ssl http2;


# 启用 session resumption 提高HTTPS性能
# http://vincent.bernat.im/en/blog/2011-ssl-session-reuse-rfc5077.html
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;

# open dhparam -out dhparam.pem 2048
# ssl_dhparam 未配置,将导致 ssllabs.com 的评分降到 B
# 并给 This server supports weak Diffie-Hellman (DH) key exchange parameters. Grade capped to B. 的警告。
#
# DHE密码器的Diffie-Hellman参数, 推荐 2048 位
ssl_dhparam /etc/nginx/ssl/dhparam.pem;


# 启用服务器端保护, 防止 BEAST 攻击
# http://blog.ivanristic.com/2013/09/is-beast-still-a-threat.html
# sl_prefer_server_ciphers on 也是一个必要的配置,否则会 A+ 变成 A-;*
# 如果你需要兼容老系统或老浏览器的话,你需要配置 ssl_ciphers,详见 Mozilla Server_Side_TLS 的介绍,Nginx 里面 ssl_ciphers 默认值是 HIGH:!aNULL:!MD5; ref
ssl_prefer_server_ciphers on;
# 禁用 SSLv3(enabled by default since nginx 0.8.19) since it's less secure then TLS http://en.wikipedia.org/wiki/Secure_Sockets_Layer#SSL_3.0
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# ciphers chosen for forward secrecy and compatibility
# http://blog.ivanristic.com/2013/08/configuring-apache-nginx-and-openssl-for-forward-secrecy.html
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';


# 启用 ocsp stapling (网站可以以隐私保护、可扩展的方式向访客传达证书吊销信息的机制)
# http://blog.mozilla.org/security/2013/07/29/ocsp-stapling-in-firefox/
# cloudflare dns
resolver 1.1.1.1 1.0.0.1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/cert.pem;

# http compression method is not secure in https
# opens you up to vulnerabilities like BREACH, CRIME
gzip off;

# 启用 HSTS(HTTP Strict Transport Security) https://developer.mozilla.org/en-US/docs/Security/HTTP_Strict_Transport_Security
# 避免 ssl stripping https://en.wikipedia.org/wiki/SSL_stripping#SSL_stripping
# 或 https://hstspreload.org/
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";


# 验证 SSL
# 访问 ssllabs.com 输入你的域名,检查 SSL 的配置是否都正常:
# https://ssllabs.com/ssltest/analyze.html?d=xxx.com
# 确保验证结果有 A 以上,否则根据提示调整问题


# 配置SSL证书
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;

参考 nginx 配置文件

#定义 Nginx 运行的用户和用户组
user www www;

#nginx 进程数,建议设置为等于 CPU 总核心数。
worker_processes 8;  #也可以auto

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

# 进程文件
pid /var/run/nginx.pid;

#一个 nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值 ulimit -n)与 nginx 进程数相除,但是 nginx 分配请求并不均匀,所以建议与 ulimit -n 的值保持一致。
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events {
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
    # epoll 模型是 Linux 2.6 以上版本内核中的高性能网络 I/O 模型,如果跑在 FreeBSD 上面,就用 kqueue 模型。
    use epoll;
    #单个进程最大连接数(最大连接数=连接数\*进程数)
    worker_connections 65535;
}

#设定 http 服务器
http{

    include mime.types; #文件扩展名与文件类型映射表

    default_type application/octet-stream; #默认文件类型

    #charset utf-8; #默认编码

    server_names_hash_bucket_size 128; #服务器名字的 hash 表大小

    client_header_buffer_size 32k; #上传文件大小限制

    large_client_header_buffers 4 64k; #设定请求缓

    client_max_body_size 8m; #设定请求缓

    #开启高效文件传输模式,
    # sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用设为 on,
    # 如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,降低系统的负载。
    # 注意:如果图片显示不正常把这个改成 off。
    sendfile on;

    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。

    tcp_nopush on; #防止网络阻塞

    tcp_nodelay on; #防止网络阻塞

    keepalive_timeout 120; #长连接超时时间,单位是秒

    #FastCGI 相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip 模块设置
    gzip on; #开启 gzip 压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认 1.1,前端如果是 squid2.5 请使用 1.0)
    gzip_comp_level 2; #压缩等级

    #压缩类型,默认就已经包含 text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个 warn。
    gzip_types text/plain application/x-javascript text/css application/xml;

    gzip_vary on;

    #limit_zone crawler \$binary_remote_addr 10m; #开启限制 IP 连接数的时候需要使用

    # upstream 负载均衡
    upstream server1 {
        #upstream 的负载均衡,weight 是权重,可以根据机器配置定义权重。
        # weigth 参数表示权值,权值越高被分配到的几率越大。
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;
    }

    #虚拟主机的配置
    server{
        #监听端口
        listen 80;
        #域名可以有多个,用空格隔开
        server_name www.ha97.com ha97.com;

        index index.html index.htm index.php;
        root /data/www/ha97;
        location ~ .*\.(php|php5)?\${
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
        #图片缓存时间设置
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
            expires 10d;
        }
        #JS和CSS缓存时间设置
        location ~ .*\.(js|css)?$ {
            expires 1h;
        }

        #日志格式设定
        log_format access '$remote_addr – $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';

        #定义本虚拟主机的访问日志
        access_log /var/log/nginx/access.log access;

        #对根目录"/" 启用反向代理
        location / {
            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

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

        #设定查看 Nginx 状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file conf/htpasswd;
            #htpasswd 文件的内容可以用 apache 提供的 htpasswd 工具来产生。
        }

        #本地动静分离反向代理配置 #所有 jsp 的页面均交由 tomcat 或 resin 处理
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }

        #所有静态文件由 nginx 直接读取不经过 tomcat 或 resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)\$ {
            expires 15d;
        }

        location ~ .\_.(js|css)?\${
            expires 1h;
        }

    } #server

} # end http
Last modification:August 30th, 2020 at 11:37 pm
要饭啦~