nginx安装好的文件位置:
/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放静态文件
/var/log/nginx:存放日志
如果忘记nginx的配置文件位置,可以用nginx -t
命令查看,显示如下:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
其实从上面的根目录文件夹可以知道,Linux系统的配置文件一般放在/etc,日志一般放在/var/log,运行的程序一般放在/usr/sbin或者/usr/bin。
nginx 有一个主进程和几个工作进程,主进程的作用是读取配置文件,管理工作进程,工作进程做真正的处理请求。nginx 采用event-based 模型和OS-dependent机制更有效地把请求分发给各个工作进程。工作进程的数量已经在配置文件中定义,可以是固定的数目也可以根据CPU核的数量动态地调整。
nginx和各个模块的工作方式都已经在配置文件中定义。默认情况下文件的名称是nginx.conf.
配置文件的结构
nginx各个模块都是通过指定的配置文件进行控制的。
指令可以是单独的指令,也可以是块指令,单独的指令相当于一条语句,包含指令的名称,和参数之间通过空格断开,指令的最后用分号结束。块指令和单独的指令有相同的语法结构,除了块指令是用一系列的{}来表示结尾。块指令里面的指令称之为内容,比如(events, http, server location).
在配置文件中,如果指令在所有的指令之外称这个指令为主指令,events 和http就是主指令,server在http之内,locaton在server之内。
其余的以#开头的指令都是注释的内容。
静态内容服务
服务器的一个重要功能就是静态网络服务比如图片和静态的html网页。下面是一个实例,取决于需求,文件可以放置在不同的目录中,比如/data/www/(包含着html文件)以及/data/images/(包含图片)。这需要编辑配置文件,在http指令中包含server指令然后包含两个location位置。
第一步是创建一个sample.html的网页文件放到/dada/www目录中,然后在/data/images/目录中放置一些图片
下面是一个最简单的html示例
<html>
<head></head>
<body>hello</body>
</html>
接下来是打开配置文件,默认的配置文件已经有些服务器指令实例,绝大部分都需要注释掉它们。
先注释掉所有的指令,写上如下指令块
按照刚刚解释的内容
http {
server {
}
}
通常来说配置文件可以很多的server块指令,每个server都是通过监听的端口号区别开。一旦nginx决定是哪个server处理请求,它就会打开location中的相对应的文件夹来获取URI指定的内容。
在location块指令中增加如下内容
location / {
root /data/www;
}
这个位置会和前面的指定的URI相比对,URI会加上root指令内的路径,也就是/data/www,去组成需要文件的路径。如果这里有好几个同时满足location位置的路径,location会提供最短路径的那个,如果其它的路径都不能够提供相对应的文件。
现在增加第二个locaiton指令
location /images/ {
root /data;
}
它需要请求路径中包含/images/,前面说道的 / 也是满足要求的,在这个路径不满足的情况下,会使用 / 路径。
下面是一个完整的html配置文件
http {
server / {
root /data/www;
}
server /images/ {
root /data;
}
}
这个配置文件会监听标准的80端口,可以通过http://localhost/进行访问。如果一个URI请求以/images/开头,那么这个server指令就会发送/data/images目录下的文件,比如回应http://localhost/images/example.png,nginx服务器会发送/data/images/example.png文件。如果这个文件不存在,nginx会提醒404错误。不是以/images开头的URI请求会被映射到/data/www目录中。比如URI地址是http://localhost/some/examples.html,服务器会发送/data/www/some/examples.html文件。
需要配置重新生效,需要执行下面的指令nginx -s reload
在一些条件下服务器可能没有像上述描述的工作,你可以检查access.log或者error.log文件,通常是在/usr/local/nginx/logs/或者/var/log/nginx目录下。
建立简单的代理服务器(proxy server)
nginx服务起还有一个经常被使用的用途是当做代理服务器,代理服务器的意思是指一个服务起接收到请求,然后把这个请求传递给受理服务器(proxied servers)处理,然后从受理服务器中得到相应的回应发送给请求对象。
下面会配置一个基本的代理服务器,这个服务器的作用是对于图片请求会直接在本地进行处理,其它的请求都会发送个给受理服务器进行处理。在这个例子中,两个server都定义在一个nginx实例中。
首先,定义一个受理服务器,在nginx配置文件中加入一个server块指令
server {
listen 8080;
root /data/up1;
location / {
}
}
这个简单的服务器指令配置监听8080端口(之前的服务器端口没有指定是因为已经默认配置了标准的80端口),对于所有的请求都会用本地的/data/up1目录。
创建这个文件,然后放置一个index.html文件到其中。注意root指令放置在server指令中,在location中没有包含自己的root指令的时候这个server的root指令就会被location指令使用。
下一步使用之前已经学习的服务器配置,修改它让它成为一个代理服务器。在location块指令中,放置一个proxy_pass指令,名字 受理服务器指定的端口号,,这里使用(http://localhost:8080):
server {
location / {
proxy_pass http://localhost:8080;
}
locaiton /images/ {
root /data;
}
}
接着我们修改上面第二个的location块指令,它会把所有/images/前缀的请求映射到服务器的/data/images/目录下,为了是它能够只响应指定文件的请求,需要更改location块指令:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
这个参数是一个正则表达式,对应所有的以.gif .jpg .png结尾的URI请求。一个正则表达式应该以~开头。对应的请求会被映射到/data/images目录下。
nginx服务器在处理用户请求的时候,首先会检查有特殊前缀的location指令,记住最长的location指令的前缀,然后再检查正则表达式。如果这里有一个合乎要求的的正则表达式,nginx会选择这个location指令,如果没有则会选择之前的。
下面是一个代理服务器的配置
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
这个服务器会过滤出所有以.gif .jpg .png结尾的请求,然后把它们映射到/data/images目录下(URI地址加上root指令的参数),会把其它的所有的请求发送到上述配置的受理服务器中。
为了使新的配置生效,需要发送reload信号给nginx服务器。
设置快速FastCGI代理
nginx可以把请求路由到FastCGI服务器中,FastCGI服务器里可以有各种架构以及使用各种编程语言比如php。
最简单的FastCGI配置是讲proxy_pass指令改成fastcgi_pass指令,fastcgi_param指令将请求传递给FastCGI服务器。假设一个FastCGI服务起可以通过localhost:9000端口访问,以之前配置代理服务器为基础,可以将配置文件写成下面这个样子。
server {
location / {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
这个会将所有的的除了静态图片的请求路由到FastCGI服务器中。