Nginx服务简介

简介:

Nginx概述


Nginx (engine x) 是一个高性能的http和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

社区版和商业版两个版本,官网地址为http://www.nginx.org/


特性:
    模块化设计,较好的扩展性
    高可靠性
    支持热部署:不停机更新配置文件,升级版本,更换日志文件
    低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需要2.5M内存
    event-driven,aio,mmap,sendfile

基本功能:
    静态资源的web服务器
    http协议反向代理服务器
    pop3/imap4协议反向代理服务器
    FastCGI(lnmp),uWSGI(python)等协议
    模块化(非DSO),如zip,SSL模块

web服务相关的功能:
    虚拟主机(server)
    支持keep-alive 和管道连接
    访问日志(支持基于日志缓冲提高其性能)
    url rewirte
    路径别名
    基于IP及用户的访问控制
    支持速率限制及并发数限制
    重新配置和在线升级而无须中断客户的工作进程
    Memcached的GET 接口


Nginx架构


9e89efb923a85b1f157847d9834bd39d.png


nginx的程序架构:
    master/worker结构


一个master进程:
    负载加载和分析配置文件、管理worker进程、平滑升级


一个或多个worker进程
    处理并响应用户请求


缓存相关的进程:
    cache loader:载入缓存对象
    cache manager:管理缓存对象


Nginx的工作流程大致如下:

1.Nginx启动后,会产生一个主进程,主进程执行一系列的工作后会产生多个工作进程;

2.在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行数据处理和组织;

3.Nginx为了提高对请求的响应效率,降低网络压力,采用了缓存机制,将历史应答数据缓存到本地。保障对缓存文件的快速访问;

 

##工作进程##

工作进程的主要工作有以下几项:

接收客户端请求;

将请求依次送入各个功能模块进行过滤处理;

IO调用,获取响应数据;

与后端服务器通信,接收后端服务器处理结果;

数据缓存

响应客户端请求;


Nginx模块


nginx高度模块化,1.9.11版本后开始支持动态装载、卸载,主要包含下述模块:

    核心模块 core module 

    标准模块 http、mail、stream

    第三方模块


Nginx配置


nginx配置文件中包含几段:

    主配置段

    http配置段

    mail配置段

    stream配置段

不同的配置参数需要用在不同的配置段,不能乱用


使用rpm包管理器安装nginx

yum -y install  nginx



主配置段,程序正常运行必须配置的字段

vim /etc/nginx/nginx.conf 
user nginx; #master进程是以root身份运行,worker进程是以nginx的身份运行

worker_processes auto; #worker进程的数量;通常应该为当前主机的cpu的物理核心数

error_log /var/log/nginx/error.log; #服务错误日志的存放路径

pid /run/nginx.pid; #服务的进程id

include /usr/share/nginx/modules/*.conf;
#与此处的配置等效的模块的配置文件存放路径
events {
    worker_connections 1024;

}

#事件驱动,每个worker进程能够并发打开的最大连接数量,1024是默认值

#所有配置行必须以分号结尾


http配置段

ngx_http_core_module模块


include /etc/nginx/conf.d/*.conf; #在此路径下以conf结尾的配置文件具有同等效果

server {
…………
}

#虚拟主机可以在此处配置

#一些模块参数的配置可以在server中,也可以在http中,还有的必须在二者中的一个

listen       80 default_server; #开启http服务时i监听的端口,可以指定ip地址

server_name www.a.com ;  #可以指定域名,支持通配符和正则表达式

server_tokens on ; #隐藏nginx的版本信息

root /app/website1; #定义此虚拟主机的主页面路径


location #在server中定义,用于实现uri到文件系统的映射,例子如下:

server {
server_name www.a.com;
location /images/ {
root /data/imgs/;
}
}

#当访问http://www.a.com/images/logo.jpg时跳转到-->/data/imgs/images/logo.jpg

#location也支持正则表达式

alias #在location中定义路径别名,与root的区别,看下面例子:

server {...
server_name www.a.com;
location /images/ {
alias /data/imgs/;
}
}

#当访问http://www.a.com/images/logo.jpg时跳转到-->/data/imgs/logo.jpg

#注意区分root与alias


ngx_http_access_module模块

此模块实现基于ip地址的访问控制

location / {

deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;

}

#支持ipv4和ipv6协议

#自上而下匹配,命中后就不会再匹配下一条策略

#相对apache,nginx的访问控制还是很好理解的


ngx_http_auth_basic_module模块

auth_basic string ;
auth_basic_user_file file;
location /admin/ {
auth_basic"Admin Area"; #认证窗口的提示信息
auth_basic_user_file /etc/nginx/.ngxpasswd; #存放认证账户的文件,可以使用httpd-tools包中的passwd工具生成认证用户

}

#实现基于用户的访问控制,使用basic机制进行用户认证


ngx_http_gzip_module模块

gzip on; #开启gzip压缩功能
gzip_comp_level 6; #压缩比,默认是1,范围是1-9
gzip_min_length 64; #最小达到64字节的文件才能够被压缩
gzip_proxied off;对被代理的请求不启用压缩

gzip_types text/xml text/css application/javascript;

#对何种文件类型进行压缩


ngx_http_ssl_module模块

提供https加密

例子:
server {
listen 443 ssl; #必须明确指出监听的端口
server_name www.a.com;
root /vhosts/ssl/htdocs;
ssl on;
ssl_certificate/etc/nginx/ssl/nginx.crt; #证书文件
ssl_certificate_key/etc/nginx/ssl/nginx.key; #私钥文件
ssl_session_cache shared:sslcache:20m; #各个worker进程之间共享ssl会话的内存

ssl_session_timeout10m; 
}


ngx_http_rewrite_module重写模块

将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换

rewrite regex replacement 

#将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI

return 状态码 url;

#停止处理,并返回给客户端指定的响应码

rewrite_log on;

#是否开启重写日志, 发送至error_log(notice level)



ngx_http_referer_module模块

定义referer首部的合法可用值,不能匹配的将是非法值,可以防盗链

例子:

valid_referers www.a.com ;
if ($invalid_referer) {
return 403;
}

#定义www.a.com为有效值   

#防盗链原理:当非www.a.com要盗用本站的图片等信息,由于不在valid_referers中定义,则会被拒绝并返回403拒绝    


ngx_http_proxy_module模块

代理服务器,目标主机收到信息后认为源就是代理机器,而不是真正的客户端

server {

server_name HOSTNAME;
location /uri/ {
proxy_pass 
http://host/new_uri/; #有/和没有/是有很大区别的 
}

}

#proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri

#当proxy_pass 后的链接地址末尾有/时,访问http://HOSTNAME/uri/时,实际转发到http://host/new_uri/

#当proxy_pass 后的链接地址末尾没有/时,访问http://HOSTNAME/uri/时,实际转发到http://host/new_uri/uri/

在http配置定义缓存信息
proxy_cache_path /var/cache/nginx/proxy_cache #定义代理机器上的缓存存放的路径
levels=1:1:1  

#对请求的url进行hash运算得出128位数字(16进制),取出最后三位数字,组成一级、二级、三级缓存目录

#当客户再次请求此资源时,代理服务器就会从这些缓存目录中快速找到请求资源

keys_zone=proxycache:20m #定义缓存名称供以后被调用,并定义缓存大小不能超过20m
inactive=120s  #120秒缓存资源未被再次访问则删除此资源

max_size=1g; #硬盘能存储最多的有关缓存hash信息的容量


调用缓存功能,需要定义在相应的配置段,如server{...};
proxy_cache proxycache; #调用在http配置段定义的代理缓存名称
proxy_cache_valid 200 302 301 1h; #定义对特定响应码的响应内容的缓存时长



ngx_http_fastcgi_module模块

php独立模块,前提在后端服务器先配置fpm server和mariadb-server

在前端nginx代理服务器上配置示例:

location ~* \.php$ {  #凡是请求php结尾的文件都会匹配location的内容
fastcgi_pass 后端fpm服务器IP:9000; #fastcgi-fpm是一种服务,其监听端口是9000
fastcgi_index index.php; #fpm服务的默认主页面
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name; 

include fastcgi_params;
#设置传递给FastCGI服务器的参数值,可以是文本,变量或组合

}



fastcgi缓存,与proxy_cache的功能类似,不再赘述

例子:

http {
fastcgi_cache_path /var/cache/nginx/fcgi_cache levels=1:2:1 keys_zone=fcgicache:20m inactive=120s;

#此处关于fastcgi缓存的配置与proxy_cache含义是一样的

...
server {
location ~* \.php$ {
...
fastcgi_cache fcgicache;
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m; #其他状态码默认缓存1分钟
...
}

}


ngx_http_upstream_module模块

用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用



定义后端服务器组,会引入一个新的上下文,在http配置段,默认调度算法是wrr
upstream httpdsrvs{
server x.x.x.x weight=m;
server x.x.x.x weight=n;
}


定义nginx代理服务器

 location / {
                proxy_pass 
http://httpdsrvs; #调用http配置段定义的后端服务器组 
        } 


本文转自  a_pan  51CTO博客,原文链接:http://blog.51cto.com/panpangao/1976874



相关实践学习
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
2月前
|
Java 应用服务中间件 Apache
简介Nginx,Tomcat和 Apache
简介Nginx,Tomcat和 Apache
简介Nginx,Tomcat和 Apache
|
3月前
|
负载均衡 Ubuntu 应用服务中间件
【Linux】Web服务之Nginx服务
【Linux】Web服务之Nginx服务
38 0
|
4月前
|
应用服务中间件 Linux 网络安全
Linux 安装 Nginx 并配置为系统服务(超详细)
Linux 安装 Nginx 并配置为系统服务(超详细)
|
6月前
|
Kubernetes Cloud Native 应用服务中间件
【云原生】使用k8s创建nginx服务—通过yaml文件svc类型暴露
【云原生】使用k8s创建nginx服务—通过yaml文件svc类型暴露
123 0
|
6月前
|
Kubernetes Cloud Native 应用服务中间件
【云原生】使用k8s创建nginx服务—通过ingress类型暴露
【云原生】使用k8s创建nginx服务—通过ingress类型暴露
|
4月前
|
负载均衡 算法 应用服务中间件
这些负载均衡都解决哪些问题?服务、网关、NGINX?
这些负载均衡都解决哪些问题?服务、网关、NGINX?
|
27天前
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
176 0
|
1月前
|
安全 应用服务中间件 nginx
|
1月前
|
域名解析 网络协议 应用服务中间件
nginx-ingress通过ipv6暴露服务,并在nginx ingress日志中记录客户端真实ipv6的ip地址
本文主要通过阿里云提供的clb和nlb来实现,建议是提前创建好双栈的vpc和vsw(使用clb可以不用双栈vpc和vsw)
175 1
|
2月前
|
缓存 应用服务中间件 网络安全
nginx服务升级配置
nginx服务升级配置