以下讲记述的,是为nginx入门级新人和打算学习nginx的人而准备的。
首先,nginx(读作:engine x)是一个反向代理服务器。这里顺便阐述一下相关的概念,来帮助概念不清楚的朋友来获得最佳的学习体验。
服务器可以按照不同标准划分为很多种,那么这里讨论的就是其中的一种,代理服务器。代理服务器可以再次细分,分为正向代理服务器和反向代理服务器,这两者是相对于目标服务器而言的。当我们(O)希望访问某一台服务器(T,是具体的服务器),但是由于种种原因,我们不能去直接的访问T,但是我们可以直接访问另一台服务器(P),而P却可以访问T,那么正好,我们拜托P去访问T,将获得的信息返回给我们,这个过程中,我们始终知道要访问的那一台服务器,所以,这个代理过程称为正向代理;那么与之相对,如果我们知道要访问的站点,但是该站点可能同时部署在多个服务器上,不过最终我们获得了目标站点的内容,这个过程中,我们不知道具体访问过哪一台服务器,所以,这个代理过程称为反向代理。
那么nginx就是近些年来使用率不断攀升的代理服务器,你可以查看一下中间件的使用情况,这里给出一个调查,
点我查看好了,我们开始吧。我不管你什么系统,但是我假定你已经安装好了nginx,排除那些系统上操作的差异,我们来感受一下最基本的操作。
nginx的启动,停止,重新加载配置文件
在控制台中定位到nginx所在的目录,使用nginx -s signal操作nginx,signal可以是以下参数
- stop — 立刻停止(不会等待当前工作结束)
- quit — 延迟停止(会等待当前工作结束)
- reload — 重新加载配置文件(会优先检查新配置文件的格式,通过校验则启用新配置,不通过则沿用旧配置)
- reopen — 重新打开日志文件
好了,知道了基本操作之后,我们就看一下配置文件,看懂了配置文件,我们就能让nginx按照我们的需要来运作。打开nginx.cnf文件
#user nobody;
#我左边有个“#”号,这说明这一行都是注释
#下面的这个,看起来像一对键值对,这么理解也可以,官方给出的解释是“简单指令”
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#与简单指令相对,下面的event以及一对花括号,称作“块指令”;含有其他指令的“块指令”,我们称作“上下文”
#同时,我们把不被包含在任何其他上下文中的上下文称作主上下文
#所以,“events”和“http”就是主上下文,“server”和“location”就不是主上下文
events {
worker_connections 1024;
}
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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#好了,我们需要配置一个服务器最基本的功能,给出请求相应结果
#看到下面这个server上下文,它看上去但是也的确是用来配制服务器的
server {
#这个server上下文监听的端口以及域名
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#这里就是路由规则了,location加空格再加匹配项,这里的匹配项是“/”,也就是说所有以“/”开头的请求都符合这个路由规则
#但是需要注意一点,nginx在匹配路由的时候有一个最长前缀匹配规则,看到下一个路由规则
location / {
#这里的root指的是响应资源所在的目录,这是指明,资源在nginx目录下的index目录里
root html;
#index指令会响应指定的页面,按次序进行查找,找到了就返回
index index.html index.htm;
}
#这location的匹配项是“/demo”,那么当一个请求是“/demo/get”的时候,这个请求会匹配之前的“/”和这里的“/demo”,但是
#nginx会选择前缀较长的匹配项来匹配,所以nginx会使用/demo路由的相应内容
location /demo {
#这里又重新设定了root的值,表示用nginx目录demo目录下的资源响应
#如果root在主上下文之外设定,那么相当于一个全局的设定,在其他上下文中没有被覆盖的话,则使用全局设定
root demo;
}
#截止到为目前的配置,nginx都是用来响应静态的资源,比如我们访问localhost/demo/show.html,那么nginx会返回nginx目录下
#demo目录下show.html的内容,所以,我们经常会把nginx当做一个静态内容缓存来使用,来缓解后续服务器的响应压力
#对于location来说,常用的还有正则匹配
#静态资源配置,当然也可以来响应动态请求,不过这里有一点需要注意,当使用正则匹配时,如果请求匹配了当前的路由规则,那么
#会以正则的匹配内容为主并返回,不会使用非正则的匹配项内容返回,以“~”开头,就表示匹配项是一个正则表达式,当然,还有其
#他不同规则的前缀都表示正则,后续再展开
location ~ .*\.(css|js)(.*) {
proxy_set_header Host $host;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
expires 7d;
}
#对于代理服务器来说,最基本的功能代理是必不可少的,而且配置也非常简单
#端口转发配置,做出如下配置之后,符合匹配项的请求会原封不动的转发到otherhost域名下
location /proxy{
proxy_pass http://otherhost;
}
#下面的配置显而易见,是错误页面的配置
#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;
}
}
}
有了这套最基本的配置,就可以试着开启nginx,感受一下它的功能