Nginx是什么
看了很多教程,我理解nginx 比apache,iis,tomcat等web服务器的优势是,nginx可以更好的支持高并发。传统的web服务器在应对数以万计的http请求,无论是创建进程还是创建线程来应对这些请求,都会消耗大量的cpu和内存。但是nginx通过事件驱动的方式来处理大规模并发连接,是自己获得更好的性能。
参考资料
- 官方的文档应该是一个最好的解释 :
http://www.nginx.cn/doc/- taobao团队发布的nginx文档:
http://wiki.jikexueyuan.com/project/nginx/nginx-framework.html- 另外,关于nginx使用,常用功能配置配置的教程:
http://www.yiibai.com/nginx/beginners_guide.html
如何安装:
http://www.cnblogs.com/piscesLoveCc/p/5794926.html
#update :在安装的时候,最好加上 --with-stream
#nginx刚刚开始的时候是不支持tcp协议的,在nginx 1.9的版本之后,nginx增加了stream木块,用于tcp代理和负载均衡。编译的时候,通过with-stream参数来激活这个模块
./configure --prefix=/usr/local/nginx --with-stream
查看linux状态的两个常用命令:
#查看进程
ps -aux | grep nginx
#查看监听的端口
netstat -atunlp #a 表示all,t表示tcp,u表示udp,n表示port number,p表示pid,l表示listenning
Nginx的常用命令
#nginx 的正常关闭,重新加载配置文件,快速关闭
# -s 表示发送信号
nginx -s [quit | reload | stop ]
nginx -s stop #nginx关闭
nginx -s reload #nginx 重新启动
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/ngxin.conf #nginx以指定的配置文件运行
nginx -t #nginx测试配置文件
nginx -v #查看nginx版本
#查看log
tailf nginx/logs/error.log
Nginx使用和修改配置文件
NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。 默认情况下,文件名为nginx.conf。
配置文件里面有几个顶级指令:
- events : 一般连接处理
- http : http协议流量
- mail : mail协议流量
- stream : tcp协议流量
这个内容有点多,新写了一篇博客 :
http://www.jianshu.com/p/7e4d54ba6dc8
用Nginx做的一些好玩的
Demo :nginx 实现web-server负载均衡
让nginx监听在80端口,然后其在启动两个flask的web server,分别监听5000和5001端口。nginx 将请求分发到这两个flask 的web server上面,实现一个负载均衡。
配置如下:
在nginx/conf/nginx.conf 文件里面的http块下面 创建
#upstream
upstream pyserver{
server 127.0.0.1:5000;
server 127.0.0.1:5001;
}
在server块下面创建location
location /upstream {
proxy_pass http://pyserver;
}
flask web server1 的配置如下:
from flask import Flask
#from flask.ext.script import Manager
app=Flask(__name__)
@app.route('/upstream')
def upstream():
return '<h1>pyserver1 port 5000 </h1>'
if __name__=='__main__':
app.run(debug=True)
#manager.run()
flask web server2 的配置如下:
from flask import Flask
#from flask.ext.script import Manager
app=Flask(__name__)
@app.route('/upstream')
def upstream():
return '<h1>pyserver1 port 5001 </h1>'
if __name__=='__main__':
app.run(debug=True,port=5001)
#manager.run()
效果:
#如果不停的执行下面的命令,可以看出来每次输出的结果都不同
curl 127.0.0.1/upstream
这两个页面交替出现,说明nginx的配置是work的,每次的请求被负载到不同的服务器上面。
Demo:nginx 配置tcp流量转发,实现ssh可以访问内网主机
在学习nginx 的时候,发现nginx 不仅可以实现http请求的转发和负载均衡,同时也可以实现tcp协议级别的转发和负载均衡。于是,尝试着用nginx配置一个tcp流的转发,可以实现用ssh访问内网的主机,发现还是很好玩的。
下图是我的想法:
实现过程:
配置nginx.conf 文件里面,创建一个stream的块
#注意这个块不在http块里面,与http块和event块是平行的
#这个配置表示,对于nginx运行的主机的10001的tcp请求转发到127.0.0.1:22端口
#为了演示方便,我把这个改成了本地的ip
stream{
upstream ssllink12{
server 127.0.0.1:22;
}
server{
listen 10001;
proxy_connect_timeout 20s;
proxy_timeout 5m;
proxy_pass ssllink12;
}
}
效果:
#-p表示给ssh的连接指定一个端口
ssh zhaozheng@127.0.0.1 - p 10002
Demo3:搭建一个自己的代理服务器
做完了demo2的tcp转发,突然有一个想法,就是搭建一个自己的代理服务器。在实验室的一个机器上面部署(实验室是可以免费上网的),然后在寝室或者是在图书馆的时候,通过校园内网,让实验室的这个机器作为代理服务器上网,这样自己岂不是可以可以不用交宽带的费用了~~~
step1 : 在nginx的配置文件里面nginx.conf的http块下面
#nginx 监听8080端口,并且转发对于这个端口的http请求
server {
listen 8080;
server_name localhost;
location / {
resolver 8.8.8.8;
proxy_pass $scheme://$http_host$request_uri;
}
}
step2 :
这是实验室的网络拓扑
这是有一个小问题,就是我的这台设备只能拿到一个私有的ip地址,是不可以被访问的,所有要在在实验室的路由器上面实现一个端口的绑定,如下图所示,就是将 路由器的wan ip +20003端口的流量转发到 我的设备的8080端口。
step3 :
在客户机上面的internet选项里面,设置代理。这个表示将client的请求转发到这个ip+端口上面。
step4 :
尝试一下在客户机上面上网,是可以的!但是这个有一个问题,就是当访问使用https的站点的时候,就出问题了。
查看log的时候,也证明了这一点,对于没有https的站点,都是可以的,对于https的站点,就不行。