Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%。与Apache相比,Nginx在高并发情况下具有巨大的性能优势。
nignx的特点:
事件驱动
:通信机制采用epoll模型,支持更大的并发连接
|
5. 在Linux下的安装与运行
使用Nginx的第一步是下载Nginx源码包,例如1.0.0的下载地址为http://nginx.org/download/nginx-1.0.0.tar.gz。下载完后用tar命令解压缩,进入目录后安装过程与Linux下通常步骤无异,例如我想将Nginx安装到/usr/local/nginx下,则执行如下命令:
./configure --prefix=/usr/local/nginx make make install |
安装完成后可以直接使用下面命令启动Nginx:/usr/local/nginx/sbin/nginx。
Nginx默认以Deamon进程启动,输入下列命令:curl -i http://localhost/,就可以检测Nginx是否已经成功运行;或者也可以在浏览器中输入http://localhost/,应该可以看到Nginx的欢迎页面了。
启动后如果想停止Nginx可以使用:/usr/local/nginx/sbin/nginx -s stop。
6. 配置文件基本结构
配置文件可以看做是Nginx的灵魂,Nginx服务在启动时会读入配置文件,而后续几乎一切动作行为都是按照配置文件中的指令进行的,因此如果将Nginx本身看做一个计算机,那么Nginx的配置文件可以看成是全部的程序指令。
下面是一个Nginx配置文件的实例:
#user nobody; worker_processes 8; error_log logs/error.log; pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream;
sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on;
server { listen 80; server_name localhost; location / { root /home/yefeng/www; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } |
Nginx配置文件是纯文本文件,你可以用任何文本编辑器如vim或emacs打开它,通常它会在nginx安装目录的conf下,如我的nginx安装在/usr/local/nginx,主配置文件默认放在/usr/local/nginx/conf/nginx.conf。
其中“#”表示此行是注释,由于笔者为了学习扩展开发安装了一个纯净的Nginx,因此配置文件没有经过太多改动。
Nginx的配置文件是以block的形式组织的,一个block通常使用大括号“{}”表示。block分为几个层级,整个配置文件为main层级,这是最大的层级;在main层级下可以有event、http等层级,而http中又会有server block,server block中可以包含location block。
每个层级可以有自己的指令(Directive),例如worker_processes是一个main层级指令,它指定Nginx服务的Worker进程数量。有的指令只能在一个层级中配置,如worker_processes只能存在于main中,而有的指令可以存在于多个层级,在这种情况下,子block会继承父block的配置,同时如果子block配置了与父block不同的指令,则会覆盖掉父block的配置。指令的格式是“指令名 参数1 参数2 … 参数N;”,注意参数间可用任意数量空格分隔,最后要加分号。
在开发Nginx HTTP扩展模块过程中,需要特别注意的是main、server和location三个层级,因为扩展模块通常允许指定新的配置指令在这三个层级中。
最后要提到的是配置文件是可以包含的,如上面配置文件中“include mime.types”就包含了mine.types这个配置文件,此文件指定了各种HTTP Content-type。
一般来说,一个server block表示一个Host,而里面的一个location则代表一个路由映射规则,这两个block可以说是HTTP配置的核心。
下图是Nginx配置文件通常结构图示。
启动和停止Nginx
Nginx目前只支持命令行操作,操作前先进入Dos命令环境,并进入Nginx部署目录。
1) 启动Nginx:start nginx
2) 停止Nginx:nginx -s stop
3) 修改配置后重启:nginx -s reload
这三个命令可分别做成bat文件,放在部署目录下,方便后续操作。
start nginx.bat文件内容:start nginx
stop nginx.bat文件内容:nginx -s stop
这里配置的时候只需要修改http{}之间的内容就行了,修改的第一个地方就是设置服务器组,在http节点之间添加
upstream myServer{
server www.88181.com:80; #这里是你自己要做负载均衡的服务器地址1
server www.linux.com:8080; #这里是要参与负载均衡的地址2
}
nginx中的upstream支持下面几种方式:轮询(默认,按照时间顺序对所有服务器一个一个的访问,如果有服务器宕机,会自动剔除)、weight(服务器的方位几率和weight成正比,这个可以在服务器配置不均的时候进行配置)、ip_hash(对每个请求的ip进行hash计算,并按照一定的规则分配对应的服务器)、fair(按照每台服务器的响应时间(rt)来分配请求,rt晓得优先分配)、url_hash(按照访问url的hash值来分配请求),我这里使用了默认的轮训方式。
将请求指向myServer
location / {
proxy_pass http://myServer;
}
完整的文件(删除注释)如下:
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myServer{
server www.linux.com:80;
server www.88181.com:8080;
}
server {
listen 80;
server_name my22;
location / {
proxy_pass http://myServer;
}
}
看看效果
等所有都ok之后可硬通过浏览器访问看看效果
忘了说了,nginx代理服务器的地址为http://192.168.1.113,
浏览器输入http://192.168.1.113/index.php之后,不停的刷新,你会发现,会在
I'm the 88181、I'm the linux
nginx如何处理一个请求:
首先,
nginx
在启动时,会解析配置文件,得到需要监听的端口与
ip
地址,然后在
nginx
的
master
进程里面,先初始化好这个监控的
socket(
创建
socket
,设置
addrreuse
等选项,绑定到指定的
ip
地址端口,再
listen)
,然后再
fork(
一个现有进程可以调用
fork
函数创建一个新进程。由
fork
创建的新进程被称为子进程
)
出多个子进程出来,然后子进程会竞争
accept
新的连接。此时,客户端就可以向
nginx
发起连接了。当客户端与
nginx
进行三次握手,与
nginx
建立好一个连接后,此时,某一个子进程会
accept
成功,得到这个建立好的连接的
socket
,然后创建
nginx
对连接的封装,即
ngx_connection_t
结构体。接着,设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后,
nginx
或客户端来主动关掉连接,到此,一个连接就寿终正寝了。
当然,
nginx
也是可以作为客户端来请求其它
server
的数据的(如
upstream
模块),此时,与其它
server
创建的连接,也封装在
ngx_connection_t
中。作为客户端,
nginx
先获取一个
ngx_connection_t
结构体,然后创建
socket
,并设置
socket
的属性( 比如非阻塞)。然后再通过添加读写事件,调用
connect/read/write
来调用连接,最后关掉连接,并释放
ngx_connection_t
。
|