Nginx(一)

Nginx准备

Nginx官网

背景介绍

Nginx(“engine x”)一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时也是一个【POP3/SMTP/IMAP代理服务器】,是由伊戈尔·赛索耶夫(俄罗斯人)使用C语言编写的,Nginx的第一个版本是2004年10月4号发布的0.1.0版本。另外值得一提的是伊戈尔·赛索耶夫将Nginx的源码进行了开源,这也为Nginx的发展提供了良好的保障。

Nginx的功能特性及常用功能

Nginx提供的基本功能服务从大体上归纳为"基本HTTP服务"、“高级HTTP服务”和"邮件服务"等三大类。

优点

  1. 速度更快、并发更高
  2. 配置简单,扩展性强
  3. 高可靠性
  4. 热部署
  5. 成本低、BSD许可证

master和work线程

Nginx后台进程中包含一个master进程和多个worker进程,master进程主要用来管理worker进程,包含接收外界的信息,并将接收到的信号发送给各个worker进程,监控worker进程的状态,当worker进程出现异常退出后,会自动重新启动新的worker进程。而worker进程则是专门用来处理用户请求的,各个worker进程之间是平等的并且相互独立,处理请求的机会也是一样的。

信号

信号作用
TERM/INT立即关闭整个服务
QUIT"优雅"地关闭整个服务
HUP重读配置文件并使用服务对新配置项生效
USR1重新打开日志文件,可以用来进行日志切割
USR2平滑升级到最新版的nginx
WINCH所有子进程不在接收处理新连接,相当于给work进程发送QUIT指令
  1. 发送TERM/INT信号给master进程,会将Nginx服务立即关闭。

kill -TERM PID
kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
kill -INT PID / kill -INT `cat /usr/local/nginx/logs/nginx.pid`

  1. 发送QUIT信号给master进程,master进程会控制所有的work进程不再接收新的请求,等所有请求处理完后,在把进程都关闭掉。

kill -QUIT PID
kill -TERM `cat /usr/local/nginx/logs/nginx.pid`

  1. 发送HUP信号给master进程,master进程会把控制旧的work进程不再接收新的请求,等处理完请求后将旧的work进程关闭掉,然后根据nginx的配置文件重新启动新的work进程

kill -HUP PID
kill -TERM `cat /usr/local/nginx/logs/nginx.pid`

  1. 发送USR1信号给master进程,告诉Nginx重新开启日志文件

kill -USR1 PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`

  1. 平滑升级 地址

  2. 发送WINCH信号给master进程,让master进程控制不让所有的work进程在接收新的请求了,请求处理完后关闭work进程。注意master进程不会被关闭掉

kill -WINCH PID
kill -WINCH`cat /usr/local/nginx/logs/nginx.pid`

命令行控制

参数描述
-?,-h帮助信息
-v打印版本号信息
-V打印版本号信息和配置信息并
-t测试nginx的配置文件语法是否正确
-T测试nginx的配置文件语法是否正确并列出用到的配置文件信息
-q在配置测试期间禁止显示非错误消息
-s signalstop[快速关闭,类似于TERM/INT信号的作用],quit[优雅的关闭,类似于QUIT信号的作用],reopen[重新打开日志文件类似于USR1信号的作用],reload[类似于HUP信号的作用]
-p prefix指定Nginx的prefix路径,(默认为: /usr/local/nginx/)
-e filename设置errorr日志 (默认为:/usr/local/nginx/logs/error.log)
-c filename指定Nginx的配置文件路径,(默认为: conf/nginx.conf)
-g directives用来补充Nginx配置文件,向Nginx服务指定启动时应用全局的配置

Nginx核心配置文件

# worker进程的用户和用户组 默认值 nobody
user  root;

# master_process 默认值为on
# master_process on;

# 开启工作进程 设置为cpu的核心数 默认值1
worker_processes  auto;

# 是否以守护进程的方式启动
daemon on;

# 配置Nginx的错误日志存放路径
error_log  /usr/local/nginx/logs/error.log crit;

# 配置Nginx当前master进程的进程号ID存储的文件路径
pid        /usr/local/nginx/logs/nginx.pid;


events {
    # 用来设置Nginx网络连接序列化
    accept_mutex on;
	#是否允许同时接收多个网络连接
    multi_accept on;
	# 配置单个worker进程最大的连接数
    worker_connections  65535;
    use epoll;
}

http {
    # 配置Nginx响应前端请求默认的MIME类型
    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  logs/access.log  main;
	
	# 使用sendfile()传输文件,提高Nginx处理静态资源的性能
    sendfile        on;
    tcp_nodelay on;
    tcp_nopush on;


    # 设置长连接的超时时间
    keepalive_timeout  65;
	# 设置一个keep-alive连接使用的次数
	keepalive_requests;

    #gzip  on;

    server {
	    # 配置监听端口
        listen       80;
		# 可以提供多个中间用空格分隔
        server_name  localhost;
		
		location /text {
				# 这里也可以设置成text/plain
				default_type text/html;
				return 200 "This is nginx's text";
		}
		location /json{
				default_type application/json;
				return 200 '{"name":"TOM","age":18}';
		}

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

user指令

user 用于配置运行Nginx服务器的worker进程的用户和用户组。

语法user user [group]
默认值nobody
位置全局块

work process指令

1.master_process 用来指定是否开启工作进程。

语法master_process on off;
默认值master_process on;
位置全局块

2.worker_processes 用于配置Nginx生成工作进程的数量,建议将该值和服务器CPU的内核数保存一致。

语法worker_processes num/auto;
默认值1
位置全局块

daemon 指令

1.daemon 设定Nginx是否以守护进程的方式启动。
守护式进程是linux后台执行的一种服务进程,特点是独立于控制终端,不会随着终端关闭而停止。

语法daemon on off;
默认值daemon on;
位置全局块

2.pid 用来配置Nginx当前master进程的进程号ID存储的文件路径。

语法pid file;
默认值默认为:/usr/local/nginx/logs/nginx.pid
位置全局块

3.error_log 用来配置Nginx的错误日志存放路径

语法error_log file [日志级别];
默认值error_log logs/error.log error;
位置全局块、http、server、location

4.include 用来引入其他配置文件,使Nginx的配置更加灵活

语法include file;
默认值
位置any

events块

1.accept_mutex 用来设置Nginx网络连接序列化。
这个配置主要可以用来解决常说的"惊群"问题。大致意思是在某一个时刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性能。如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。

语法accept_mutex on off;
默认值accept_mutex on;
位置events

2.multi_accept 用来设置是否允许同时接收多个网络连接
如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接

语法multi_accept on off;
默认值multi_accept off;
位置events

3.worker_connections 用来配置单个worker进程最大的连接数
这里的连接数不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数。另外,number值不能大于操作系统支持打开的最大文件句柄数量。

语法worker_connections number;
默认值worker_commections 512;
位置events

4.use 用来设置Nginx服务器选择哪种事件驱动来处理网络消息。
注意: 此处所选择事件处理模型是Nginx优化部分的一个重要内容,method的可选值有select/poll/epoll/kqueue等,之前在准备centos环境的时候,我们强调过要使用linux内核在2.6以上,就是为了能使用epoll函数来优化Nginx。

另外这些值的选择,我们也可以在编译的时候使用

--with-select_module--without-select_module

--with-poll_module --without-poll_module来设置是否需要将对应的事件驱动模块编译到Nginx的内核。

语法use method;
默认值根据操作系统定
位置events

http块

  1. 定义MIME-Type
    我们都知道浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIME Type。所以说MIME Type是网络资源的媒体类型。Nginx作为web服务器,也需要能够识别前端请求的资源类型。

  2. default_type 用来配置Nginx响应前端请求默认的MIME类型。

自定义服务日志

1.access_log用来设置用户访问日志的相关属性。

语法access_log path[format[buffer=size]]
默认值access_log logs/access.log combined;
位置http, server, location

2.log_format 用来指定日志的输出格式

语法log_format name [escape=default json none] string…;
默认值log_format combined “…”;
位置http

其他配置指令

1.sendfile 用来设置Nginx服务器是否使用sendfile()传输文件,该属性可以大大提高Nginx处理静态资源的性能

语法sendfile on off;
默认值sendfile off;
位置http、server、location

2.keepalive_timeout 用来设置长连接的超时时间。
我们都知道HTTP是一种无状态协议,客户端向服务端发送一个TCP请求,服务端响应完毕后断开连接。
如何客户端向服务端发送多个请求,每个请求都需要重新创建一次连接,效率相对来说比较多,使用keepalive模式,可以告诉服务器端在处理完一个请求后保持这个TCP连接的打开状态,若接收到来自这个客户端的其他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新连接,提升效率,但是这个连接也不能一直保持,这样的话,连接如果过多,也会是服务端的性能下降,这个时候就需要我们进行设置其的超时时间。

语法keepalive_timeout time;
默认值keepalive_timeout 65s;
位置http、server、location

3.keepalive_requests 用来设置一个keep-alive连接使用的次数。

语法keepalive_requests number;
默认值keepalive_requests 100;
位置http、server、location

Nginx静态资源的配置指令

listen指令

1.listen 用来配置监听端口。

语法listen address[:port] [default_server]…;
listen port [default_server]…;
默认值listen *:80 | *:8000
位置server

server_name指令

server_name 用来设置虚拟主机服务名称。127.0.0.1 、 localhost 、域名[www.baidu.com ]
1.精确匹配

server {
listen 80;
server_name www.baidu.com daidu.cn;

}

2.使用通配符配置
server_name中支持通配符"*",但需要注意的是通配符不能出现在域名的中间,只能出现在首段或尾段

server {
listen 80;
server_name .baidu.cn www.baidu.;
# www.baidu.cn abc.itcast.cn www.baidu.cn www.baidu.com

}

3.使用正则表达式配置
server_name中可以使用正则表达式,并且使用~作为正则表达式字符串的开始标记。

代码说明
^匹配搜索字符串开始位置
$匹配搜索字符串结束位置
.匹配除换行符\n之外的任何单个字符
\转义字符,将下一个字符标记为特殊字符
[xyz]字符集,与任意一个指定字符匹配
[a-z]字符范围,匹配指定范围内的任何字符
\w与以下任意字符匹配 A-Z a-z 0-9 和下划线,等效于[A-Za-z0-9_]
\d数字字符匹配,等效于[0-9]
{n}正好匹配n次
{n,}至少匹配n次
{n,m}匹配至少n次至多m次
*零次或多次,等效于{0,}
+一次或多次,等效于{1,}
?零次或一次,等效于{0,1}

server{
listen 80;
server_name ~^www.(\w+).com$;
default_type text/plain;
return 200 $1 $2 …;
}
注意 ~后面不能加空格,括号可以取值

location指令

location 用来设置请求的URI
uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。

语法location [ = ~ ~* ^~ @ ] uri{…}
默认值
位置server,location

server {
listen 80;
server_name 127.0.0.1;
location /abc{
default_type text/plain;
return 200 “access success”;
}
}

= : 用于不包含正则表达式的uri前,必须与指定的模式精确匹配

server {
listen 80;
server_name 127.0.0.1;
location =/abc{
default_type text/plain;
return 200 “access success”;
}
}
可以匹配到
http://127.0.0.1/abc
http://127.0.0.1/abc?p1=TOM
匹配不到
http://127.0.0.1/abc/
http://127.0.0.1/abcdef

~ : 用于表示当前uri中包含了正则表达式,并且区分大小写
~*: 用于表示当前uri中包含了正则表达式,并且不区分大小写
换句话说,如果uri包含了正则表达式,需要用上述两个符合来标识

server {
listen 80;
server_name 127.0.0.1;
location ~^/abc\wKaTeX parse error: Expected 'EOF', got '}' at position 64: …s success"; } }̲ server { list…{
default_type text/plain;
return 200 “access success”;
}
}

^~: 用于不包含正则表达式的uri前,功能和不加符号的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了。
server {
listen 80;
server_name 127.0.0.1;
location ^~/abc{
default_type text/plain;
return 200 “access success”;
}
}

设置请求资源的目录root / alias

root 设置请求的根目录

语法root path;
默认值root html;
位置http、server、location

path为Nginx服务器接收到请求以后查找资源的根目录路径。

alias 用来更改location的URI

语法alias path;
默认值
位置location

/usr/local/nginx/html目录下创建一个 images目录,并在目录下放入一张图片mv.png图片

location /images {
root /usr/local/nginx/html;
}

访问图片的路径为:

http://127.0.0.1/images/mv.png

如果把root改为alias

location /images {
alias /usr/local/nginx/html;
}

再次访问上述地址,页面会出现404的错误,查看错误日志会发现是因为地址不对,所以验证了:
root的处理结果是: root路径+location路径
/usr/local/nginx/html/images/mv.png
alias的处理结果是:使用alias路径替换location路径
/usr/local/nginx/html/images

需要在alias后面路径改为
location /images {
alias /usr/local/nginx/html/images;
}

如果location路径是以/结尾,则alias也必须是以/结尾,root没有要求 将上述配置修改为

location /images/ {
alias /usr/local/nginx/html/images;
}

访问就会出问题,查看错误日志还是路径不对,所以需要把alias后面加上 /

小结:
root的处理结果是: root路径+location路径
alias的处理结果是:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的含义。
如果location路径是以/结尾,则alias也必须是以/结尾,root没有要求

index指令

index:设置网站的默认首页 index后面可以跟多个设置,如果访问的时候没有指定具体访问的资源,则会依次进行查找,找到第一个为止。

语法index file …;
默认值index index.html;
位置http、server、location

location / {
root /usr/local/nginx/html;
index index.html index.htm;
}
访问该location的时候,可以通过 http://ip:port/,地址后面如果不添加任何内容,则默认依次访问index.html和index.htm,找到第一个来进行返回

error_page指令

error_page:设置网站的错误页面

语法error_page code … [=[response]] uri;
默认值
位置http、server、location…

1.可以指定具体跳转的地址

server {
error_page 404 http://www.baidu.cn;
}

2.可以指定重定向地址

server{
error_page 404 /50x.html;
error_page 500 502 503 504 /50x.html;
location =/50x.html{
root html;
}
}

3.使用location的@符合完成错误信息展示

server{
error_page 404 @jump_to_error;
location @jump_to_error {
default_type text/plain;
return 404 ‘Not Found Page…’;
}
}

可选项=[response]的作用是用来将相应代码更改为另外一个

server{
error_page 404 =200 /50x.html;
location =/50x.html{
root html;
}
}
这样的话,当返回404找不到对应的资源的时候,在浏览器上可以看到,最终返回的状态码是200,这块需要注意下,编写error_page后面的内容,404后面需要加空格,200前面不能加空格

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值