目录
什么是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开发从入门到精通
更多文章, 请支持我的个人博客