因为前几天加班比较多,人也比较累,不怎么想学习新的知识,周三加班到周四凌晨1点多,周四晚上直接到周五4点钟才睡,上午还要去上班,结果项目线上小问题不断,搞的身心俱疲,副能量爆满!!!周末就想着好好放松下,所以今天来点简单的!nginx,其实自己接触nginx也比较长时间了,上家公司项目使用nginx主要作为的是静态资源服务器,毕竟nginx的性能在业界也是有目共睹的,但是自己并没有怎么学习过nginx,只是懂的一点点配置。这次之所以想起再来看nginx是因为前段时间自己想在自己的服务器上搞一个jet brains的服务器,方便自己使用,其中就用nginx作为反向代理服务器使用,结果呢,搞了半天也没成功,也不知道是哪方面原因。所以自己准备再研究一下,不然以后经常找IDE的破解码也挺麻烦(壕们请支持正版)。不管怎么说nginx作为一个优秀的web服务器确实是值得我们去好好学习一下的。
一、安装和启动
这次我使用的是安装包安装,当然觉得麻烦也可以使命令直接安装。我这次安装下载的1.14版本,应该是最新版本了。下载之后进入相应文件夹下,执行解压命令:
tar zxvf nginx-1.14.0.tar.gz
大概看下解压的目录结构:
然后使用默认的配置,即执行./configure命令,结果报错,提示HTTP rewrite模块需要PCRE库。当然给出的方案要不禁用http_rewrite模块,要不系统安装PCRE库。所以就选择在自己系统安装PCRE库吧。
执行命令安装PCRE和它的二次开发库:
sudo apt-get install libpcre3 libpcre3-dev
PCRE库支持正则表达式。如果我们在nginx.conf中使用了正则表达式,那么在编译nginx时就必须把PCRE库编译进nginx,因为HTTP模块需要靠它来解析正则表达式。而pcre-devel是使用PCRE做二次开发时所需要的开发库,包括头文件等,这也是编译nginx需要使用到的。
仅仅安装了PCRE库是不够的,还需要安装zlib库,这个是HTTP gzip模块需要使用到。zlib库用于对HTTP包的内容做gzip格式的压缩,如果我们在nginx.conf中配置了gzip on,并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量(如果你仔细看过http请求的时候就会注意到这点),因此在编译时必须把zlib编译进nginx,zlib-devel是二次开发所需要的库。所以还需要执行下面的命令:
sudo apt-get install zlib1g-dev
最后如果服务器不只是要支持HTTP还想支持更安全的HTTPS,那么就还需要安装OpenSSL,我的系统之前已经安装过了,安装命令:
sudo apt-get install openssl libssl-dev
这时候再次执行默认配置如图所示:
然后编译安装nginx:
sudo make install
编译安装完之后我们看到安装目录下,即"/usr/local/nginx",然后进入"/sbin目录",启动nginx:
sudo ./nginx
使用浏览器访问:localhost:80,显示nginx的index.htm页面,说明服务器成功启动。
这里简单说下nginx常用命令
./nginx
./nginx -s quit
./nginx -s stop
./nginx -s reload
quit和stop都是停止服务器的意思,但是quit的命令会在关闭服务器前完成正在服务的连接,而stop就是立即停止服务。另外如果对nginx的配置文件进行了修改,并想使其生效,可以用reload命令。
二、反向代理配置
关于什么是反向代理,以及和代理的区别这里就不细述了,如果又不了解建议百度或者谷歌一下,其实很好理解。我这里只是做一个最简单的配置,比如现在我想让用户访问localhost:80/这个请求的时候,显示百度的首页,那么我就可以到"/usr/local/conf/"下进行配置,打开nginx.conf文件,在http模块的server自摸块下面修改配置文件内容,在location下添加代理的地址就可以了,如下图:
其实从http模块我们也可以看到一些基本的配置的内容,比如文件mime类型,默认的类型为二进制流,此外日志格式和日志位置,文件传输,连接超时时间以及gzip设置。
server下面主要是监听端口号,服务器名称,这里可以是域名也可以是ip地址,另外还有就是字符编码和日志。location主要是配置URL和解析URL,比如默认情况下用户访问localhost:80,nginx会到响应的内容是html下面的index.html或者index.htm,root这里使用的是相对路径(相对于nginx安装目录),当然也可以使用绝对路径。
反向代理是同过"proxy_pass"来实现的,我这里配置了百度的域名,保存好配置文件之后,执行reload命令重新加载新的配置文件,并访问:localhost:80
可以看到已经是百度页面了,然后看下请求和响应头,根据状态吗推断是nginx帮我们做了重定向。以上就是最简单的一个反向代理的例子。
三、静态资源服务器
使用nginx作为静态资源服务器在上家公司遇到过,但是目前开发web服务器主要还是使用Apache,vanish缓存。还是在server子模块下,添加一个location的配置:
location /static/ {
root /home/ypcfly/ypcfly;
expires 1d;
}
这里我开始的时候遇到了一个问题,就是请求资源时报404错误,后来网上找了一些资料才算是搞明白是怎么回事了。主要是root和alias的区别,比如现在配置的root,如果请求localhost:80/static/images/111.jpg,实际对应的路径是/home/ypcfly/ypcfly/static/images/111.jpg,也就是说如果配置成root的话,文件的地址应该是配置的root路径 + location路径 + 请求资源名。如果配置的是alias的话配置稍有不同
location /static/ {
alias /home/ypcfly/ypcfly/;
expires 1d;
}
注意:alias必须以"/"结尾。如果我访问的依然是localhost:80/static/images/111.jpg,这时实际的路径应该是/home/ypcfly/ypcfly/images/111.jpg,也就是说配置成alias,文件地址是:配置的alias路径 + 请求资源名称。这个是官方文档的一点说明:https://nginx.org/en/docs/beginners_guide.html#static
expires指定的是过期时间
好了,我配置使用的是root,重新加载下配置文件,并访问localhost:80/static/images/golang-5.png,我本地图片保存的实际路径是:/home/ypcfly/ypcfly/static/images/golang-5.png。
已经可以正常访问了,说明配置生效了。
今天只是从最简单的部分入手,如果要深入的学习,还是要多看文档,多实践,多总结才行。今天自己也是偷懒,从最简单的部分开始,关于nginx的其他知识点后期再学习。