linux Nginx安装配置网站根目录教程实例



Nginx安装配置网站根目录教程实例。

安装:#./configure && make && make install
是否成功:#nginx -v
启动:#nginx    #默认配置文件为conf/nginx.conf
#nginx -c /etc/nginx/nginx.conf    #指定配置文件
#nginx -t -c /etc/nginx/nginx.conf    #仅测试配置文件,而不启动Nginx
快速关闭(quick exit):#nginx -s stop    #可能不保存相关信息,并迅速终止web服务
优雅关闭(graceful exit):#nginx -s quit    #保存相关信息,有安排的结束web服务
重启:#nginx -s reload    #重新加载配置文件,等价于关闭再启动
重开:#nginx -s reopen    #重新打开日志文件
杀死所有进程:#killall -9 nginx
代理服务器:接受请求,转发给其他服务器,获取响应,转发给客户端。
正向代理(forward proxy):客户端需要设置才能使用,在客户端访问互联网等价于在正向代理服务器访问互联网,用来翻墙和网页缓冲。
反向代理(backward proxy):接收客户端的请求,转发给后端多个服务器,获取响应,再转发给客户端,用来负载均衡和网页缓冲。
正向代理和反向代理都是代理,只是正向代理偏客户端,反向代理偏服务器端而已。
Nginx采用模块化结构设计,由内核和模块组成。
内核负责把请求映射到相应的location,而location中的指令则通过模块实现相应的功能。
Nginx模块从结构上分为核心模块、基本模块和第三方模块。
Core核心模块:HTTP模块、Event模块、Mail模块
基本模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块、HTTP Rewrite模块
第三方模块:HTTP Upstream Request Hash模块、Notice模块、HTTP Access Key模块
Nginx模块从功能上分为处理器模块、过滤器模块和代理类模块。
处理器模块(Handler):直接处理请求,输出内容和修改header信息等。
过滤器模块(Filter):修改其他处理器模块输出的内容,再由Nginx输出。
代理类模块(Proxy):与后端一些服务如FastCGI等进行交互,实现代理功能。
HTTP请求 -> Nginx内核 -> Handler -> Filter_1 -> Filter_2 -> … -> Filter_n -> HTTP响应
映射HTTP请求:
(1)选择server:在listen值(ip和port)相匹配的server中,选择与server_name值相匹配的server,如果没有,选择listen值带”default_server”的server,如果还没有,选择(listen值相匹配的)第一个server。
(2)选择location:首先,忽略location在server中的顺序,找出前缀匹配最准确的location,然后,按照location在server中的顺序,选择第一个匹配正则表达式的location,如果一个都没有,选择之前找到的前缀匹配最准确的location。
匹配虚拟主机名(server_name):可以是确切名字,通配符名字,正则表达式名字,当存在多个匹配,优先选择:
(1)确切的名字
(2)最长的以星号开始的通配符名字,如*.example.com
(3)最长的以星号结束的通配符名字,如mail.*
(4)第一个匹配的正则表达式名字(按出现的顺序)
通配符名字:只能在起始处或结尾处包含一个星号,形如”www.*.example.com”或”w*.example.com”都是非法的。星号可以匹配多个节,如”*.example.com”匹配www.example.com,也匹配www.sub.example.com。
正则表达式名字:必须以”~”开头,域名中的”.”需要用”\”转义,含有”{“和”}”的正则表达式必需用”"引起来,如”~^(?<name>\w\d{1,3}+)\.example\.net$”,捕获组(?<name>)在后面可以当变量使用:
server {
    server_name ~^(www\.)?(?<domain>.+)$;
    location / {
        root /sites/$domain;
    }
}
效率:确切名字 > 通配符名字 > 正则表达式名字。所以尽可能地使用确切名字,比方说,如果使用example.org和www.example.org访问服务器是最频繁的,那么可以这样定义:server_name example.org www.example.org *.example.org;

 

root指令:指定根目录。
error_log logs/error.log;
http{
    server {
        listen 80;
        server_name localhost;
        root /home/lzm/www;
        location / { index index.html index.htm; }
}
访问出错:403 Forbidden
查看日志文件:tail -f -n 100 logs/error.log
显示错误:”/home/lzm/www/index.html” is forbidden (13: Permission denied)
查看nginx进程的权限:ps aux|grep nginx,发现主进程是root的,工作进程是nobody的。
在nginx.conf中指定子进程的用户和用户组:
user lzm;    #user指令的语法:user user [group];
重启Nginx即可,此时工作进程是lzm的,就不存在权限问题了。

 

连接处理方法:select、poll、kqueue(FreeBSD, Mac OS X)、epoll(Linux 2.6+)等。Nginx默认选择最有效的连接方式,我们也可以用use指令选择特定的连接方式,如:
use select;    #使用select连接处理方法
注:epoll、kqueue都是网络I/O模型,目前Linux下能够承受高并发访问的Squid、Memcached都采用epoll网络I/O模型。

 

用信号(signal)控制Nginx:
Nginx的主进程运行时,它的进程ID号会写进logs/nginx.pid中。
kill -HUP `/usr/local/nginx/logs/nginx.pid`    #发送HUP信号
主进程可以处理的信号:
TERM, INT:快速关闭。
QUIT:从容关闭。
HUP:重载配置,启动新配置的工作进程,从容关闭旧的工作进程。
USR1:重新打开日志文件。打开新的log文件,关闭旧的log文件。
USR2:平滑升级可执行程序。启动新的主进程和工作进程。之后可以发送WINCH信号给旧的主进程,从容关闭旧的工作进程,之后可以再发送QUIT信号给旧的主进程,从容关闭旧的主进程。(注意,启动新的主进程后,旧的主进程的进程ID会写进nginx.pid.oldbin中,新的主进程的进程ID会写入nginx.pid中。)
WINCH:正常关闭工作进程。
工作进程可以处理的信号:
TERM, INT:快速关闭。
QUIT:正常关闭。
USER1:重新打开日志文件。

 

配置HTTPS服务器:暂时不需要。

 

重定向:
Apache例子1:
RewriteCond  %{HTTP_HOST}  example.org
RewriteRule  (.*)  http://www.example.org$1
对应的Nginx配置为:
server {
    listen 80;
    server_name example.org;
    return 301 http://www.example.org$request_uri;    #301表重定向
}
server {
    listen 80;
    server_name www.example.org;
    …
}
Apache例子2:
RewriteCond  %{HTTP_HOST}  !example.com
RewriteCond  %{HTTP_HOST}  !www.example.com
RewriteRule  (.*)  http://www.example.com$1
对应的Nginx配置为:
server {
    listen 80;
    server_name example.com www.example.com;
    …
}
server {
    listen 80 default_server;
    server_name _;
    return 301 http://example.com$request_uri;
}