最近研究python,发现ES6的很多“新特性”在python上都能找到参照:iterable的概念、generator函数、解构赋值等,但部分地方ES又没实现得很彻底。。按照目前趋势,在处理业务这个角度上,JS这门语言以后使用起来会变得越发方便。
python的学习告一段落,回到前端。
作为一个高性能的http和反向代理服务器,nginx还是要了解下。
优势:稳定,丰富的功能集(得益于其模块化设计),占用内存少,配置简单。并发量大的时候其性能优势才得以体现。
处理:错误页、缓存、反向代理、负载均衡等。
架构:nginx有一个主进程(main proccess)管理着若干个工作进程(worker proccess)。启动nginx的进程作为主进程,也即监控进程,它可以fork()出子进程充当工作进程。主进程自己充当进程组与用户交互的接口,不负责业务处理、网络事件等,只通过管理工作进程实现配置文件的实时生效、代理服务的重启、替换工作日志等。实际处理各种请求和事务的是工作进程,而工作进程的数目可在配置文件中设置,一般为服务器CPU核数。另外,nginx采用事件驱动模型和依赖于操作系统的机制以提高工作效率:比如在linux上nginx采用epoll事件模型,而在OpenBSD或FreeBSD上采用类似的kqueue事件模型。
在生产实践中,除了几个常用命令,我们只需要设置nginx.conf配置文件即可。
一:安装
由于自己用的是苹果电脑,下面是在mac上的安装,Linux安装参考这里
用homebrew安装即可:
brew install nginx
安装完后:配置文件在:
/usr/local/etc/nginx/nginx.conf
启动niginx:
sudo nginx
停止服务:
sudo nginx -s stop
二:配置文件的结构
nginx的配置文件实际上就是一组指令(Directives)的集合。这里所谓指令:就是键值对,如果值由多个对象构成,则这些对象间用空格隔开。
指令分简单指令(simple direactives)和块指令(block direactive):块指令的值是一组指令,由{}括起来。
#user nobody; //#开头的是注释
worker_processes 1; //这是简单指令(simple direactive),以";"结尾
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events { //这是块指令(block direactives),以"{}"括起来
worker_connections 1024;
}
http { //这是块指令(block direactives)
include mime.types;
default_type application/octet-stream;
}
nginx使用哪些功能模块、这些模块怎么设置,都在这个配置文件的指令里设置。
使用最基本的功能时,配置文件要修改的是两个地方:端口号及我们web项目的路径。
1.将nginx.conf配置文件里,listen 8080 改为我们常用的80。
server {
listen 8080;
server_name localhost;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
2.用homebrew安装nginx时,html folder默认位置为:
/usr/local/Cellar/nginx/1.2.3/html //1.2.3为nginx版本号
这个html文件夹即nginx.conf里location/{root html} 的html。此时我们要将root的值改为我们项目的路径,比如:
location / {
root /Users/vicky/Documents/Web;
index index.html index.htm;
}
三:基础命令
nginx及其模块的运行取决于其配置文件,nginx启动后,我们可以通过下边的基础命令对其进行操纵:
nginx -s signal
signal的值可以为:
stop:快速关闭
quit:平滑关闭,让工作进程完成现有任务后再关闭
reload:修改后重载配置文件,这个命令估计是最常用的。。。。
reopen:重新打开日志文件
四:如何架设静态资源服务器?
nginx设置静态资源非常简单,假设我们的web项目打包后放在/data/www,另有图片资源文件夹/data/images。现在修改nginx.conf文件,将http:{server:{}}部分的指令修改:
http:{
server:{ //这里server的语义就是一个静态资源服务器
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
nginx启动后,当一个请求过来时,nginx会根据请求的url与location字段后的路径前缀(这里是"/"或"/images/")进行匹配,先和"/images/"匹配,如果没有"/images/",再和"/"匹配。
比如请求的url为"http://localhost/images/example.png",url的文件路径有"/images/",就以/data为根目录,寻找/data下的images文件夹的example.png文件发送给客户端,没有的话默认返回404。
而如果请求的url路径没有"/images/",即不匹配第二个location,就会匹配第一个location。比如"http://localhost/some/example.html",nginx会以/data/www为根目录,寻找/data/www/some/example.html文件。
五.如何架设反向代理服务器?
nginx另一个最常用的功能是作为代理服务器,将请求传给本地某个服务器,接收服务器的响应并返回给客户端。
在nginx官方的Beginner's Guide中举了个案例,建立一个代理服务器,将所有非图片资源的请求转发给8080端口。
第一步,给http块指令里添加一个新的server:
server { //这个server的语义是一个本地服务器,所有请求以/data/up1为查询根目录
listen 8080;
root /data/up1; //如果locaton里没有指定root指令,一律以/data/up1为根目录
location / {
}
}
此时共有两个sever,现在我们对静态资源server块指令作出修改如下:
server { //这个server的语义是一个反向代理服务器,非图片资源的请求都转发给http://localhost,端口号为8080
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ { //这里用正则作为location的匹配依据,注意正则前要加~符号及空格
root /data/images;
}
}
可见,无论作为静态资源服务器还是反向代理,nginx的做法是对uri字符串进行模式匹配从而决定接下来的操作。
六.配合nodejs
其实无论配合什么服务器使用,nginx这边只要在nginx.conf中添加代理服务器的server指令就好了。比如我们已经在本地开启了两个服务器,一个是用的3000端口:
server{
listen 80;
server_name www.vainus.xyz;
location / {
proxy_pass http://localhost:3000/;
}
location ~ \.(jpg|png|gif)$ {
root /data/images;
}
}
另一个是3001端口:
server{
listen 80;
server_name blog.vainus.xyz;
location / {
proxy_pass http://localhost:3001/;
}
location ~ \.(jpg|png|gif)$ {
root /data/images;
}
}
当我们输入这两个网址的uri时,nginx会将非图片资源的请求送到localhost3000或3001。注意,此时需要在host文件中将域名映射为本地IP,即127.0.0.1。在生产中,则往往是在路由器设置DNS,最终是一个公网ip的80端口映射到企业内部的多个程序接口。
nginx的配置文件可以弄的很复杂,今天先到这里。
PS:慕课网上有个教程提到centOS上安装nginx:
由于centos自带软件源是没有nginx的,可以:
yum install epel-release
#弹出提醒时敲y
yum install nginx
#弹出提醒时再敲y即可
#默认配置文件目录:
cd /etc/nginx
vim nginx.conf
参考: