Nginx的安装
- 我们有了很多语言的后端服务,为什么还需要Nginx呢?
- Nginx是目前使用最多的Web服务器,主要实现的是HTTP的相关功能
- Nginx是一个非常纯粹的HTTP协议实现的服务,并不针对业务逻辑的开发
- Nginx的主要功能是用于HTTP的代理,主要提供:load balancing, caching, cloud deployments等功能
- 可使用lua来扩展相关功能
- windows平台下载地址:https://nginx.org/en/download.html
- mac平台安装:通过Homebrew, $
brew install nginx
会默认安装在/usr/local/nginx/sbin
- 或者通过https://nginx.org/en/download.html 下载,之后顺序执行
- $
./configure
- $
install
- $
make install
- $
/usr/local/nginx/sbin/nginx -v
- $
- 或者通过https://nginx.org/en/download.html 下载,之后顺序执行
- 进入安装目录,或者配置好环境变量,启动nginx
- Mac环境:$
cd /usr/local/nginx/sbin & sudo ./nginx
- Windows环境:$
./nginx.exe
- Mac环境:$
- 访问 http://localhost 可以看到 Welcome to nginx! 的欢迎语,这样就成功启动了
- 成功之后,就可以修改配置,用nginx来代理我们自己开发的服务
- 同样的, 检查,重启和关闭
- 检查 $
./nginx -t
- 重启 $
./nginx -s reload
- 关闭
- 查询nginx主进程号:$
ps -ef|grep nginx
- 正常关闭 $
sudo kill -QUIT 主进程号
- 快速关闭 $
sudo kill -TERM 主进程号
- 查询nginx主进程号:$
- 检查 $
nginx的相关功能
- 我们使用nginx一般是来做代理功能和缓存功能,并且可以篡改HTTP请求内容
- 我们要知道代理缓存是如何工作的,以及什么是HTTP代理
- 在nginx/conf目录中,有一个nginx.conf文件,它是nginx配置的主文件
- 在这个配置文件中,可以
include servers/*.conf
来启动所有配置 - 当有新的站点需要创建时候,可以为其单独创建新的文件
- 每个新站点可以有效的隔离管理
- include是常用的指令,用于导入一些配置
- 这里加单举例说明,如:servers/test.conf
server { listen 80; server_name test.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; } } server { listen 80; server_name a.test.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; } } server { listen 80; server_name b.test.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; } }
- 同时,本地也要进行一些host的配置, 比如在Mac上$
sudo vi /etc/hosts
http://127.0.0.1 test.com http://127.0.0.1 a.test.com http://127.0.0.1 b.test.com
- 其主要功能是在本地开启三个代理
- server 表示在本地开启一个服务
- listen 80 表示监听80端口
- server_name 表示在浏览器中访问的host name
- 它会根据访问的host name,来判断把服务启动在什么地方,返回什么内容,代理到哪个地方
- location 表示访问路径
- proxy_pass 表示代理的具体服务地址
- 配置到这一步代理已经成功了
- proxy_pass 设置了什么,默认其host就是什么
- proxy_set_header 表示修改代理的HTTP头
proxy_set_header Host $host
表示经过代理之后修改host为配置的host- 加上这个,如果你访问test.com时,其host就是test.com
- 不加这个,如果你访问test.com时候,其host就是http://127.0.0.1:8000
- 可以针对这个不同的nginx配置,在node服务中添加
console.log(request.headers.host)
进行验证 - 在不同配置验证的时候,注意进行重启nginx操作:$
sudo nginx -s reload
- 从这里可以看出nginx可以修改请求的内容,浏览器发送请求到nginx
- nginx这边进行转发,也就是nginx发起了一个http的请求,发送到我们实际的服务器
- 作为发起方,nginx认为的host就是我们设置的proxy_pass
- 作为开发者,我们拿到host希望拿到浏览器给我们的host,而非我们自己的host
- 我们就要加上这个
proxy_set_header Host $host
- 而这个$host就是nginx中的一个变量,这个变量是请求中带过来的host
- 这样设置,请求中是什么host,就是什么host, nginx中有很多变量,此处不再赘述
- 由此可见,中间代理可以做任何它想做的任何事情,比如我们上网的时候,可能会看到的一些网络服务商插入的广告
- 而http传输是明文都是不可靠的,https传输是加密,如果是https协议传输,那么代理则无法做任何修改
- 服务端使用不同host是为了区分我们的访问域名的,nginx是通过请求中的host来判断请求是要代理到什么地方
- proxy_pass 表示代理的具体服务地址
- 上面例子的是将不同的域名都配置到了同一个端口80,其所有请求都到了本机的http://127.0.0.1:8000服务
- 这样一台物理机器就可以跑几个不同的服务,这样可以更高效利用计算机
- 在这个配置文件中,可以