nginx配置文件主要分为四个部分:
main{ #(全局设置)
http{ #服务器配置
upstream{} #(负载均衡服务器设置)
server{ #(主机设置:主要用于指定主机和端口)
location{} #(URL匹配的设置)
}
}
}
server
继承自http
,location
继承自server
,upstream
即不会继承其他设置也不会被继承。
nginx在运行时与具体业务功能无关的一些参数,比如工作进程数,运行的身份等。
user liming;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
error_log /data/nginx/logs/error.log crit;
pid /data/nginx/logs/nginx.pid;
worker_rlimit_nofile 65535;
user nginx
: 指定nginx进程使用什么用户启动worker_processes 4
: 指定启动多少进程来处理请求,一般情况下设置成CPU的核数
,如果开启了ssl和gzip应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。使用grep ^processor /proc/cpuinfo | wc -l
查看CPU核数。worker_cpu_affinity 0001 0010 0100 1000
: 在高并发情况下,通过设置将CPU和具体的进程绑定来降低由于多核CPU切换造成的寄存器等现场重建带来的性能损耗。如worker_cpu_affinity 0001 0010 0100 1000; (四核)。error_log logs/error.log
: error_log是个主模块指令,用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。pid logs/nginx.pid
: 指定进程pid文件的位置我们可以使用ps -ef | grep nginx
查看master
和worker
的进程,这里有一个master和四个worker:
events 模块主要是nginx 和用户交互网络连接优化的配置内容,我们主要看一下两个配置:
events{
use epoll;
worker_connections 65536;
}
use epoll
:是使用事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。在操作系统不支持这些高效模型时才使用select。worker_connections 65536
:每一个worker进程能并发处理(发起)的最大连接数。http{
include mime.types;
default_type application/octet-stream;
#charset gb2312;
sendfile on;
keepalive_timeout 60s;
}
include
:是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。该文件也在conf目录中。default_type
:属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式。charset gb2312
: 指定客户端编码格式。sendfile
:实际上是 Linux2.0+以后的推出的一个系统调用,web服务器可以通过调整自身的配置来决定是否利用 sendfile这个系统调用。sendfile是个比 read 和 write 更高性能的系统接口。 当 Nginx 是一个静态文件服务器的时候,开启 SENDFILE 配置项能大大提高 Nginx 的性能
。 但是当 Nginx 是作为一个反向代理来使用的时候,SENDFILE 则没什么用。keepalive_timeout
来指定 KeepAlive 的超时时间(timeout)。指定每个 TCP 连接最多可以保持多长时间。Nginx 的默认值是 75 秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为 0,就禁止了 keepalive 连接。http服务上支持【若干虚拟主机】。每个虚拟主机对应一个
server配置项
,配置项里面包含该虚拟主机相关的配置。
server{
listen 80 default;
server_name www.liming.com;
index index.html index.htm index.php;
root /data/www;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${
expires 30d;
}
location ~ .*\.(js|css)?${
expires 1h;
}
}
listen 80
: 监听端口,默认80,小于1024的要以root启动。可以为listen :80、listen 127.0.0.1:80等形式。server_name www.liming.com
: 用于设置虚拟主机服务名称,如:127.0.0.1 、 localhost 、域名[www.baidu.com | www.jd.com],也可以进行正则匹配。root /data/www
: 定义服务器的默认网站根目录
位置。可以是linux的绝对路径(/xxx/xx),也可以是nginx安装目录的相对路径(html
)。index index.jsp index.html index.htm
:定义路径下默认访问的文件名,一般跟着root放。location通常用来匹配uri,其基本语法如下:
location [=|~|~*|^~] /uri/ {}
(1)=
表示匹配uri时必须做到完全匹配,如
location = /index {}
(2)~
表示匹配URI时是字母大小
写敏感的,可以使用正则表达式
(3)~*
表示匹配URI时是忽略字母大小
敏感的,可以使用正则表达式
(4)^~
表示匹配uri时只需满足前缀匹配
即可
# 所有 /./img/开头的uri会全部匹配
location ^~ /./img/ {}
(5)uri参数中是可以使用正则表达式的,如匹配以 .gif .jpg和.jpeg结尾的uri,如下:
location ~* \.(gif|jpg|jpeg)$ {}
(6)以下方式可以匹配所有的uri
location / {}
(7)@ 指定一个命名的location,一般用于内部重定义请求:
location @name {…}
结果总结: 匹配的优先顺序,=
> ^~
(匹配固定字符串,忽略正则)>~*
>/
,工作中尽量将‘=’
放在前面。
(1)以root方式设置资源路径
语法 root path ,默认 root html,可以在http、server、location模块中配置。
location ^~ /backend {
root /data/www/backend
}
如果url为 /backend/index/test.html
则会返回/data/www/backend/backend/index/test.html
这个文件。
(2)以alias方式设置资源路径
alias也是用来设置文件资源的,它和root不同点在于如何解读紧跟location后面的uri参数,可以在location中配置:
location ^~ /backend {
alias /data/www/backend
}
如果url为 /backend/index/test.html
则会返回/data/www/backend/index/test.html
文件。
alias会将location后的url部分丢弃掉,而root不会
(3)访问首页
可以在http、server、location中配置。
index index.html index.htm index.php
nginx会依次访问index中定义的文件,知道访问成功为止。
(4)根据http返回码重定向页面
可以在http、server、location中配置。
error_page 404 /404.html
error_page 502 503 504 /50x.html
(5)try_files
try_files path1 path2 ... uri
该配置项可以配置在server、location模块。
try_files
后边会跟若干路径,nginx会尝试按照顺序访问每一个path,如果可以有效的读取,就直接访问当下path资源,否则继续向下访问,如果都读取不到就重定向到uri参数上
try_files /a/b.html $uri $uri/index.html $uri.html @other;
location @other {
proxy_pass http://backend
}