什么是 Nginx?
Nginx (engine x) 是一款轻量级的 web 服务器 , 反向代理服务器及电子邮件 (IMAP/POP3) 代理服务器.
什么是反向代理?
反向代理 (Reverse Proxy) 方式是指以代理服务器来接受 internet 上的连接请求, 然后将请求转发给内部网络上的服务器, 并将从服务器上得到的结果返回给 internet 上请求连接的客户端, 此时代理服务器对外就表现为一个反向代理服务器.
安装与使用
安装
nginx 官网下载地址: http://nginx.org, 发布版本分为 Linux 和 Windows 版本.
也可以下载源码, 编译后运行.
从源代码编译 Nginx
把源码解压缩之后, 在终端里运行如下命令:
默认情况下, Nginx 会被安装在 /usr/local/nginx. 通过设定编译选项, 你可以改变这个设定.
Windows 安装
为了安装 Nginx / Win32, 需先下载它. 然后解压之, 然后运行即可. 下面以 C 盘根目录为例说明下:
Nginx / Win32 是运行在一个控制台程序, 而非 Windows 服务方式的. 服务器方式目前还是开发尝试中.
使用
nginx 的使用比较简单, 就是几条命令.
常用到的命令如下:
nginx -s stop : 快速关闭 Nginx, 可能不保存相关信息, 并迅速终止 Web 服务.
nginx -s quit : 平稳关闭 Nginx, 保存相关信息, 有安排的结束 Web 服务.
nginx -s reload : 因改变了 Nginx 相关配置, 需要重新加载配置而重载.
nginx -s reopen : 重新打开日志文件.
nginx -c filename : 为 Nginx 指定一个配置文件, 来代替缺省的.
nginx -t : 不运行, 而仅仅测试配置文件. nginx 将检查配置文件的语法的正确性, 并尝试打开配置文件中所引用到的文件.
nginx -v: 显示 nginx 的版本.
nginx -V: 显示 nginx 的版本, 编译器版本和配置参数.
如果不想每次都敲命令, 可以在 nginx 安装目录下新添一个启动批处理文件 startup.bat, 双击即可运行. 内容如下:
如果是运行在 Linux 下, 写一个 shell 脚本, 大同小异.
nginx 配置实战
我始终认为, 各种开发工具的配置还是结合实战来讲述, 会让人更易理解.
http 反向代理配置
我们先实现一个小目标: 不考虑复杂的配置, 仅仅是完成一个 http 反向代理.
nginx.conf 配置文件如下:
注: conf / nginx.conf 是 nginx 的默认配置文件. 你也可以使用 nginx -c 指定你的配置文件
好了, 让我们来试试吧:
启动 webapp, 注意启动绑定的端口要和 nginx 中的 upstream 设置的端口保持一致.
更改 host:
在 C:Windows\System32\drivers\etc 目录下的 host 文件中添加一条 DNS 记录 127.0.0.1 www.javastack.cn 启动前文中 startup.bat 的命令
在浏览器中访问 www.javastack.cn, 不出意外, 已经可以访问了.
负载均衡配置
上一个例子中, 代理仅仅指向一个服务器.
但是, 网站在实际运营过程中, 多半都是有多台服务器运行着同样的 App, 这时需要使用负载均衡来分流.
nginx 也可以实现简单的负载均衡功能.
假设这样一个应用场景: 将应用部署在 192.168.1.11:80,192.168.1.12:80,192.168.1.13:80 三台 Linux 环境的服务器上. 网站域名叫 www.javastack.cn, 公网 IP 为 192.168.1.11. 在公网 IP 所在的服务器上部署 nginx, 对所有请求做负载均衡处理.
nginx.conf 配置如下:
网站有多个 webapp 的配置
当一个网站功能越来越丰富时, 往往需要将一些功能相对独立的模块剥离出来, 独立维护. 这样的话, 通常, 会有多个 webapp.
举个例子: 假如 www.javastack.cn 站点有好几个 webapp,finance(金融),product(产品),admin(用户中心). 访问这些应用的方式通过上下文 (context) 来进行区分:
- www.javastack.cn/finance/
- www.javastack.cnproduct/
- www.javastack.cn/admin/
我们知道, http 的默认端口号是 80, 如果在一台服务器上同时启动这 3 个 webapp 应用, 都用 80 端口, 肯定是不成的. 所以, 这三个应用需要分别绑定不同的端口号.
那么, 问题来了, 用户在实际访问 www.javastack.cn 站点时, 访问不同 webapp, 总不会还带着对应的端口号去访问吧. 所以, 你再次需要用到反向代理来做处理.
配置也不难, 来看看怎么做吧:
https 反向代理配置
一些对安全性要求比较高的站点, 可能会使用 HTTPS(一种使用 ssl 通信标准的安全 HTTP 协议).
这里不科普 HTTP 协议和 SSL 标准. 但是, 使用 nginx 配置 https 需要知道几点:
HTTPS 的固定端口号是 443, 不同于 HTTP 的 80 端口
SSL 标准需要引入安全证书, 所以在 nginx.conf 中你需要指定证书和它对应的 key
其他和 http 反向代理基本一样, 只是在 Server 部分配置有些不同.
静态站点配置
有时候, 我们需要配置静态站点(即 html 文件和一堆静态资源).
举例来说: 如果所有的静态资源都放在了 /App/dist 目录下, 我们只需要在 nginx.conf 中指定首页以及这个站点的 host 即可.
配置如下:
然后, 添加 HOST:
127.0.0.1 static.zp.cn, 此时, 在本地浏览器访问 static.zp.cn , 就可以访问静态站点了.
跨域解决方案
Web 领域开发中, 经常采用前后端分离模式. 这种模式下, 前端和后端分别是独立的 Web 应用程序, 例如: 后端是 Java 程序, 前端是 React 或 vue 应用
各自独立的 Web App 在互相访问时, 势必存在跨域问题. 解决跨域问题一般有两种思路:
CORS
在后端服务器设置 HTTP 响应头, 把你需要运行访问的域名加入加入 Access-Control-Allow-Origin 中.
JSONP
把后端根据请求, 构造 JSON 数据, 并返回, 前端用 JSONP 跨域.
这两种思路, 本文不展开讨论.
需要说明的是, nginx 根据第一种思路, 也提供了一种解决跨域的解决方案.
举例: www.javastack.cn 网站是由一个前端 App , 一个后端 App 组成的. 前端端口号为 9000, 后端端口号为 8080.
前端和后端如果使用 http 进行交互时, 请求会被拒绝, 因为存在跨域问题. 来看看, nginx 是怎么解决的吧:
首先, 在 enable-cors.conf 文件中设置 cors :
接下来, 在你的服务器中 include enable-cors.conf 来引入跨域配置:
到此, 就完成了.
来源: http://www.jianshu.com/p/53ff5060a758