Nginx简明教程

目录

  • 什么是Nginx

  • 为什么是Nginx

    • Nginx相比Apache的优点

    • Apache相比Nginx的优点

  • 示例代码

  • 反向代理

    • url的/问题
  • 负载均衡

  • 页面缓存

  • 小结

什么是Nginx

Nginx官网的定义如下

nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server

为什么是Nginx

除了Nginx, Web Server的老大哥应该是Apache HTTP Server(httpd, 下文简称Apache), Apache和Nginx一起支撑了互联网上超过50%的流量

那为什么我们要重点介绍Nginx呢

Nginx相比Apache的优点

  • 轻量级

  • 配置简洁

  • 高并发(实现基于异步非阻塞)

  • 高静态处理能力

Apache相比Nginx的优点

  • PHP支持更好

  • 插件多, 而Nginx部分插件需要收费或自己编译

  • 高动态处理能力

综上所述, 通常

  • Nginx用作静态和反向代理服务器, 处理前端静态请求

  • Apache用作动态代理服务器, 处理后端动态请求

示例代码

为了验证nginx配置, 写了一个简单的服务器程序, 完成的Demo代码可以参考这里的StudyNginx, 其中

  • url显示的内容如下
/                                Welcome to Express
/users                       users
/proxy                       proxy
/proxy/users             proxy/users
  • 运行的端口号为3000

反向代理

反向代理是Nginx最常用的功能之一, 配置如下

server {
    location / {                             
            proxy_pass http://127.0.0.1:3000;
    }
}

执行

sudo service nginx restart

重启nginx后, 使用服务器ip访问各url效果如下

server-ip/                         Welcome to Express
server-ip/users                users
server-ip/proxy                proxy
server-ip/proxy/users   proxy/users

url的/问题

在设置反向代理proxy_pass时, 在url后面加不加"/"有区别么? 我们来实际看下效果

  • 不加/
server {
    location / {                              
    }                                         
                                              
    location /proxy/ {                         
            proxy_pass http://127.0.0.1:3000; 
    }
}

重启nginx后, 使用服务器ip访问各url效果如下

server-ip/                        Welcome to Nginx <-- 发生改变
server-ip/users                Page Not Found <-- 发生改变
server-ip/proxy                proxy
server-ip/proxy/users   proxy/users
  • 加上/
server {
    location / {                              
    }                                         
                                              
    location /proxy/ {                         
            proxy_pass http://127.0.0.1:3000/; 
    }
}

重启nginx后, 使用服务器ip访问各url效果如下

server-ip/              Welcome to Nginx <-- 发生改变
server-ip/user                  Page Not Found <-- 发生改变
server-ip/proxy                Welcome to Express <-- 发生改变
server-ip/proxy/users   users <-- 发生改变

从上面的例子可以看出

如果proxy_pass的url中加上"/", 那么反向代理会去掉location部分

负载均衡

当服务器压力越来越大, 就需要考虑用多台服务器提供服务, 这样Nginx就又可以"变身"负载均衡服务器

配置方法如下

upstream server-name  {
    server server-ip-01;
    server server-ip-02;
}

server{ 
    server_name server-name; 
    location / { 
        proxy_set_header   Host             $host; 
        proxy_set_header   X-Real-IP        $remote_addr; 
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; 
    } 
}

负载均衡需要多台设备, 所以这里没有提供实例

页面缓存

开启页面缓存的方式就是在nginx.conf中添加如下

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:200m inactive=24h max_size=1g;

其中需要解释下的是keys_zone选项

keys_zone=STATIC:200m, 表示这个zone名称为STATIC, 分配的内存大小为200MB

接着, 在server中使用该缓存

server {
    proxy_cache STATIC; 
    proxy_cache_key $host$uri$is_args$args; 
    proxy_cache_valid 200 304 10m;
}

这样, 我们的页面缓存就开启啦

验证配置

反向代理, 负载均衡, 页面缓存的配置虽然简单, 但是都是纯文本, 所以难免会出现一些拼写错误, 有什么办法可以验证Nginx配置是否有效么?

使用的命令和输出如下

~ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

想要了解更多Nginx命令的使用可以查看手册"man nginx"

小结

从上面的介绍已经可以看出, Nginx还是非常小巧强大的

当然还有诸如: URL重写及读写分离等功能没有涉及, 更多讨论在实际开发中摸索后, 再和大家继续讨论分享

参考

  • Nginx 和 Apache 各有什么优缺点?

  • Apache vs Nginx: Practical Considerations

  • Nginx服务器的反向代理proxy_pass配置方法讲解

  • Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

  • Nginx开发从入门到精通

更多文章, 请支持我的个人博客

你可能感兴趣的:(Nginx简明教程)