Nginx 基本概念 {#Nginx 基本概念}
Nginx 是什么, 可以做什么事情? {#Nginx 是什么 - 可以做什么事情}
Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器, 特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等
Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验, 有报告表明能支持高达 50,000 个并发连接数。
Nginx 作为 web 服务器 {#Nginx 作为 web 服务器}
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php 等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发, 性能是其最重要的考量, 实现上非常注重效率 ,能经受高负载的考验, 有报告表明能支持高 达 50,000 个并发连接数。
基本特性 {#基本特性}
- 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲
- 无缓存的反向代理加速,简单的负载均衡和容错.
- FastCGI,简单的负载均衡和容错.
- 模块化的结构。包括 gzipping, byte ranges, chunked responses, 以及 SSI-filter 等 filter。如果由 FastCGI 或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。
- 支持 SSL 和 TLSSNI.
Nginx 专为性能优化而开发,性能是其最重要的考量, 实现上非常注重效率 。它支持内核 Poll 模型,能经受高负载的考验, 有报告表明能支持高达 50,000 个并发连接数。
正向代理 {#正向代理}
Nginx 不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
在客户端浏览器中配置代理服务器指定网站访问
反向代理 {#反向代理}
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
负载均衡 {#负载均衡}
- 单一服务器对应大量访问的弊端
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
- 负载均衡解决方案
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的
负载均衡
概述: 将大量请求通过反向代理服务器进行均衡分发到各个源服务器, 从而实现三高(高性能、高并发、高可用);
动静分离 {#动静分离}
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
动静分离实现 {#动静分离实现}
安装 Nginx {#安装 Nginx}
- 使用远程工具 Xshell 链接系统(Linux)
官网地址:传送门
- 查看 nginx 全部版本
$ yum list | grep nginx
- 解压安装
$ yum install nginx
- 查看版本
$ nginx -v
- 查看安装位置
$ rpm -ql nginx
- 推荐本地安装
# 安装 nginx 依赖, 上传 pcre-8.37 到 local 目录, 解压文件
$ yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
# 解压
# $ tar -zxvf pcre-8.37.tar.gz
# 删除压缩包
$ rm -f pcre-8.37.tar.gz
# 进入安装目录
$ cd pcre-8.37/
# 执行
$ ./configure --prefix=/usr/local/nginx-1.18.0/
# 查看 pcre 版本
$ pcre-config --version
# 上传文件到 /usr/local 目录下并解压
$ tar -zxvf nginx-1.18.0.tar.gz
# 删除未解压的压缩包
$ rm -f nginx-1.18.0.tar.gz
# 修改名称
$ mv nginx-1.18.0/ nginx
# 进入 nginx 目录, 执行./configure
$ ./configure
# 编译并安装
$ make && make install
# 进入目录 /usr/local/nginx/sbin/nginx 启动服务
$ cd /usr/local/nginx/sbin/
# 启动
$ ./nginx
# 查看进程
$ ps -ef | grep nginx
# 访问, 通过查看配置发现默认端口号是 80
$ cd /usr/local/nginx/conf/
# 查看默认端口号
$ cat nginx.conf
============================================================
server {
listen 80;
server_name localhost;
============================================================
# 查看 IP 地址, 外部浏览器访问 IP 地址 + 端口号测试访问
$ ifconfig
# 浏览器访问服务器公网 IP
http://39.108.96.122//80 # 无法访问此网站, 因为没有开放 80 端口
# 设置开放的端口号
$ firewall-cmd --zone=public --add-port=80/tcp --permanent
# 重启防火墙
$ systemctl restart firewalld
# 查看已开放端口号
$ firewall-cmd --list-all
效果:
Nginx 常用操作命令 {#Nginx 常用操作命令}
- 启动命令
# 使用 nginx 命令必须要在 nginx 目录下操作
$ cd /usr/local/nginx/sbin
# 启动 nginx
$ ./nginx
- 关闭 nginx
# 查看进程
$ ps -ef | grep nginx
# 关闭 nginx
$ ./nginx -s stop
- 查看 nginx 版本号
# 查看版本
$ ./nginx -v
- 通过端口判断 nginx 是否启动
$ netstat -anp | grep :80
- 重新加载
# 修改配置以后需要使用此命令
$ nginx -s reload
- 关闭 nginx 服务器
# 关闭 Nginx 服务器
$ pkill -9 nginx
重新加载出现的异常:
异常信息:nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
问题描述, 使用 nginx 重新加载配置的时候出现的环境问题
# 使用 nginx -c 的参数指定 nginx.conf 文件的位置 $ /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 查看日志 $ cd logs/ # 打印列表 $ ll -rw-r--r-- 1 root root 6575 Jun 13 13:18 access.log -rw-r--r-- 1 root root 7060 Jun 13 13:18 error.log -rw-r--r-- 1 root root 5 Jun 13 13:17 nginx.pid # 问题原因
Nginx 配置文件 {#Nginx 配置文件}
配置文件位置 {#配置文件位置}
- nginx 配置文件的位置
# 进入 nginx 目录
$ cd /usr/local/nginx
# 进入配置目录
$ cd conf/
# 查看文件
$ ll
Nginx 配置文件组成 {#Nginx 配置文件组成}
# ======================== 第一部分 ================================
#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;
# ======================== 第二部分 ================================
events {
worker_connections 1024;
}
# ======================== 第三部分 ================================
http {
include mime.types;
default_type application/octet-stream;
<span class="token comment">#log_format main '$remote_addr - $remote_user [$time_local]"$request" '</span>
<span class="token comment"># '$status $body_bytes_sent"$http_referer" '</span>
<span class="token comment"># '"$http_user_agent" "$http_x_forwarded_for"';</span>
<span class="token comment">#access_log logs/access.log main;</span>
<span class="token directive"><span class="token keyword">sendfile</span> <span class="token boolean">on</span></span><span class="token punctuation">;</span>
<span class="token comment">#tcp_nopush on;</span>
<span class="token comment">#keepalive_timeout 0;</span>
<span class="token directive"><span class="token keyword">keepalive_timeout</span> <span class="token number">65</span></span><span class="token punctuation">;</span>
<span class="token comment">#gzip on;</span>
<span class="token directive"><span class="token keyword">server</span></span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">listen</span> <span class="token number">80</span></span><span class="token punctuation">;</span>
<span class="token directive"><span class="token keyword">server_name</span> localhost</span><span class="token punctuation">;</span>
<span class="token comment">#charset koi8-r;</span>
<span class="token comment">#access_log logs/host.access.log main;</span>
<span class="token directive"><span class="token keyword">location</span> /</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">root</span> html</span><span class="token punctuation">;</span>
<span class="token directive"><span class="token keyword">index</span> index.html index.htm</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">#error_page 404 /404.html;</span>
<span class="token comment"># redirect server error pages to the static page /50x.html</span>
<span class="token comment">#</span>
<span class="token directive"><span class="token keyword">error_page</span> <span class="token number">500</span> <span class="token number">502</span> <span class="token number">503</span> <span class="token number">504</span> /50x.html</span><span class="token punctuation">;</span>
<span class="token directive"><span class="token keyword">location</span> = /50x.html</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">root</span> html</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment"># proxy the PHP scripts to Apache listening on 127.0.0.1:80</span>
<span class="token comment">#</span>
<span class="token comment">#location ~ \.php$ {</span>
<span class="token comment"># proxy_pass http://127.0.0.1;</span>
<span class="token comment">#}</span>
<span class="token comment"># pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000</span>
<span class="token comment">#</span>
<span class="token comment">#location ~ \.php$ {</span>
<span class="token comment"># root html;</span>
<span class="token comment"># fastcgi_pass 127.0.0.1:9000;</span>
<span class="token comment"># fastcgi_index index.php;</span>
<span class="token comment"># fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;</span>
<span class="token comment"># include fastcgi_params;</span>
<span class="token comment">#}</span>
<span class="token comment"># deny access to .htaccess files, if Apache's document root</span>
<span class="token comment"># concurs with nginx's one</span>
<span class="token comment">#</span>
<span class="token comment">#location ~ /\.ht {</span>
<span class="token comment"># deny all;</span>
<span class="token comment">#}</span>
<span class="token punctuation">}</span>
<span class="token comment"># another virtual host using mix of IP-, name-, and port-based configuration</span>
<span class="token comment">#</span>
<span class="token comment">#server {</span>
<span class="token comment"># listen 8000;</span>
<span class="token comment"># listen somename:8080;</span>
<span class="token comment"># server_name somename alias another.alias;</span>
<span class="token comment"># location / {</span>
<span class="token comment"># root html;</span>
<span class="token comment"># index index.html index.htm;</span>
<span class="token comment"># }</span>
<span class="token comment">#}</span>
<span class="token comment"># HTTPS server</span>
<span class="token comment">#</span>
<span class="token comment">#server {</span>
<span class="token comment"># listen 443 ssl;</span>
<span class="token comment"># server_name localhost;</span>
<span class="token comment"># ssl_certificate cert.pem;</span>
<span class="token comment"># ssl_certificate_key cert.key;</span>
<span class="token comment"># ssl_session_cache shared:SSL:1m;</span>
<span class="token comment"># ssl_session_timeout 5m;</span>
<span class="token comment"># ssl_ciphers HIGH:!aNULL:!MD5;</span>
<span class="token comment"># ssl_prefer_server_ciphers on;</span>
<span class="token comment"># location / {</span>
<span class="token comment"># root html;</span>
<span class="token comment"># index index.html index.htm;</span>
<span class="token comment"># }</span>
<span class="token comment">#}</span>
}
-
Nginx 配置文件由三部分组成
-
全局块
从配置文件开始到 events 块之间的内容, 主要是设置一些影响 nginx 服务器整体运行的配置指令
-
worker_processes 1;
- 处理并发数的配置,
worker_processes
的值越大,
- 处理并发数的配置,
-
-
events 块
events 块涉及的指令主要是影响 nginx 服务器与用户的网络链接
-
worker_connections 1024;
worker_connections 1024
, 设置网络连接数最大数为 1024 个
-
-
http 块 (
配置最频繁的部分
)http 包含两部分模块,
http 全局块和
server 块, 这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
-
http
- 配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
-
server 块
-
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
- 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
- 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
-
全局
server
块- 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
-
location
块- 一个
server
块可以配置多个location
块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称
(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
- 一个
-
-
-
Nginx 配置实例 - 反向代理(1) {#Nginx 配置实例 - 反向代理 -1}
准备工作 {#准备工作}
实现效果: 在浏览器地址栏输入以下地址
www.mobai.com
跳转到 Linux 系统中Tomcat
主页面中
-
安装
nginx
-
安装
JDK
/(如果忘记了就看 Linux 学习笔记) -
安装
tomcat
, 使用默认端口号:8080
-
安装
Tomcat
/(如果忘记了就看 Linux 学习笔记) -
阿里云服务器默认未开启除 (22/3389/1) 以外其他端口, 添加了服务需要去控制台安全组手动添加服务端口
- 浏览器输入
公网 IP
, 访问tomcat
访问过程分析 {#访问过程分析}
具体实现 {#具体实现}
在 Windows 系统路径
C:\Windows\System32\drivers\etc\hosts
打开 hosts 文件, 进行域名和 IP 对应关系的配置, 如下图
- 设置 Windows 的 hosts 文件域名映射以后的效果
在 Nginx 进行请求转发设置(反向代理) {#在 Nginx 进行请求转发设置 - 反向代理}
- 具体实现
# 进入 nginx 配置文件
$ cd /usr/local/nginx/conf/
# 编辑配置文件
$ vim nginx.conf
# 在 nginx 进行请求转发的配置(反向代理配置)
======================= 反向代理配置 ============================
listen 80;
server_name 39.108.96.122;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
- 测试
# 进入 nginx 工作目录, 启动 nginx
cd /usr/local/nginx/sbin
# 启动 nginx
$ ./nginx
- 效果
Nginx 配置实例 - 反向代理(2) {#Nginx 配置实例 - 反向代理 -2}
需求: 使用 Nginx 反向代理, 根据访问的路径跳转到不同端口的服务中,nginx 监听端口未 9001;
http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8080 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8081
准备工作 {#准备工作 -1}
- usr 目录下新建
test~tomcat/8081 文件夹
两个文件夹 - 存入两个
Tomcat
, 端口分别为8081
,8080
;
# 进入工作目录, 创建 tomcat8081 文件夹
$ cd /usr/local
# 创建文件夹
$ mkdir tomcat8081
# 解压一个 tomcat 到这个文件夹
$ tar -zxvf apache-tomcat-8.5.55.tar.gz
# 开放 8081 端口号
$ firewall-cmd --zone=public --add-port=8081/tcp --permanent
# 重启防火墙
$ systemctl restart firewalld
# 查看已开放端口号
$ firewall-cmd --list-all
# 配置服务器 8081 端口号
# 启动 tomcat8081
$ cd /usr/local/tomcat8081/apache-tomcat-8.5.55/bin
# 启动
$ ./startup.sh
# 停止 tomcat
$ ./shutdown.sh
# 修改端口号
$ cd conf/
# 编辑
$ vim server.xml
======================修改两个部分========================
<Server port="8015" shutdown="SHUTDOWN">
=======================================
<Connector port="8081" protocol="HTTP/1.1"
# 保存退出即可
esc :wq!
# 分别启动两个 tomcat/ 并在浏览器分别访问两个端口 `8081~~8080`
准备
a.html
文件, 分别修改内容为8081~~8080
, 然后放在webapps
目录下
修改配置 {#修改配置}
- 找到 nginx 配置文件, 分别进行反向代理的配置
# 编辑配置文件, 实现 nginx 反向代理,根据访问的路径跳转到不同端口的服务中
$ vim nginx.conf
==========================================================
server {
listen 9001;
server_name 39.108.96.122;
<span class="token directive"><span class="token keyword">location</span> ~ /edu/</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">proxy_pass</span> http://127.0.0.1:8080</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token directive"><span class="token keyword">location</span> ~ /vod/</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">proxy_pass</span> http://127.0.0.1:8081</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}`
`# 设置开放的端口号`
$ firewall-cmd --zone=public --add-port=9001/tcp --permanent
`# 重启防火墙`
$ systemctl restart firewalld
`# 查看已开放端口号`
$ firewall-cmd --list-all
`# 重启 nginx`
$ ./nginx -s stop
`# 启动`
$ ./nginx`
测试 {#测试}
location 的匹配符 {#location 的匹配符}
=
: 用于不含正则表达式的uri
前, 要求请求字符串与uri
严格匹配, 如果匹配成功, 就停止继续向下搜索并立即处理该请求。~
: 用于表示uri
包含正则表达式, 并且区分大小写~*
: 用于表示uri
包含正则表达式, 并且不区分大小写。^~
: 用于不含正则表达式的uri
前, 要求Nginx
服务器找到标识uri
和请求字符串匹配度最高的1 cation
后, 立即使用此1ocation
处理请求, 而不再使用location
块中的正则uri
和请求字符串做匹配。注意: 如果
uri
包含正则表达式, 则必须要有~
或者^*
识
Nginx 配置实例 - 负载均衡 {#Nginx 配置实例 - 负载均衡}
准备工作 {#准备工作 -2}
需求:
实现效果,在浏览器地址栏输入:
http://39.108.96.122/edu/a.html
, 实现负载均衡效果,平均分担到8081
和8080
端口号中
- 准备工作
- 准备两台
tomcat
服务器,一台端口号为8080
, 一台端口号为8081
- 在两台
tomcat
的webapps
目录内, 创建edu
目录,分别放入a.html
文件,用来测试- 在
nginx
的配置文件中,进行负载均衡的配置
# 进入配置目录
$ vim nginx.conf
========================= 修改配置文件 ========================
#gzip on;
upstream myserver{
server 39.108.96.122:8080;
server 39.108.96.122:8081;
}
server {
listen 80;
server_name 39.108.96.122;
<span class="token comment">#charset koi8-r;</span>
<span class="token comment">#access_log logs/host.access.log main;</span>
<span class="token directive"><span class="token keyword">location</span> /</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">root</span> html</span><span class="token punctuation">;</span>
<span class="token directive"><span class="token keyword">proxy_pass</span> http://myserver</span><span class="token punctuation">;</span>
<span class="token directive"><span class="token keyword">index</span> index.html index.htm</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
![设置图](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
### 效果 {#效果}
```bash
# 进入 nginx 目录
$ cd sbin/
# 关闭 nginx
$ ./nginx -s stop
# 启动 nginx
$ ./nginx
```
![效果图](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
> nginx 会将请求分发到不同的服务器中,来达到服务器的压力均衡
>
>
### Nginx 负载均衡的几种策略 {#Nginx 负载均衡的几种策略}
> 随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题, 顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品, 很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎, `nginx`就是其中的一个,在 `linux`下有 `Nginx`、`LVS`、`Haproxy`等等服务可以提供负载均衡服 务,而且 `Nginx` 提供了几种分配方式(策略):
>
>
>
>
> * `轮询(默认)`
>
>
>
>
> > 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
> >
> >
>
>
>
>
> * `weight`
>
>
>
>
> >
> >
> > * weight 代表权, 重默认为 1, 权重越高被分配的客户端越多
> >
> >
> >
> >
> > * 指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:
>
> >
> >
> >
> >
>
>
> ```nginx
> upstream server_pool{
> server 192.168.5.21 weight=5; // weight 权重值 / 权重越高被分配的客户端越多
> server 192.168.5.22 weight=10;
> }
>
> ```
>
>
>
>
>
> * `ip_hash`
>
>
>
>
> > 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。 例如:
> >
> >
>
>
> ```nginx
> upstream server_pool{
> ip_hash;
> server 192.168.5.21;
> server 192.168.5.22;
> }
>
> ```
>
>
>
> > 通俗说就是,如果一个客户第一次访问的端口为 `8080`, 那么只要不更换 IP,未来只会访问`8080` 服务器
> >
> >
>
>
>
>
> * `fair(第三方)`
>
>
>
>
> > 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
> >
> >
>
>
> ```nginx
> upstream server_pool{
> server 192.168.5.21;
> server 192.168.5.22;
> fair # 设置根据响应时间来分配服务器
> }
>
> ```
>
>
Nginx 配置实例 - 动静分离 {#Nginx 配置实例 - 动静分离}
--------------------------------------
### 动静分离简介 {#动静分离简介}
>
>
> * 什么是动静分离?
>
>
>
>
> > Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:
> >
> >
> >
> >
> > * 第一种:是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
> >
> >
> > * 第二种:方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
> >
> >
> >
>
>
![动静分离](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
> 通过 `location`指定不同的后缀名实现不同的请求转发。通过 `expires`参数设置,可以使浏 览器缓存过期时间,减少与服务器之前的请求和流量。具体 `Expires`定义:是给一个资源 设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置`3d`,表示在这 3 天之内访问这个`URL`,发送一 个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码`304`, 如果有修改,则直接从服务器重新下载,返回状态码 `200`。
>
>
### 准备工作 {#准备工作 -3}
* Linux 系统中根目录创建 `data` 文件夹
```bash
# 进入根目录
$ cd /
# 创建 data 文件夹
$ mkdir data
# 进入 data 目录创建 image 目录存放静态文件,创建 www 文件夹存放 html 文件
$ mkdir www
$ mkdir image
======================在 www 目录下放入 a.html 文件========================
<h1>测试动静分离</h1>
======================在 image 目录下放入一张图片文件========================
```
### 配置`Nginx` {#配置 Nginx}
* 进入 `nginx` 配置目录,修改配置文件
```nginx
$ cd /usr/local/nginx/conf/
$ vim nginx.conf
# 配置 nginx 动静分离
=========================== 配置 nginx 动静分离 ==========================
server {
listen 80;
server_name 39.108.96.122;
<span class="token comment">#charset koi8-r;</span>
<span class="token comment">#access_log logs/host.access.log main;</span>
<span class="token directive"><span class="token keyword">location</span> /</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">root</span> html</span><span class="token punctuation">;</span>
<span class="token directive"><span class="token keyword">proxy_pass</span> http://myserver</span><span class="token punctuation">;</span>
<span class="token directive"><span class="token keyword">index</span> index.html index.htm</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment"># www</span>
<span class="token directive"><span class="token keyword">location</span> /www/</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">root</span> /data/</span><span class="token punctuation">;</span>
<span class="token directive"><span class="token keyword">index</span> index.html index.htm</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment"># image</span>
<span class="token directive"><span class="token keyword">location</span> /image</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">root</span> /data/</span><span class="token punctuation">;</span>
<span class="token directive"><span class="token keyword">autoindex</span> <span class="token boolean">on</span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
`================= 重启 nginx=====================
`# 关闭`
$ ./nginx -s stop
`# 启动`
$ ./nginx`
```
<br />
![image-20200613220126822](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
> 动静分离:
>
>
>
>
> * 通过 tomcat 访问动态资源
>
>
> * 通过 nginx 配置访问静态资源
>
>
>
### 最终测试 {#最终测试}
```http
http://39.108.96.122/image/logo.png # 访问 image 文件
http://39.108.96.122/www/a.html # 访问 html 文件
```
![测试效果](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
> `autoindex on;`可以列出文件目录
>
>
Nginx 配置高可用的集群 {#Nginx- 配置高可用的集群}
---------------------------------
### Nginx 宕机 {#Nginx 宕机}
> Nginx 可能会宕机导致无法用户无法访问到服务器资源
>
>
![问题](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
### 解决方案(高可用主从配置) {#解决方案 - 高可用主从配置}
![主从配置](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
> 如果主服务器 `nginx` 挂掉了, 那么需要保证系统依然可以正常运行, 这就是高可用, 需要配置 `keepalived` 在`主从服务器中进行判断 nginx 的状态, 如果正常运行就不切换`nginx`服务器, 如果宕机, 就切换` 备份 `nginx` 服务器, 并且对外提供一个不存在的 `虚拟 IP`
>
>
### 准备工作 {#准备工作 -4}
>
>
> * 需要安装两台 `Nginx` 服务器
>
>
> * 需要安装`keepalived`
>
>
> * 需要配置 `虚拟 IP`
>
>
>
>
> 高可用准备环境工作
>
>
>
>
> * 准备两台服务器 `192.168.121.131` 和`192.168.121.127`
>
>
> * 分别安装两台 nginx 服务器
>
>
> * 分别在两台 nginx 服务器中安装两个`keepalived`
>
>
>
```nginx
# 使用 yum 命令安装 keepalived
$ yum install keepalived -y
# 查看是否安装成功
$ rpm -q -a keepalived
# 进入 keepalived 安装目录
$ cd /etc/keepalived
# ll 查看 keepalived 配置文件并编辑
$ vim keepalived.conf
========================keepalived.conf 配置文件 ==========================
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
}
virtual_server 192.168.200.100 443 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.201.100 <span class="token number">443</span></span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">weight</span> <span class="token number">1</span>
SSL_GET</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
<span class="token punctuation">}</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
<span class="token punctuation">}</span>
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
}
virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server 192.168.200.200 <span class="token number">1358</span>
real_server 192.168.200.2 <span class="token number">1358</span></span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">weight</span> <span class="token number">1</span>
HTTP_GET</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
<span class="token punctuation">}</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
<span class="token punctuation">}</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
<span class="token punctuation">}</span>
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token directive"><span class="token keyword">real_server</span> 192.168.200.3 <span class="token number">1358</span></span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">weight</span> <span class="token number">1</span>
HTTP_GET</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
<span class="token punctuation">}</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
<span class="token punctuation">}</span>
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
}
virtual_server 10.10.10.3 1358 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.200.4 <span class="token number">1358</span></span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">weight</span> <span class="token number">1</span>
HTTP_GET</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
<span class="token punctuation">}</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
<span class="token punctuation">}</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
<span class="token punctuation">}</span>
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token directive"><span class="token keyword">real_server</span> 192.168.200.5 <span class="token number">1358</span></span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">weight</span> <span class="token number">1</span>
HTTP_GET</span> <span class="token punctuation">{</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
<span class="token punctuation">}</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
<span class="token punctuation">}</span>
<span class="token directive"><span class="token keyword">url</span></span> <span class="token punctuation">{</span>
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
<span class="token punctuation">}</span>
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
}
```
<br />
### 完成主从配置并测试 {#完成主从配置并测试}
* 查看 keepalived.conf, 修改为如下文件
```nginx
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 // 网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}
```
* 在 `/usr/local/src` 添加检测脚本
```nginx
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [$A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [`ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
```
* 启动 `nginx` 服务器和`keepalived`
```bash
# 启动 keepalived
$ systemctl start keepalivrd.service
# 关闭 keepalivrd
$ systemctl stop keepalivrd.service
# 查看进程是否已经启动
$ ps -ef | grep keepalivrd
```
* 测试
> 在浏览器地址栏输入配置的虚拟 IP 地址
>
>
> > 扩展:`ip a`...\>\>\>\>\> 查看 ip 地址信息的命令, 类似`ifconfig`
> >
> >
>
>
> 将 `主 nginx 服务器` 关闭, 测试 `从 nginx 服务器` 依然可以运行, 达到效果, 因为不想设置两台虚拟机, 太麻烦了, 用的阿里云远程服务器, 所有知道流程和怎么操做即可!!!
>
>
高可用配置文件详解 {#高可用配置文件详解}
----------------------
### keepalived 配置文件 {#keepalived 配置文件}
> 查看主机名称
>
>
> ```bash
> # 进入 Linux 的 hosts 文件中查看, 没有就自己配置一个
> 127.0.0.1 LVS_DEVEL
>
> ```
>
>
```nginx
# global_defs 全局配置
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL # 访问到的主机名称
}
# 脚本配置 vrrp_script chk_http_port
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2 # 权重, 如果当前脚本的条件成立, 权重就增加或减少相关参数
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 // 网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 时间间隔, 每隔多少时间检测一次(默认每隔一秒)
authentication { # 权限校验方式
auth_type PASS
auth_pass 1111 # 密码是 1111
}
# 虚拟 IP 配置
virtual_ipaddress {
# 表示虚拟 IP 是什么, 可以绑定多个虚拟 IP
192.168.17.50 // VRRP H 虚拟地址
}
}
```
### 脚本检测文件介绍 {#脚本检测文件介绍}
```nginx
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [$A -eq 0 ];then
# 脚本检测位置
/usr/local/nginx/sbin/nginx
# 检测间隔时间
sleep 2
# 判断服务器状态
if [`ps -C nginx --no-header |wc -l` -eq 0 ];then
# 如果 nginx 服务器宕机就杀掉全部进程
killall keepalived
fi
fi
```
Nginx 原理分析 {#Nginx 原理分析}
------------------------
### Master 工作方式 {#Master 工作方式}
![master 工作方式](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
### Worker 工作方式 {#Worker 工作方式}
![worker 工作方式](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
> 一个 `master` 和多个`woker` 有那些好处
>
>
> > 首先,对于每个 `worker` 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销, 同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,`master`进程则很快启动新的 `worker` 进程。当然,`worker`进程的异常退出,肯定是程序有 `bug` 了,异常退出,会导致当前 `worker` 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
> >
> >
>
>
>
>
> * 可以使用 `nginx --s reload` 热部署,利用 `nginx` 进行热部署操作
>
>
> * 每个 `woker` 是独立的进程,如果有其中的一个 `woker` 出现问题,其他 `woker` 独立的, 继续进行争抢,实现请求过程,不会造成服务中断
>
>
>
### 设置多少个 `woker` 合适 {#设置多少个 woker- 合适}
> worker 数和服务器的 cpu 数相等是最为适宜的
>
>
> > `Nginx`同 `redis` 类似都采用了 `i` 多路复用机制,每个 `worker` 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话 下。每个 `worker` 的线程可以把一个 `cpu` 的性能发挥到极致。所以 `worker` 数和服务器的 `cpu` 数相等是最为适宜的。设少了会浪费 `cpu`,设多了会造成`cpu` 频繁切换上下文带来的损耗。
> >
> >
>
>
### 连接数 worker_connection {#连接数 -worker-connection}
>
>
> * 第一个:发送请求,占用了 `woker` 的几个连接数? 答案:`2 或者 4 个`
>
>
>
>
> * 第二个:`nginx`有一个 `master`,有四个`woker`,每个`woker` 支持最大的连接数 1024,支持的最大并发数是多少?
>
>
>
> > 计算公式如下:
> >
> >
>
>
>
> * 普通的静态访问最大并发数是: `worker_connections * worker_processes /2`
>
>
> * 而如果是 `HTTP` 作为反向代理来说,最大并发数量应该是`worker_connections * worker_processes/4`。
>
>
>
>
>
>
> > 这个值是表示每个 `worker` 进程所能建立连接的最大值,所以,一个 `nginx` 能建立的最大连接数,应该是 `worker_connections * worker_processes`。当然,这里说的是最大连接数,对于`HTTP` 请求本地资源来说 ,能够支持的最大并发数量是 `worker_connections * worker_processes`,如果是支持`http1.1` 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: `worker_connections * worker_processes /2`,而如果是 `HTTP` 作为反向代理来说,最大并发数量应该是`worker_connections * worker_processes/4`。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
> >
> >
>
>
卸载 Nginx {#卸载 Nginx}
--------------------
* 首先输入命令 ps -ef | grep nginx 检查一下 nginx 服务是否在运行。
```bash
$ ps -ef | grep nginx
```
* 停止 Nginx 服务
```bash
$ /usr/sbin/nginx -s stop
$ netstat -lntp
```
* 查找
```bash
# 查看 Nginx 相关文件:whereis nginx
$ whereis nginx
```
* find 查找相关文件
```bash
# 查找相关文件
$ find / -name nginx
# 依次删除 find 查找到的所有目录
$ rm -rf /usr/local/nginx
```
* 使用 yum 清理
```bash
$ yum remove nginx
```
> nginx 卸载完成
>
>
恢复 nginx.conf 为默认的配置环境 {#恢复 nginx-conf 为默认的配置环境}
------------------------------------------------
> nginx.conf 是 Nginx 默认的配置文件,如果把这个文件误删了或是不注意损坏了再或者是想直接用 nginx 的原始配置文件重新进行环境的配置,其时 nginx 在默认配置目录下面存在一个原始的 nginx.conf 备份文件,名字:nginx.conf.default,我们可以复制这个文件并重命名为 nginx.conf,如果这个文件让你误删掉了,那也可以复制下面的内容来新建立个 nginx.conf,最后重启 nginx 生效;
>
>
Windows 环境下配置 Nginx 服务器 {#Windows 环境下配置 Nginx 服务器}
--------------------------------------------------
* Nginx 下载
> 官网地址:http://nginx.org/en/download.html
>
>
* 解压缩以后配置环境变量
![系统变量](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
* `PATH` 引入 `NGINX_HOME`
![path](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
* 启动 Nginx
> 进入 `nginx` 解压目录,地址栏输入 `CMD` 键入以下命令
>
>
>
>
> * 如果开启了 Windows 防火墙,记得允许访问网络。
>
>
> * 如果启动失败,可能是 IIS 占用了 80 端口。去掉 IIS 监听的 80 端口即可。
>
>
>
```bash
# 启动 Nginx
start nginx
```
* 任务管理器查看是否有 `nginx` 进程
![](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
* 打开浏览器,输入`localhost:80`
![](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
> 安装成功
>
>
* Nginx 常用命令说明
| 命令 | 说明 |
|-----------------|----------------------------|
| nginx -h | 查看帮助信息 |
| nginx -v | 查看 Nginx 版本 |
| nginx -s stop | 停用 Nginx |
| nginx -s quit | 优雅的停用 Nginx(处理完正在进行中请求后停用) |
| nginx -s reload | 重新加载配置,并优雅的重启进程 |
| nginx -s reopen | 重启日志文件 |
将 Windows 版本 Nginx 添加到服务 {#将 Windows 版本 Nginx 添加到服务}
----------------------------------------------------
* 查看 Winsw 笔记, 以下是 Winsw 配置
> 把下载的 `winsw` 文件放在 `Nginx` 安装目录 `(C:\Program Files\Nginx)`,并修改名称为`NginxService.exe`,然后修改`NginxService.xml` 文件, 把这两个文件放在 Nginx 安装目录下。
>
>
* `NginxService.xml`内容如下(根据实际情况对路径进行调整):
```markup
<service>
<!-- 安装成 windows 服务后的服务名 -->
<id>nginx</id>
<!-- 显示的服务名称 -->
<name>nginx</name>
<!-- 对服务的描述 -->
<description>Welcome to NGINX Wiki! | NGINX</description>
<!-- 日志 -->
<logpath>C:\userapp\nginx-1.19.5\logs\</logpath>
<logmode>roll</logmode>
<depend></depend>
<!-- 可执行程序。这里写 Nginx 的路径(如果配置了环境变量,直接写"nginx 就行了")-->
<executable>C:\userapp\nginx-1.19.5\nginx.exe</executable>
<!-- 参数 -->
<stopexecutable>C:\userapp\nginx-1.19.5\nginx.exe -s stop</stopexecutable>
</service>
```
* 当前目录下已管理员身份运行命令行,添加到服务中,并启动服务
![服务](http://static.51tbox.com/static/2025-01-10/col/072a0e8aa66ecb7ae39f1d5c9615b0e1/9a6249682d6a45f3bfba1ee48740b75d.gif.jpg)
* 常用指令
```bash
# 安装 nginx 服务
$ NginxService.exe install
# 删除 nginx 服务
$ sc delete 服务名
# 启动 Nginx 服务
$ net start nginx
# 停止服务
$ net stop nginx
```