本文转自: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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论