本文转自:https://www.jianshu.com/p/75a792b07ff1

一、服务安装与启停:

windows:

nginx -s [ stop | quit | reopen | reload ]

start nginx  //启动服务

nginx -s stop //停止服务

nginx -s reload //重装配置文件

nginx -s reopen //打开日志

tasklist /fi “imagename eq nginx.exe”  //显示服务进程

Linux:

cd nginx-1.2.0

./configure

make

sudo make install

ps aux|grep nginx //显示服务进程

在Linux下安装Nginx详细说明

为了确保能在Nginx中使用正则表达式进行更灵活的配置,安装之前需要确定系统是否安装有 PCRE(Perl Compatible Regular Expressions)包。可以到ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的PCRE源码包,使用下面命令下载编译和安装PCRE包:

# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz 

# tar zxvf pcre-7.7.tar.gz # cd pcre-7.7 # ./configure 

# make 

# make install

接下来安装Nginx,Nginx一般有两个版本,分别是稳定版和开发版,可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx 安装到 /opt/nginx 目录下的详细步骤:

# wget http://sysoev.ru/nginx/nginx-0.6.31.tar.gz

# tar zxvf nginx-0.6.31.tar.gz # cd nginx-0.6.31

# ./configure –with-http_stub_status_module –prefix=/opt/nginx

# make # make install

其中参数–with-http_stub_status_module是为了启用nginx的NginxStatus功能,用来监控Nginx的当前状态。

    安装成功后/opt/nginx目录下有四个子目录分别是:conf、html、logs、sbin 。其中Nginx的配置文件存放于conf/nginx.conf,Nginx只有一个程序文件位于sbin目录下的nginx文件。确保系统的80端口没被其他程序占用,运行sbin/nginx命令来启动Nginx,打开浏览器访问此机器的IP,如果浏览器出现Welcome to nginx! 则表示Nginx已经安装并运行成功。

二、常用的Nginx参数和控制

Nginx安装后只有一个程序文件,本身并不提供各种管理程序,它是使用参数和系统信号机制对 Nginx进程本身进行控制的。 

通过程序运行参数控制:

Nginx的参数包括有如下几个:

-c <path_to_config>:使用指定的配置文件而不是conf目录下的nginx.conf 。

-t:测试配置文件是否正确,在运行时需要重新加载配置的时候,此命令非常重要,用来检测所修改的配置文件是否有语法错误。

-v:显示nginx版本号。

-V:显示nginx的版本号以及编译环境信息以及编译时的参数。

例如我们要测试某个配置文件是否书写正确,可以使用以下命令:

sbin/nginx -t -c  conf/nginx2.conf

通过信号对Nginx进行控制:

Nginx 支持下表中的信号:

信号名                作用描述

TERM, INT         快速关闭程序,中止当前正在处理的请求

QUIT                   处理完当前请求后,关闭程序

HUP                    重新加载配置,并开启新的工作进程,关闭就的进程,此操作不会中断请求

USR1                  重新打开日志文件,用于切换日志,例如每天生成一个新的日志文件

USR2                  平滑升级可执行程序

WINCH                从容关闭工作进程

有两种方式来通过这些信号去控制Nginx:

第一是通过logs目录下的nginx.pid查看当前运行的Nginx的进程ID,通过kill -XXX <pid>来控制Nginx,其中XXX就是上表中列出的信号名。

如果系统中只有一个Nginx进程,那您也可以通过killall命令来完成,例如运行killall -s HUP nginx来让Nginx重新加载配置。

三、配置Nginx

先来看一个实际的配置文件:

user nobody;

# 工作进程的属主 

worker_processes 4;

# 工作进程数,一般与 CPU 核数等同 

#error_log logs/error.log; 

#error_log logs/error.log notice; 

#error_log logs/error.log info; 

#pid logs/nginx.pid;

events { 

    use epoll;#Linux 下性能最好的event模式 

    worker_connections 2048;# 每个工作进程允许最大的同时连接数 

http { 

    include mime.types; 

    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_forwarded_for”\”; 

    #access_log off; 

    access_log logs/access.log;# 日志文件名 

    sendfile on; 

    #tcp_nopush on; 

    tcp_nodelay on; 

    keepalive_timeout 65; 

    include gzip.conf; # 集群中的所有后台服务器的配置信息 

    upstream tomcats { 

        server 192.168.0.11:8080 weight=10; 

        server 192.168.0.11:8081 weight=10; 

        server 192.168.0.12:8080 weight=10; 

        server 192.168.0.12:8081 weight=10; 

        server 192.168.0.13:8080 weight=10; 

        server 192.168.0.13:8081 weight=10; 

    } 

    server { 

        listen 80;#HTTP 的端口 

        server_name localhost; 

        charset utf-8; 

        #access_log logs/host.access.log main; 

        location ~ ^/NginxStatus/ { 

            stub_status on; #Nginx 状态监控配置 

            access_log off; 

        } 

        location ~ ^/(WEB-INF)/ { deny all; } 

        location ~ \\.(htm|html|asp|php|gif|jpg|jpeg|png|bmp|ico|rar|css|js| zip|java|jar|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$ { 

            root /opt/webapp; 

            expires 24h; 

        } 

        location / { 

            proxy_pass http://tomcats;# 反向代理 

            include proxy.conf; 

        } 

        error_page 404 /html/404.html; 

        # redirect server error pages to the static page /50x.html 

        # error_page 502 503 /html/502.html; 

        error_page 500 504 /50x.html; 

        location = /50x.html { root html; } 

    } 

}

Nginx监控:

上述配置中,首先我们定义了一个location ~ ^/NginxStatus/,这样通过http://localhost/NginxStatus/ 就可以监控到 Nginx 的运行信息,显示的内容如下:

Active connections: 70 server accepts handled requests 14553819 14553819 19239266 Reading: 0 Writing: 3 Waiting: 67

NginxStatus显示的内容意思如下:

    active connections  – 当前 Nginx 正处理的活动连接数。

    server accepts handled requests — 总共处理了 14553819 个连接 , 成功创建 14553819 次握手 ( 证明中间没有失败的 ), 总共处理了 19239266 个请求 ( 平均每次握手处理了 1.3 个数据请求 )。

    reading — nginx 读取到客户端的 Header 信息数。

    writing — nginx 返回给客户端的 Header 信息数。

    waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading + writing),意思就是 Nginx已经处理完正在等候下一次请求指令的驻留连接。

静态文件处理:

通过正则表达式,我们可让Nginx识别出各种静态文件,例如images路径下的所有请求可以写为:

location ~ ^/images/  { root /opt/webapp/images; }

而下面的配置则定义了几种文件类型的请求处理方式。

location ~ \\.(htm|html|gif|jpg|jpeg|png|bmp|ico|css|js|txt)$ { 

    root /opt/webapp; 

    expires  24h; 

}

对于例如图片、静态HTML文件、js脚本文件和css样式文件等,我们希望Nginx直接处理并返回给浏览器,这样可以大大加快网页浏览时的速度。因此对于这类文件我们需要通过root指令来指定文件的存放路径,同时因为这类文件并不常修改,通过expires指令来控制其在浏览器的缓存,以减少不必要的请求。expires指令可以控制HTTP应答中的“Expires”和“Cache-Control”的头标(起到控制页面缓存的作用)。可以使用以下的格式来书写Expires:

expires 1 January, 1970, 00:00:01 GMT; expires 60s; expires 30m; expires 24h; expires 1d; expires max; expires off;

动态页面请求处理:

    Nginx本身并不支持现在流行的JSP、ASP、PHP、PERL等动态页面,但它可以通过反向代理将请求发送到后端的服务器,例如Tomcat、Apache、IIS等来完成动态页面的请求处理。前面的配置示例中,我们首先定义了由Nginx直接处理的一些静态文件请求后,其他所有的请求通过 proxy_pass 指令传送给后端的服务器。最简单的 proxy_pass 用法如下:

location / {

    proxy_pass    http://localhost:8080;

    proxy_set_header X-Real-IP $remote_addr;

}

这里没有使用到集群,而是将请求直接送到运行在8080端口的Tomcat服务上来完成类似JSP和Servlet的请求处理。

当页面的访问量非常大的时候,往往需要多个应用服务器来共同承担动态页面的执行操作,这时我们就需要使用集群的架构。Nginx通过upstream指令来定义一个服务器的集群,最前面那个完整的例子中我们定义了一个名为tomcats的集群,这个集群中包括了三台服务器共6个Tomcat 服务。而proxy_pass指令的写法变成了:

location  / {

    proxy_pass  http://tomcats;

    proxy_set_header X-Real-IP  $remote_addr;

}

在Nginx的集群配置中,Nginx使用最简单的平均分配规则给集群中的每个节点分配请求。一旦某个节点失效时,或者重新起效时,Nginx都会非常及时的处理状态的变化,以保证不会影响到用户的访问。

四、常用命令说明

1、Location

Location 指令,是用来为匹配的 URI 进行配置,URI 即语法中的”/uri/”,可以是字符串或正则表达式。但如果要使用正则表达式,则必须指定前缀。

1)基本语法

location  [=|~|~*|^~|@]  /uri/  {…}

=     表示精确匹配,如果找到,立即停止搜索并立即处理此请求。

~     表示区分大小写匹配

~*   表示不区分大小写匹配

^~  表示只匹配字符串,不查询正则表达式。

@    指定一个命名的location,一般只用于内部重定向请求。

2)匹配过程

首先对字符串进行匹配查询,最确切的匹配将被使用。然后,正则表达式的匹配查询开始,匹配第一个结果后会停止搜索,如果没有找到正则表达式,将使用字符串的搜索结果,如果字符串和正则都匹配,那么正则优先级较高。

3)配置实例

location = / {

        #只匹配对 / 目录的查询

        [ config  A ]  

}

location    /  {

        # 匹配以 / 开始的查询,即所有查询都匹配。

        [ config  B ] 

}

location  ^~ /images/ {

        # 匹配以 /images/ 开始的查询,不再检查正则表达式。

        [ config  C ] 

}

location ~* \.(gif|jpg|jpeg)$  {

        # 匹配以gif, jpg, or jpeg结尾的文件,但优先级低于config C。

        [ config  D ] 

}

4)全局变量

$args                         #这个变量等于请求行中的参数。

$content_length       #请求头中的Content-length字段。

$content_type           #请求头中的Content-Type字段。

$document_root       #当前请求在root指令中指定的值。

$host                         #请求主机头字段,否则为服务器名称。

$http_user_agent      #客户端agent信息。

$http_cookie             #客户端cookie信息。

$limit_rate                 #这个变量可以限制连接速率。

$request_body_file   #客户端请求主体信息的临时文件名。

$request_mothod     #客户端请求的动作,通常为GET或POST。

$remote_addr           #客户端的IP地址。

$remote_port            #客户端的端口。

$remote_user            #已经经过Auth Basic Module验证的用户名。

$request_filename    #当前请求的文件路径,由root或alias指令与URI请求生成。

$query_string            #与$args相同。

$scheme                    #HTTP方法(如http,https)。

$server_protocol       #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr             #服务器地址,在完成一次系统调用后可以确定这个值。

$server_name           #服务器名称。

$server_port             #请求到达服务器的端口号。

$request_uri             #包含请求参数的原始URI,不包含主机名,如“/foo/bar.php?arg=baz”。

$uri                           #不带请求参数的当前URI,不包含主机名,如“/foo/var.html”。

$document_uri        #与$uri相同。

2、upstream(负载均衡)

把www.domain.com均衡到本机不同的端口,也可以改为均衡到不同的地址上。

http  {

    upstream myproject {

        server  127.0.0.1:8000   weight=3;

        server  127.0.0.1:8001;

        server  127.0.0.1:8002;

        server  127.0.0.1:8003;

    }

    server {

        listen 80;

        server_name  www.domain.com;

        location / {

            proxy_pass  http://myproject;

        }

    }

}

nginx的upstream目前支持以下几种方式的分配:

1)轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2)weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。好的服务器weight高些,差的服务器weight低些。

upstream  bakend {

    server  127.0.0.1:8000   weight=3;

}

3)ip_hash:每个请求按访问的IP和hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。无法将权重(weight)与ip_hash联合起来分发连接。如果有某台服务器不可用,必须标记其为down。

upstream  bakend {

    ip_hash;

    server   192.168.0.14:80;

    server   192.168.0.15:80; 

}

4)fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream  bakend  {

    server  server1;

    server  server2;

    fair;

}

5)url_hash(第三方):

upstream  bakend {

    ip_hash;

    server  127.0.0.1:8000   down;

    server  127.0.0.1:8001   weight=2;

    server  127.0.0.1:8002;

    server  127.0.0.1:8003   backup;

}

在需要使用负载均衡的server中增加proxy_pass http://bakend/;

每个设备的状态设置为:

1>down:表示当前的server暂时不参与负载。

2>weight:权重默认为1,weight越大,负载的权重就越大。

3>max_fails:允许请求失败的次数默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。

4>fail_timeout:max_fails次失败后,暂停的时间。

5>backup:备用,其他所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

五、编译优化

默认nginx使用的GCC编译参数是-O,需要更加优化可以使用以下两个参数:

–with-cc-opt=’-O3′ 

–with-cpu-opt=opteron 

使得编译针对特定CPU以及增加GCC的优化;

六、configure参数详解

源代码解压后即可输入./configure –help 查看所有configure参数;

具体参数解释如下:

–prefix=<path> – Nginx安装路径。如果没有指定,默认为 /usr/local/nginx。 

–sbin-path=<path> – Nginx可执行文件安装路径。只能安装时指定,如果没有指定,默认为<prefix>/sbin/nginx。 

–conf-path=<path> – 在没有给定-c选项下默认的nginx.conf的路径。如果没有指定,默认为<prefix>/conf/nginx.conf。 

–pid-path=<path> – 在nginx.conf中没有指定pid指令的情况下,默认的nginx.pid的路径。如果没有指定,默认为 <prefix>/logs/nginx.pid。 

–lock-path=<path> – nginx.lock文件的路径。 

–error-log-path=<path> – 在nginx.conf中没有指定error_log指令的情况下,默认的错误日志的路径。如果没有指定,默认为 <prefix>/logs/error.log。 

–http-log-path=<path> – 在nginx.conf中没有指定access_log指令的情况下,默认的访问日志的路径。如果没有指定,默认为 <prefix>/logs/access.log。 

–user=<user> – 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的用户。如果没有指定,默认为 nobody。 

–group=<group> – 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的组。如果没有指定,默认为 nobody。 

–builddir=DIR – 指定编译的目录 

–with-rtsig_module – 启用 rtsig 模块 

–with-select_module –without-select_module – 允许或不允许开启SELECT模式,如果 configure 没有找到更合适的模式,比如:kqueue(sun os),epoll (linux kenel 2.6+), rtsig(实时信号)或者/dev/poll(一种类似select的模式,底层实现与SELECT基本相 同,都是采用轮训方法) SELECT模式将是默认安装模式 

–with-poll_module –without-poll_module – Whether or not to enable the poll module. This module is enabled by default if a more suitable method such as kqueue, epoll, rtsig or /dev/poll is not discovered by configure. 

–with-http_ssl_module – 开启HTTP SSL模块,使NGINX可以支持HTTPS请求。这个模块需要已经安装了OPENSSL,在DEBIAN上是libssl 

–with-http_realip_module – 启用 ngx_http_realip_module 

–with-http_addition_module – 启用 ngx_http_addition_module 

–with-http_sub_module – 启用 ngx_http_sub_module 

–with-http_dav_module – 启用 ngx_http_dav_module 

–with-http_flv_module – 启用 ngx_http_flv_module 

–with-http_stub_status_module – 启用 “server status” 页 

–without-http_charset_module – 禁用 ngx_http_charset_module 

–without-http_gzip_module – 禁用 ngx_http_gzip_module. 如果启用,需要 zlib 。 

–without-http_ssi_module – 禁用 ngx_http_ssi_module 

–without-http_userid_module – 禁用 ngx_http_userid_module 

–without-http_access_module – 禁用 ngx_http_access_module 

–without-http_auth_basic_module – 禁用 ngx_http_auth_basic_module 

–without-http_autoindex_module – 禁用 ngx_http_autoindex_module 

–without-http_geo_module – 禁用 ngx_http_geo_module 

–without-http_map_module – 禁用 ngx_http_map_module 

–without-http_referer_module – 禁用 ngx_http_referer_module 

–without-http_rewrite_module – 禁用 ngx_http_rewrite_module. 如果启用需要 PCRE 。 

–without-http_proxy_module – 禁用 ngx_http_proxy_module 

–without-http_fastcgi_module – 禁用 ngx_http_fastcgi_module 

–without-http_memcached_module – 禁用 ngx_http_memcached_module 

–without-http_limit_zone_module – 禁用 ngx_http_limit_zone_module 

–without-http_empty_gif_module – 禁用 ngx_http_empty_gif_module 

–without-http_browser_module – 禁用 ngx_http_browser_module 

–without-http_upstream_ip_hash_module – 禁用 ngx_http_upstream_ip_hash_module 

–with-http_perl_module – 启用 ngx_http_perl_module 

–with-perl_modules_path=PATH – 指定 perl 模块的路径 

–with-perl=PATH – 指定 perl 执行文件的路径 

–http-log-path=PATH – Set path to the http access log 

–http-client-body-temp-path=PATH – Set path to the http client request body temporary files 

–http-proxy-temp-path=PATH – Set path to the http proxy temporary files 

–http-fastcgi-temp-path=PATH – Set path to the http fastcgi temporary files 

–without-http – 禁用 HTTP server 

–with-mail – 启用 IMAP4/POP3/SMTP 代理模块 

–with-mail_ssl_module – 启用 ngx_mail_ssl_module 

–with-cc=PATH – 指定 C 编译器的路径 

–with-cpp=PATH – 指定 C 预处理器的路径 

–with-cc-opt=OPTIONS – Additional parameters which will be added to the variable CFLAGS. With the use of the system library PCRE in FreeBSD, it is necessary to indicate –with-cc-opt=”-I /usr/local/include”. If we are using select() and it is necessary to increase the number of file descriptors, then this also can be assigned here: –with-cc-opt=”-D FD_SETSIZE=2048″. 

–with-ld-opt=OPTIONS – Additional parameters passed to the linker. With the use of the system library PCRE in FreeBSD, it is necessary to indicate –with-ld-opt=”-L /usr/local/lib”. 

–with-cpu-opt=CPU – 为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64 

–without-pcre – 禁止 PCRE 库的使用。同时也会禁止 HTTP rewrite 模块。在 “location” 配置指令中的正则表达式也需要 PCRE 。 

–with-pcre=DIR – 指定 PCRE 库的源代码的路径。 

–with-pcre-opt=OPTIONS – Set additional options for PCRE building. 

–with-md5=DIR – Set path to md5 library sources. 

–with-md5-opt=OPTIONS – Set additional options for md5 building. 

–with-md5-asm – Use md5 assembler sources. 

–with-sha1=DIR – Set path to sha1 library sources. 

–with-sha1-opt=OPTIONS – Set additional options for sha1 building. 

–with-sha1-asm – Use sha1 assembler sources. 

–with-zlib=DIR – Set path to zlib library sources. 

–with-zlib-opt=OPTIONS – Set additional options for zlib building. 

–with-zlib-asm=CPU – Use zlib assembler sources optimized for specified CPU, valid values are: pentium, pentiumpro 

–with-openssl=DIR – Set path to OpenSSL library sources 

–with-openssl-opt=OPTIONS – Set additional options for OpenSSL building 

–with-debug – 启用调试日志 

–add-module=PATH – Add in a third-party module found in directory PATH 

作者:夏与清风
链接:https://www.jianshu.com/p/75a792b07ff1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。