nginx启动+控制+配置文件

/usr/local/nginx/nginx    #启动

/usr/local/nginx/nginx -s reload    #重新加载配置文件,不需重启nginx进程


nginx.conf配置文件详解

nginx的配置文件相比apache,比较清晰、简单,大致分为几块:

main
events    {
    ....
}
http    {
    ...
    upstream PROJECT_NAME    {        ##负载均衡服务器IP列表
        ...
    }
    
    server    {
        ...
        location    {
            ...
        }
    }
    ...
}

六个主要区域(模块)

main(全局设置)、events(nginx工作模式)、http(http设置)、server(主机设置)、location(URL匹配)、upstream(负载均衡服务器设置)


main模块

main区域,是一个全局设置:

  1. user nginx;

  2. worker_processes auto;

  3. error_log  /var/log/nginx/error.log  notice;

  4. pid        /run/nginx/nginx.pid;

  5. worker_rlimit_nofile 1024;

user:指定nginx进程的运行用户及用户组,user nginx nginx;

worker_processes:指定nginx要开启的子进程数,每个nginx进程平均消耗10-20M内存。如果多核cpu,建议指定和cpu数量一样的进程数即可。写2就会开启2个子进程,加上主进程,共3个nginx进程。

error_log:用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit。其中debug输出日志最详细,crit输出日志最少。

pid:指定nginx进程id存储的文件路径。

worker_rlimit_nofile:指定一个nginx进程可以打开的最多文件描述符数目,如果是65535(linux系统允许打开的最大文件描述符),需要配合ulimit -n 65535(系统默认1024)。


events模块

用于指定nginx的工作模式和连接数限制

events {
    use epoll; #linux平台
    worker_connections  1024;
}

use:指定nginx的工作模式。nginx支持工作模式有select、poll、kqueque、epoll、rtsig和/dev/poll。其中select和poll是标准(默认)工作模式,kqueque和epoll是高效工作模式,不同的是epoll用在linux平台上,kqueque用在BSD系统中(mac系统属于BSD平台)。对于linux系统,epoll是首选。

worker_connections: 指定nginx每个进程的最大连接数,默认是1024。最大客户连接数=worker_processes*worker_connections。

作为反向代理时MaxClients=worker_processes*worker_connections/2 。


http模块

最核心的模块,负责http服务器相关属性的配置:反向代理、负载均衡、虚拟目录等配置。里面包含server和upstream子模块。

http{
    default_type   application/octet-stream;
    
    log_format main    '$remote_addr - $remote_user [$time_local] "$request" ' 
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_xforwarded_for"';
    access_log        /var/log/nginx/access.log main;
    
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    
    keeplive_timeout    10;
    
    #gzip on;
    
    upstream Project_Name{
        ...
    }
    
    server    {
        ...
    }
}

default_type:设定默认的类型为二进制流,当文件类型未定义时使用该默认类型。例如在没有配置asp的locate环境时,nginx是不予解析的,此时浏览器访问asp文件就会出现下载。

log_format:定义日志输出的格式。此处定义main类型,下面access_log有使用已定义main类型。

    main类型格式输出如下(可以增删部分字段):

127.0.0.1 - - [21/Apr/2015:18:09:54 +0800] "GET /index.php HTTP/1.1" 200 87151 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36"

例如:定义日志类型submain

 log_format  submain   '$remote_user [$time_local]  $remote_addr  "$request" '
                       'status: $status '
                       'bodyBytes: $body_bytes_sent '
                       '$http_x_forwarded_for '
                       '$upstream_addr '
                       'ups_resp_time: $upstream_response_time '
                       'request_time: $request_time';
日志输出:
- [06/Sep/2017:15:55:54 +0800]  - 27.27.227.252  GET /proxy/lottery/game/category/cqssc/drew?_salt=566896&condition=%7B%22status%22:300%7D&curpage=1&perpage=30&sort=%7B%22publish_time%22:-1%7D&token=352bd13359af8ec5d80ef HTTP/1.1 status: 200 bodyBytes: 3081 - 45.116.146.133:80 ups_resp_time: 0.047 request_time: 0.047

access_log:用来指定记录用户请求的日志文件路径,后面的main日志格式类型,对应log_fromat中定义的main类型。

sendfile:用于开启高效文件传输。tcp_nopush和tcp_nodelay on用于防止网络阻塞。

keepalive_timeout:设置客户端连接保持活动的超时时间。超过该时间,系统会关闭回收该连接。


server模块

属于http模块的子模块,用来定义一个虚拟主机

server    {
    listen        80 default_server;
    listen        443 ssl;
    server_name   www.test.com x.x.x.x;
    root          /usr/share/nginx/html;
    include /etc/nginx/default.d/*.conf;
    
    charset utf-8;
    access_log /var/log/nginx/access_test.log;
    error_log  /var/log/ngnx/access_test.log;
    ...
}

listen:用于指定该server虚拟主机监听的端口,主流80http,443 ssl是https,也可以是任意端口(未被占用),指定后nginx进程会开启并监听该端口。default_server默认主机,如果请求到80端口,未被其他端口匹配,则会被分配到该默认主机。

server_name:用于匹配请求的域名。可以是域名,也可以IP,多个用空格分开。用户请求的域名匹配到该字段定义的域名,则通过该server主机处理。

root:指定该server虚拟主机的根目录,和locate{}中的root需要区分

include:请求如果没有匹配成功该server,则可读取conf.d/中的配置文件

charset:设置网页编码格式,默认utf-8

access_log:指定该server下请求成功的访问日志

error_log:指定该server下请求不成功的错误日志。


location模块

是nginx配置中最重要的模块,与配置负载均衡、反向代理、虚拟主机都有关。

用于定位(location字面意思),定位URL、解析URL。

支持正则匹配功能、支持条件判断匹配功能。实现对动态、静态网页的过滤处理

location / {
            root   /Users/yangyi/www;
            index  index.php index.html index.htm;
        }

location /:表示匹配/目录

root:用于指定虚拟主机的web目录,可以是相对路径(相对于nginx的安装路径),也可以绝对路径。

index:指定默认首页文件,有先后顺序:index.php index.html index.htm。如果web目录权限限制或者找不到默认首页,则报403.


location开启正则匹配:location ~

location ~ \.php$    {
    root /usr/share/nginx/html;
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php;
    include         fastcgi.conf;   
}

\.php$表示匹配以.php结尾的URL请求,用来解析php文件

root用于指定虚拟主机的web目录

fastcgi_pass将php解析请求通过fastcgi转发给php,127.0.0.1:9000是php-fpm地址。


upstream模块

负责负载均衡

upstream test{
    ip_hash;
    server 192.168.12.1:80;
    server 192.168.12.2:80 down;
    server 192.168.12.3:8080  max_fails=3  fail_timeout=20s;
    server 192.168.12.4:8080;
}

test:是upstream定义的一个负载均衡器的名称,便于server调用。该名称可以任意指定。

ip_hash:负载均衡的一种调度算法。


负载均衡的4中调度算法:

weight轮询(默认),按请求时间的先后顺序足以分配到不同的后端服务器。weight设置权重,值越大,分配到的访问几率越大,主要用户后端服务器性能不均的情况下。权重值可以比例计算到每台的量

ip_hash来自同一个ip的用户请求固定分配到同一台后端服务器,有效解决了动态网页存在的session共享问题

fair比上面两个更加智能的负载均衡算法。可以依据页面大小和加载时间长短智能的进行负载均衡,也就是根据后端服务器相应时间来分配请求,响应时间短的优先分配。nginx本身不支持fair,需先下载安装upstream_fair模块

url_hash