前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >☀️全网唯一万字长文讲解Nginx安装运营维护☀️《❤️记得收藏❤️》

☀️全网唯一万字长文讲解Nginx安装运营维护☀️《❤️记得收藏❤️》

原创
作者头像
苏州程序大白
修改2021-08-17 18:08:06
6150
修改2021-08-17 18:08:06
举报
代码语言:javascript
复制
@[TOC](☀️全网唯万字长文讲解Nginx安装运营维护☀️《❤️记得❤️收藏》)
#目录
# <table><tr><td bgcolor=#29b6f6>😊开讲啦!!!!🏳️‍🌈</td></tr></table>

![插入插入图片描述](https://img-blog.csdnimg.cn/1cc3ea6947a448b1b4c704be8743b7b9.gif#pic_center)

##🏳️‍🌈1、前言


![在这里插入图片描述(https://img-blog.csdnimg.cn/a59f95d73ca044128184fe452d3eacd4.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjkzMTg3Nw==,size_16,color_FFFFFF,t_70#pic_center )
**Nginx** 是假的性能设计设计的 HTTP 服务器,能够代理 HTTP,HTTPS 和邮件相关(SMTP,POP3,IMAP)的协议链接。并且提供了下载均衡以及 HTTP 缓存。它的设计充分利用异步事件模型,减少了后续的影响,提高了服务器的能力。

关于**Nginx**,有这些标签:「异步」「事件」「闪耀」「炫耀」「所以并发」「教会代理」「负载均衡」

Linux系统:`Centos 7 x64` Nginx 版本:`1.11.5`     


## 🚣2、安装
### 🗾2.1、安装依赖

<font color=#2962ff size=5 face= "楷体">prce(支持支持)和openssl(https支持,如果不需要https可以不安装。)</font>

```bash
yum install -y pcre-devel 

yum -y install gcc make gcc-c++ wget

yum -y install openssl openssl-devel
``
<font color=#2962ff size=5 face= "楷体"> CentOS 6.5 我安装的时候是选择基本服务器,默认这两个包没有安装,所以这两个都运行全更新。</font >

###🏔️2.2、下载
[下载地址1](http://nginx.org/en/download.html)

[下载地址2](http://nginx.org/download/)

<font color=#f44336 size=5 face= "楷体"> (注意:下载用稳定版本。) </font>

```bash
wget http://nginx.org/download/nginx-1.13.3.tar.gz
wget http://nginx.org/download/nginx-1.13.7.ta​​r.gz

# 如果没有安装wget
#已下载已编译版本
$ yum 安装 wget

#解压压缩包
焦油 zxf nginx-1.13.3.tar.gz
``
### ⛰️2.3、编程安装

<font color=#2962ff size=5 face= "楷体">进入目录编译安装,配置参数说明</font>


```bash
cd nginx-1.11.5
。/配置

....
配置摘要
  + 使用系统 PCRE 库
  + 未使用 OpenSSL 库
  + 使用系统 zlib 库

  nginx 路径前缀:“/usr/local/nginx”
  nginx 二进制文件:“/usr/local/nginx/sbin/nginx”
  nginx 模块路径:“/usr/local/nginx/modules”
  nginx 配置前缀:“/usr/local/nginx/conf”
  nginx配置文件:“/usr/local/nginx/conf/nginx.conf”
  nginx pid 文件:“/usr/local/nginx/logs/nginx.pid”
  nginx 错误日志文件:“/usr/local/nginx/logs/error.log”
  nginx http访问日志文件:“/usr/local/nginx/logs/access.log”
  nginx http 客户端请求正文临时文件:“client_body_temp”
  nginx http 代理临时文件:“proxy_temp”
  nginx http fastcgi 临时文件:“fastcgi_temp”
  nginx http uwsgi 临时文件:“uwsgi_temp”
  nginx http scgi 临时文件:“scgi_temp”
``
安装报错误的话比如:**C compiler cc is not found**,这个就是安装编译环境,安装一下就可以了`yum -y install gcc make gcc-c++ openssl-devel`

<font color=#2962ff size=5 face= "楷体">如果没有错误信息,就可以执行下边的安装了:</font>
```bash
制作
进行安装
``
### 🌋2.4、nginx 测试
<font color=#2962ff size=5 face= "楷体"> 运行下面的命令会出现两个结果,一般情况nginx会安装在`/usr/local/nginx`目录中:</font>

```bash
cd /usr/local/nginx/sbin/
./nginx -t

# nginx:配置文件/usr/local/nginx/conf/nginx.conf 语法没问题
# nginx:配置文件/usr/local/nginx/conf/nginx.conf 测试成功
``
### 🗻2.5、设置网络 nginx 命令

```bash
vi ~/.bash_profile
``

<font color=#2962ff size=5 face= "楷体">将下面的内容添加到`~/.bash_profile`文件中</font>

```bash
PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin/
导出路径
``

<font color=#2962ff size=5 face= "楷体"> 运行命令`source ~/.bash_profile`让配置立即生效。你就可以运行`nginx`命令了。</font>

## 🏕️3、Mac 安装
<font color=#2962ff size=5 face= "楷体"> Mac OSX 安装特别简单,首先你需要安装`Brew,`通过`brew`快速安装`nginx`。</font>

### 🏖️3.1、安装nginx
```csharp
酿造安装nginx
# 正在更新 Homebrew...
# ==> 自动更新 Homebrew!
# 更新了 2 个水龙头(自制/核心,自制/木桶)。
# ==> 更新公式
# ==> 为 nginx 安装依赖:openssl, pcre
# ==> 安装 nginx 依赖:openssl
# ==> 下载 https://homebrew.bintray.com/bottles/openssl-1.0.2o_1.high_sierra.bottle.tar.gz
############################################### ####################### 100.0%
# ==> 倒入 openssl-1.0.2o_1.high_sierra.bottle.tar.gz
# ==> 注意事项
# 使用来自 SystemRoots 的证书引导 CA 文件
# 钥匙链。添加其他证书(例如添加的证书
# 系统钥匙串),将 .pem 文件放入
# /usr/local/etc/openssl/certs
# 
# 并运行
# /usr/local/opt/openssl/bin/c_rehash
# 
# 这个公式是 keg-only,这意味着它没有符号链接到 /usr/local,
# 因为 Apple 已弃用 OpenSSL,转而使用自己的 TLS 和加密库。
# 
# 如果您需要首先在 PATH 中安装此软件,请运行:
# echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc
# 
# 为了让编译器找到这个软件,你可能需要设置:
# LDFLAGS: -L/usr/local/opt/openssl/lib
# CPPFLAGS: -I/usr/local/opt/openssl/include
# 为了让 pkg-config 找到这个软件,你可能需要设置:
# PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig
# 
# ==> 总结
# /usr/local/Cellar/openssl/1.0.2o_1: 1,791 个文件,12.3MB
# ==> 安装 nginx 依赖:pcre
# ==> 下载 https://homebrew.bintray.com/bottles/pcre-8.42.high_sierra.bottle.tar.gz
############################################### ####################### 100.0%
# ==> 浇注 pcre-8.42.high_sierra.bottle.tar.gz
# /usr/local/Cellar/pcre/8.42: 204 个文件,5.3MB
# ==> 安装 nginx
# ==> 下载 https://homebrew.bintray.com/bottles/nginx-1.13.12.high_sierra.bottle.tar.gz
############################################### ####################### 100.0%
# ==> 倒入 nginx-1.13.12.high_sierra.bottle.tar.gz
# ==> 注意事项
# Docroot 是:/usr/local/var/www
# 
# /usr/local/etc/nginx/nginx.conf 中的默认端口已设置为 8080 以便
# nginx 可以在没有 sudo 的情况下运行。
# 
# nginx 将加载 /usr/local/etc/nginx/servers/ 中的所有文件。
# 
# 现在启动 nginx 并在登录时重新启动:
# brew 服务启动 nginx
# 或者,如果你没有 wacd /usr/local/Cellar/nginx/1.13.12/n 就运行:
# cd /usr/local/Cellar/nginx/1.13.12/
``

### 🏜️3.2、启动服务

<font color=#f44336 size=5 face= "楷体">注意默认端口不是808 查看确认端口是否被占用。 </font>

```bash
brew 服务启动 nginx
# http://localhost:8080/
``

###🏝️3.3、开机自启动

<font color=#2962ff size=5 face="楷体">启动自启动方法一:</font>

编辑`vi /lib/systemd/system/nginx.service`文件,没有创建一个`touch nginx.service`然后将内容根据具体情况进行修改后,添加到nginx.service文件中:

```csharp
[单元]
说明=nginx
After=network.target remote-fs.target nss-lookup.target

[服务]

类型=分叉
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s 退出 $MAINPID
PrivateTmp=真

[安装]
WantedBy=multi-user.target
``

- `[Unit]`:服务的说明
- `描述`:描述服务
- `After`:描述服务类别
- `[Service]`:服务运行参数的设置
- `Type=forking`:是后台运行的形式
- `ExecStart`:为服务的具体运行命令
- `ExecReload`:为重启命令
- `ExecStop`:为停止命令
- `PrivateTmp=True`:表示给服务分配独立的临时空间

注意:`[服务]`的启动、重启、停止命令全部要求使用绝对路径。`[安装]`设置运行级别下服务安装的相关,可设置为多用户,即系统运行级别为`3`。退出。

<font color=#2962ff size=5 face= "楷体">设置启动启动,使配置生效:</font>

```bash
# 启动nginx服务
systemctl 启动 nginx.service
# 停止启动自启动
systemctl 禁用 nginx.service
# 查看服务当前状态
systemctl 状态 nginx.service
# 查看所有已启动的服务
systemctl list-units --type=service
#重新启动服务
systemctl 重启 nginx.service
# 设置启动自启动
systemctl 启用 nginx.service
#输出下面的内容表示成功了
创建从 /etc/systemd/system/multi-user.target.wants/nginx.service 到 /usr/lib/systemd/system/nginx.service 的符号链接。
systemctl is-enabled servicename.service #查询服务是否启动启动
systemctl enable *.service # 启动运行服务
systemctl *.service # 取消启动运行
systemctl start *.service # 启动服务
systemctl stop *.service # 停止服务
systemctl restart *.service # 重启服务
systemctl reload *.service # 重加载服务配置文件
systemctl status *.service # 查询服务运行状态
systemctl --failed #显示启动失败的服务
``
<font color=#f44336 size=5 face= "楷体"> 注:* 代表某个服务的名字,如 http 的服务名称 httpd</font>

<font color=#2962ff size=5 face="楷体">启动自启动方法二: </font>

```bash
vi /etc/rc.local

# 在rc.local文件中,添加下面的命令
/usr/local/nginx/sbin/nginx 启动
``
如果启动后发现自启动脚本没有执行,你要确认 rc.local 这个文件的访问权限是否是可执行的,因为 rc.local 默认是不可执行的。修改 rc.local 访问权限,增加执行权限:

```bash
# /etc/rc.local是/etc/rc.d/rc.local的软连接,
chmod +x /etc/rc.d/rc.local
``
官方脚本【ed Hat NGINX Init Script】(https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/)。

## 🏞️4、运维

### 🏟️4.1、服务管理

```bash
# 启动
/usr/local/nginx/sbin/nginx

#重启
/usr/local/nginx/sbin/nginx -s reload

# 关闭进程
/usr/local/nginx/sbin/nginx -s 停止

#关闭nginx
/usr/local/nginx/sbin/nginx -s 退出

# 查看nginx的安装状态,
/usr/local/nginx/sbin/nginx -V
``
<font color=#2962ff size=5 face="楷体">关闭防火墙,或者防火墙规则就可以测试了</font>

```bash
服务 iptables 停止
``
<font color=#2962ff size=5 face= "楷体"> 或者编辑配置文件: </font>

```bash
vi /etc/sysconfig/iptables
``
<font color=#2962ff size=5 face= "楷体"> 添加这样一条开放80端口的规则后保存: </font>

```bash
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
``
<font color=#2962ff size=5 face= "楷体">重启服务凝胶: </font>

```bash
服务 iptables 重启
#希望进行当前状态
iptables -t nat -L
``
<font color=#2962ff size=5 face="楷体">重启服务防火墙报错解决</font>

```bash
服务 iptables 重启
# 重定向到 /bin/systemctl restart iptables.service
# 无法重新启动 iptables.service: Unit iptables.service failed to load: No such file or directory。
``
<font color=#2962ff size=5 face= "楷体">在 CentOS 7 或 RHEL 7 或 Fedora 中防火墙由 firewalld 来管理,当然你可以还原传统的管理方式。或则采用新的命令进行管理。传统请执行一下命令: </font>

```bash
#传统命令
systemctl 停止 firewalld
systemctl 掩码 firewalld
# 安装命令
yum 安装 iptables-services

systemctl 启用 iptables 
服务 iptables 重启
``

### 🏛️4.1、nginx卸

<font color=#2962ff size=5 face= "楷体"> 如果通过 yum 安装,使用下面的命令安装。 </font>

```bash
yum 删除 nginx
``
<font color=#2962ff size=5 face= "楷体"> 编译安装,删除`/usr/local/nginx` 目录微生物如果配置了自启动脚本,也需要删除。 </font>

### 🏗️4.2、参数说明

|参数 | 说明 |
|--|--|
| –prefix=`<路径>` | Nginx 安装路径。如果没有指定,默认为`/usr/local/nginx`。 |
| –sbin-path=`<path>` |Nginx 可执行文件安装路径。只能安装时指定,如果没有指定,默认为`<prefix>/sbin/nginx`。|
| –conf-path=`<path>` |在没有给定 -c 选项下默认的`nginx.con`f 的路径。如果没有指定,默认为`<prefix>/conf/nginx.conf`。|
| –pid-path=`<path>` |在nginx.conf中没有指定pid语句的情况下,默认的nginx.pid的路径。如果没有指定,默认为<prefix>/logs/nginx.pid。|
| –lock-path=`<path>` |nginx.lock 文件的路径。|
| –error-log-path=`<path>` |在nginx.conf中没有指定error_log指令的情况下,默认的错误日志的路径。如果没有指定,默认为`<prefix>/- logs/error.log `。|
| –http-log-path=`<path>` |在nginx.conf中没有指定access_log指令的情况下,默认的访问日志的路径。如果没有指定,默认为`<prefix>/- logs/access.log `。|
| –user=`<user>` |在 nginx.conf 中没有指定用户指令的情况下,默认的 nginx 使用的用户。如果没有指定,默认为 `nobody`。|
| –group=`<group>` |在`nginx.conf`中没有指定用户指令的情况下,默认的nginx使用的组。如果没有指定,默认为`nobody`。|
| –builddir=DIR |指定编译的目录|
| –with-rtsig_module | 允许`rtsig`模块|
| --with-select_module --without-select_module | 允许或不开启`开启SELECT模式`,如果`configure没有`有找到更合适的模式,例如:kqueue(sun os),epoll (linux kenel 2.6+), rtsig(-实时信号)或者/dev/poll(一种类似选择的模式,应用与SELECT基本相同,同样采用轮训方法)`SELECT模式`将是`默认安装模式`|
| --with-poll_module --without-poll_module |是否开启poll模块。如果配置没有发现更合适的方法,例如 kqueue、epoll、rtsig 或 /dev/poll,则默认启用此模块。|
| –with-http_ssl_module |启用 ngx_http_ssl_module。启用 SSL 支持和处理 HTTPS 请求的能力。需要 OpenSSL。在 Debian 上,这是 libssl-dev。开启HTTP SSL模块,使NGINX可以`支持HTTPS请求`。这个模块需要已经`安装了OPENSSL`,在DEBIAN上是`libss`l|
| –with-http_realip_module | 启用 ngx_http_realip_module|
| –with-http_addition_module | 启用 ngx_http_addition_module|
| –with-http_sub_module | 启用 ngx_http_sub_module|
| –with-http_dav_module | 启用 ngx_http_dav_module|
| –with-http_flv_module | 启用 ngx_http_flv_module|
| –with-http_stub_status_module | 启用“服务器状态” 页|
| –without-http_charset_module | 禁止ngx_http_charset_module|
| –without-http_gzip_module | 禁止ngx_http_gzip_module。如果可以,需要 zlib 。|
| –without-http_ssi_module | 禁止ngx_http_ssi_module|
| –without-http_userid_module | 禁止ngx_http_userid_module|
| –without-http_access_module | 禁止ngx_http_access_module|
| –without-http_auth_basic_module | 禁止ngx_http_auth_basic_module|
| –without-http_autoindex_module| 禁止ngx_http_autoindex_module|
| –without-http_geo_module | 禁止ngx_http_geo_module|
| –without-http_map_module | 禁止ngx_http_map_module|
| –without-http_referer_module | 禁止ngx_http_referer_module|
| –without-http_rewrite_module | 禁止ngx_http_rewrite_module。| 如果可能需要 PCRE 。
| –without-http_proxy_module| 禁止ngx_http_proxy_module|
| –without-httpfastcgi_module | 禁止_ngx_http_fastcgi_module|
| –without-http_memcached_module | 禁止ngx_http_mcached_module|
| –without-httplimit_zone_module | 禁止_ngx_http_limit_zone_module|
| –without-http_empty_gif_module | 禁止ngx_http_empty_gif_module|
| –without-http_browser_module | 禁止ngx_http_browser_module|
| –without-http_upstream_ip_hash_module | 禁止ngx_http_upstream_ip_hash_module|
| –with-http_perl_module | 启用 ngx_http_perl_module|
| --with-perl_modules_path=PATH | 指定perl模块的路径|
| --with-perl=PATH | 指定 perl 执行文件的路径|
| --http-log-path=PATH |设置http访问日志的路径|
| –http-client-body-temp-path=PATH | 设置http客户端请求正文临时文件的路径|
| –http-proxy-temp-path=PATH | 设置http代理临时文件的路径|
| –http-fastcgi-temp-path=PATH | 设置 http fastcgi 临时文件的路径|
| --没有-http | 使用HTTP服务器|
| –with-mail | 启用IMAP4/POP3/SMTP代理模块|
| –with-mail_ssl_module | 允许 ngx_mail_ssl_module|
| –with-cc=PATH | 指定 C 编译器的路径|
| –with-cpp=PATH | 指定C控制器的路径|
| –with-cc-opt=OPTIONS | 将添加到变量 CFLAGS 的附加参数。在FreeBSD中使用系统库PCRE,需要注明--with-cc-opt="-I /usr/local/include"。如果我们使用 select() 并且需要增加文件描述符的数量,那么这里也可以赋值:--with-cc-opt=”-D FD_SETSIZE=2048”。|
| –with-ld-opt=选项| 传递给链接器的附加参数。随着-FreeBSD中系统库PCRE的使用,需要注明--with-ld-opt="-L /usr/local/lib"。|
| –with-cpu-opt=CPU | 为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64|
| – 没有-pcre| 禁止PCRE库的使用。同时也禁止HTTP重写模块。在“location”配置语句中的正则表达式也需要PCRE。|
| –with-pcre=DIR | 指定PCRE库的源代码的路径。|
| –with-pcre-opt=选项| 为 PCRE 构建设置其他选项。|
| –with-md5=DIR | 设置 md5 库源的路径。|
| –with-md5-opt=OPTIONS | 为 md5 构建设置其他选项。|
| –with-md5-asm | 使用 md5 汇编程序源。|
| –with-sha1=DIR | 设置 sha1 库源的路径。|
| –with-sha1-opt=OPTIONS | 为 sha1 构建设置其他选项。|
| –with-sha1-asm | 使用 sha1 汇编程序源。|
| –with-zlib=DIR| 设置 zlib 库源的路径。|
| –with-zlib-opt=选项| 为 zlib 构建设置其他选项。|
| –with-zlib-asm=CPU | 使用针对指定 CPU 优化的 zlib 汇编程序源,有效值为:pentium、pentiumpro|
| –with-openssl=DIR | 设置 OpenSSL 库源的路径|
| –with-openssl-opt=OPTIONS | 为 OpenSSL 构建设置附加选项|
| --with-debug | 启用调试日志|
| --add-module=PATH | 添加在目录 PATH 中找到的第三方模块

![](https://img-blog.csdnimg.cn/bc87c5db457d4ab69c112e405b4c14c0.gif#pic_center)
<font color=#2962ff=5 face=“楷体”> **不管穿什么,气质不可以输**</font>

## 🏘️5、配置

在Centos默认配置文件在`/usr/local/nginx-1.5.1/conf/nginx.conf`我们要给配置一些主配置文件。nginx.conf是一些文件,由若干个部分组成,文件大参数{}表示一个部分。每一行都是由分号结束,劝勉的结束。

### 🏚️5.1、常用正则
|`正则`|说明|`正则`| 说明 |
|--|--|--|--|
|`.` |匹配除换行符以外的任意一个字符|| `$` |匹配字符串的结束|
|`?` |重复0次或1次| `{n}` |重复n次|
|`+` |重复1次多次|`{n,`| 重复n次多次|
|`*`| 重复0次多次| `[c]` | 匹配单个字符c|
|`\d` |匹配数字|`[az]`|匹配az小写字母的任意一个|
|`^`| 匹配字符串的开始|– |–|

### 🏠5.2、全局变量
| 变量|说明 | 变量 | 说明 |
|--|--|--|--|
|$args |这个变量同一个请求行中的参数,$query_string |$remote_port| 客户端的端口。|
|$content_length| |$remote_user| 请求头中的Content-length字段。已经经过Auth Basic Module验证的用户名。|
|$content_type| |$request_filename |当前请求的文件路径,由root或alias指令与URI请求生成。|
|$document_root |当前请求在root指令中指定的值。 |$scheme |TTP方法(如http,https)。|
|$host |请求主机头字段,否则为服务器名称。 |$server_protocol |请求使用的协议,通常是HTTP/1.0或HTTP/1.1。|
|$http_user_agent |客户端代理信息 |$server_addr |服务器地址,在完成一次系统调用后可以确定这个值。
|$http_cookie |客户端cookie信息|$server_name |服务器名称。
|$limit_rate| 这个变量可以限制连接速率。$server_port |请求到达服务器的端口号。
|$request_method |客户端请求的动作,通常为GET或POST。 |$request_uri |包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz。|
|$remote_addr 客户端的IP地址。 |$uri |不带请求参数的当前URI,|$uri|不包含主机名,如/foo/bar.html。
|$document_uri |与$uri相同。| –| –|

例如请求:`http://localhost:3000/test1/test2/test.php`

- `$host`:本地主机

- `$server_port`:3000

- `$request_uri`:/test1/test2/test.php

- `$document_uri`:/test1/test2/test.php

- `$document_root`:/var/www/html

- `$request_filename`:/var/www/html/test1/test2/test.php

### 🏡5.3、符号参考
|符号 | 说明 |符号 |说明 |符号 | 说明 |  
|--|--|--|--|--|--|
|`k,K` |千字节| `m,M` |兆字节|`ms` |毫秒|
|`s` |秒 |`m`| 分钟|`h` |小时|
|`d` |日| `w`|周| `M` |天气,30天|

例如,“8k”、“1m”代表字节数计量。

例如,“1h 30m”,“1y 6M”。代表“1小时30分”,“1年零6个月”。

### 🏢5.4、配置文件
nginx 的配置系统由一个主配置文件和其他一些辅助的配置文件构成。这些配置文件都是纯文本文件,全部位于 nginx 安装目录下的配置目录下。

指令由nginx的各个模块提供,不同的模块还会提供不同的指令来实现配置。

nginx.conf 的配置信息,根据其逻辑上的含义,对它们进行了分类,也可以有多个作用域,或者配置配置上下文。不同的域中包含一个配置。


<font color=#2962ff size=5 face= "楷体">下面的这些上下文语句是用的比较多: </font>

|指令 | 说明|包含指令|
|--|--|--|		
|主要 |nginx 在运行时与具体业务功能(例如 http 服务或电子邮件服务代理)提供的一些参数,例如工作进程数,运行的身份等。用户、worker_processes、error_log、事件、http、邮件|
|-| 以前的工作进程数,运行的身份等。-|
|http| 与提供http服务相关的一些配置参数。例如:是否使用keepalive啊,是否使用gzip进行压缩等。| 服务器 |
|服务器|http 服务上支持多个虚拟主机。每个虚拟主机一个对应的服务器配置,配置项包括虚拟主机相关的配置。在提供邮件服务的代理时,也可以建立多个服务器。每个服务器通过监听的地址来区间。|listen, server_name, access_log, location, protocol, proxy, smtp_auth, xclient|
|位置 |http 服务中,某些特定的 URL 对应的配置项。索引,根|
|mail |实现email相关的SMTP/IMAP/POP3代理时,共享的一些配置项(因为可能实现多个代理,工作在一些监听地址上)。
|包括|为了增强配置文件的独特性,赋予部分配置文件可以重新使用。-|
|valid_referers |使用验证Http请求头Referer是否有效。|-|
|try_files |用在服务器部分,不过最常见的还是用在位置部分,它会按照给定的参数顺序进行尝试,第一个被匹配到的将被使用。
|如果|如果|当在地点块中使用如果愿意,在某些情况下它不按照预期运行,一般说如果愿意就避免使用。|-|

**例如再`nginx.conf`里面引用两个配置`vhost/example.com.conf和vhost/gitlab.com.conf`我们都被一个我自己新建的目录vhost下面。如下:**

```bash
worker_processes 1;
事件{
    worker_connections 1024;
}

http {
    包括 mime.types;
    default_type 应用程序/八位字节流;

    #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    # '$status $body_bytes_sent "$http_referer" '
    # '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log 日志/access.log 主;

    发送文件;
    #tcp_nopush on;

    #keepalive_timeout 0;
    keepalive_timeout 65;

    #gzip 上;
    服务器 {
        听80;
        server_name 本地主机;
        地点 / {
            根html;
            index index.html index.htm;
        }
        error_page 500 502 503 504 /50x.html;
        位置 = /50x.html {
            根html;
        }
    }
    包括 vhost/example.com.conf;
    包括 vhost/gitlab.com.conf;
}
``
<font color=#2962ff size=5 face="楷体">简单的配置:example.com.conf </font>

```csharp
服务器 {
    #侦听的80端口
    听80;
    server_name baidu.com app.baidu.com; #这里指定的域名
    index index.html index.htm; #这里指定默认入口页面
    root /home/www/app.baidu.com; #这里指定目录
}
``

### 🏣5.5、预先定义好变量

Nginx提供了许多预定义的变量,也可以通过使用set来设置变量。你可以在如果中使用预定义变量,也可以将它们传递给代理服务器。见](http://nginx.org/en/docs/varindex.html)

|变量名称| 值 |
|--|--|
|`$args_name`|在请求中的名字参数|
|`$args`| 所有请求参数|
|`$query_string` |$args 的别名|
|`$content_length` |请求头Content-Length的值|
|`$content_type` |请求头Content-Type的值|
|`$host`| 如果当前有Host,则为请求头Host的值;如果没有这个头,那么该值就等于匹配该请求的server_name的值|
|`$remote_addr` |客户端的IP地址|
|`$request` |完整的请求,从客户端收到,包括Http请求方法、URI、Http协议、头、请求体|
|`$request_uri` |完整请求的URI,从客户端来的请求,包括参数|
|`$scheme` |当前请求的协议|
|`$uri`| 当前请求的URI|

### 🏤5.6、好莱坞代理
<font color=#2962ff size=5 face= "体">服务器代理是一个Web服务器,它接受客户端的连接请求,然后将请求转发给服务器,然后从服务器结果得到返回给连接的客户下面。下面简单的例子: </font>

```bash
服务器 {  
  听80;                                                        
  server_name 本地主机;                                              
  client_max_body_size 1024M; # 允许客户端请求的最大单文件字节数

  地点 / {
    proxy_pass http://localhost:8080;
    proxy_set_header 主机 $host:$server_port;
    proxy_set_header X-Forwarded-For $remote_addr; # HTTP的请求端真实的IP
    proxy_set_header X-Forwarded-Proto $scheme; #为了正确地识别用户发出的协议是http还是https
  }
}
``
<font color=#2962ff size=5 face="楷体">复杂的配置:gitlab.com.conf。 </font>

```bash
服务器 {
    #侦听的80端口
    听80;
    server_name git.example.cn;
    地点 / {
        proxy_pass http://localhost:3000;
        #以下是一些国外代理的配置可删除
        proxy_redirect 关闭;
        #提供的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header 主机 $host;
        client_max_body_size 10m; #允许客户端请求的最大单文件字节数
        client_body_buffer_size 128k;##代理缓冲用户端请求的最大字节数
        proxy_connect_timeout 300; #nginx跟服务器超时时间(代理超时)
        proxy_send_timeout 300; #假设服务器数据回传时间(代理发送超时)
        proxy_read_timeout 300; #连接成功后,还有服务器响应时间(超时接收)
        proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的大小
        proxy_buffers 4 32k;#proxy_buffers膨胀,网页平均在32k以下的话,这样设置
        proxy_busy_buffers_size 64k;#高负载下缓冲大小(proxy_buffers*2)
    }
}
``
<font color=#2962ff size=5 face=“楷体”> 代理到代理服务器的配置中,最重要的是proxy_pass指令。以下是代理模块中的一些常用指令: </font>
|指令|说明 |
|--|--|
|`proxy_timeout` |Nginx`接受连接到连接服务器的等待请求至等待时间|
|`proxy_send_timeout` | 超时服务回传时间(代理发送超时)|
|`proxy_read_timeout` |连接成功后,延时服务时间(代理接收超时)|
|`proxy_cookie_domain` |备选从属性服务器来的`Set-Cookie`头的域|
|`proxy_cookie_path`|备选从服务器来的`Set-Cookie头的路径属性`|
|`proxy_buffer_size`| 设置代理服务器(nginx)保存用户头信息的大小|
|`代理缓冲区`| `proxy_buffers`,网页平均在多少k以下|
|`proxy_set_header`| 伪装发送到外部服务器头的内容,也可以通过将某些虚空的值设置为空字符串,而不是发送某个伪装的方法实现|
|`proxy_ignore_header`s| 禁止处理来自代理服务器的这一事件。
|`proxy_intercept_errors`| 使nginx阻止HTTP故障代码为400`或者提高了```

### 🏥6、负载均衡
<font color=2962ff size=5 face=“楷体”> 上游意图可以实现一个新的配置配置,在该配置定义的一组服务器服务。这些服务器被不同的权重,可能也可能用于服务器进行维护,标记为down。
 </字体>
```bash
上游 gitlab 
{
ip_hash;
    #上游的负载均衡,权重是权重,可以根据机器配置权重表示。权重参数权值,权值定义被分配到的珍珠重量。
    服务器 192.168.122.11:8081 ;
    服务器 127.0.0.1:82 权重 = 3;
    服务器 127.0.0.1:83 weight=3 down;
    服务器 127.0.0.1:84 权重 = 3;max_fails=3 fail_timeout=20s;
    服务器 127.0.0.1:85 权重 = 4;;
    保活32;
}
服务器 
{
    #侦听的80端口
    听80;
    server_name git.example.cn;
    地点 / 
    
        proxy_pass http://gitlab; #在这里设置一个代理,和上游的名字一样
        #以下是一些国外代理的配置可删除
        proxy_redirect 关闭;
        #提供的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header 主机 $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 10m; #允许客户端请求的最大单文件字节数
        client_body_buffer_size 128k;##代理缓冲用户端请求的最大字节数
        proxy_connect_timeout 300; #nginx跟服务器超时时间(代理超时)
        proxy_send_timeout 300; #假设服务器数据回传时间(代理发送超时)
        proxy_read_timeout 300; #连接成功后,还有服务器响应时间(超时接收)
        proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的大小
        proxy_buffers 32k;#4,网页平均在32k以下的话,这样设置
        proxy_busy_buffers_size 64k;#高负载下缓冲大小(proxy_buffers*2)
        proxy_temp_file_write_size 64k;#设置文件夹大小,大于这个值,就可以上传服务器传了
    }
}
``
<font=#2962ff size=5 face=“楷体”>请求时间顺序逐一一散发到另一篇的重逢,一旦点击还原,能自动剔除</font>。

**负载均衡:**

模块能够使用3种负载均衡算法:轮询、IP上游、最少连接数。

**轮询**:自然情况下使用轮询,不需要配置需求来激活它,它是基于在唤醒中谁是的安全保证访问同步地分布到一个实时服务;

**IP哈希:**通过ip_hash指令来激活,Nginx通过IPv4的前3个字节整个IPv6地址作为哈希键来实现,同一个IP地址总是能被映射到同一个接口服务;

**最少数据:**通过最少连接指令来启动,算法通过选择一个数据最少的启动服务器进行连接。不同服务器的重要重要连接数。

### 🏦6.1、RR

**简单配置**这里我配置了2台服务器,实际上是一个,只是端口不一样,而8081的服务器是不存在的,直接访问不到,但是我们访问`http:// /localhost`的时候,也不会出现问题,会默认跳转到`http://localhost:8080`具体是因为Nginx会自动判断服务器的状态,如果遇到不能访问(服务器挂了),不会会跳转到这台服务器,也避免了一个服务器挂了影响使用的情况,因为Nginx默认是RR策略,所以我们不需要其他更多的设置

```bash
流测试 
{
    服务器本地主机:8080;
    服务器本地主机:8081;
}
服务器 
{
    听 81;
    server_name 本地主机;
    client_max_body_size 1024M;
 
    地点 / {
        proxy_pass http://test;
        proxy_set_header 主机 $host:$server_port;
    }
}
``
<font color=#2962ff size=5 face="楷体">负载均衡的核心代码为</font>

```bash
上游测试
{
    服务器本地主机:8080;
    服务器本地主机:8081;
}
``

**权重**

<font color=5 face=> 指定轮询示例,权重和访问权限成正比,用于实例性能的不的情况: </font>

```bash
上游测试 
{
    服务器本地主机:8080 weight=9;
    服务器本地主机:8081 weight=1;
}
``
<font color=#2962ff size=5 face= "楷体">那么10次一般轨迹有1次会访问到8081,而有9次会访问到8080。 </font>
### 🏨6.2、ip_hash
上面的2种方式存在一个问题,那就是下一个请求来的时候请求可能会分发到另一个服务器,当我们的程序不是无状态的时候(采用了会话​​数据),这时候就有了一个问题的问题了,比如把登录信息保存到会话中,然后跳转到另一个服务器的时候就需要登录了,所以很多我们需要一个客户才访问一个服务器,那么就需要使用 iphash了,iphash每次请求点击访问ip的哈希结果分配,这样可以每次访问一次完整的服务,解决会话的问题。

```csharp
流测试{
    ip_hash;
    服务器本地主机:8080;
    服务器本地主机:8081;
}
``
### 🏩6.3、公平
这是一个更重要的,更多的服务器的响应时间来分配请求,响应时间短的优先分配。

```bash
上游后端 
{
    公平的;
    服务器本地主机:8080;
    服务器本地主机:8081;
}
``

### 🏪6.4、url_hash
这是一个模块,点击访问url的h结果来分配请求,使url定位到同一个完整的服务器,延时为缓存时间比较有效。在上游中加入hash语句,服务器语句中不能写入weight等其他的参数,hash_method是使用的hash算法

```bash
上游后端 
{
    散列 $request_uri;
    hash_method crc32;
    服务器本地主机:8080;
    服务器本地主机:8081;
}
``
以上5种营养均衡配套适用于不同的情况下使用,所以可以根据实际情况选择使用策略模式,不过公平和url_hash需要安装适当的模块才能使用。

**服务器指令任选参数:**
1、权重:设置一个服务器的访问权重,有一次,收到的请求也越多;

2、fail_timeout:在指定的时间内必须提供响应,如果在该时间没有响应,那么时间就会被标记为停机状态;

3、max_fails:设置在fail_timeout时间之内尝试对一个服务器连接的最大次数,如果超过这个次数,那么服务器就会被标记为down;

4、下:标记一个服务器不再接受任何请求;

5、备份:点击其他地图的机器,然后有该标记的机器就会接收请求。

**keepalive指令:**

Nginx 服务器将为每个工人进行保持同一个服务器的连接。

###🏫6.5、屏蔽ip

在nginx的配置文件nginx.中加入如下配置,可以配置http,server,location,limit_except语句块,需要注意相对路径,本例成员nginx.conf,blocksip.conf在一个目录中。

```bash
包括 blockip.conf;
``
<font color=#2962ff size=5 face= "楷体">在blockip.conf里面输入内容,如:</font>

```bash
拒绝 165.91.122.67;

拒绝IP;#屏蔽单一ip访问
允许IP;#允许单个ip访问
否认一切;#屏蔽所有ip访问
允许全部; #允许所有ip访问
deny 123.0.0.0/8 #屏蔽整个段即从123.0.0.1到123.255.255.254的访问命令
deny 124.45.0.0/16#屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令
deny 123.45.6.0/24#屏蔽IP段即从123.45.6.1到123.45.6.254的访问命令

#如果你想实现这样的应用,除了几个IP外,其他都被拒绝
允许 1.1.1.1; 
允许 1.1.1.2;
否认一切;
``

##🏬7、模块可以安装方法

```bash
./configure --prefix=/你的安装目录 --add-module=/使用模块目录
``

### 🏭7.1、生产

- 永久的真实代码。请求日志中的状态为301
- 重定向随机生成。请求日志中的状态码为302

### 🏯7.2、制作自己网站
```bash
服务器
 {
    server_name old-site.com
    返回 301 $scheme://new-site.com$request_uri;
}
``

### 🏰7.3、生产单页

```bash
服务器
 {
    位置 = /oldpage.html {
        返回 301 http://example.org/newpage.html;
    }
}
``

###💒7.4、自己整个子路径

```bash
位置/旧站点
 {
    重写 ^/old-site/(.*) http://example.org/new-site/$1 永久;
}
``

## 🗼8、性能

### 🗽8.1、内容播放

<font color=#2962ff size=5 face= "楷体"> 允许浏览器永远永远地抹去不灭的内容。
 </字体>
```bash
位置/静态 
{
    根/数据;
    最大到期;
}
``
<font color=#2962ff size=5 face= "楷体">如果要求浏览器永远不会响应(例如用于查询请求),请使用-1。 </font>


```bash
位置 = /empty.gif 
{
    empty_gif;
    过期 -1;
}
``

### ⛪8.2、Gzip压缩

```bash
gzip 上;
gzip_buffers 16 8k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_proxyed 任何;
gzip_vary on;
gzip_types
    文本/xml 应用程序/xml 应用程序/atom+xml 应用程序/rss+xml 应用程序/xhtml+xml 图像/svg+xml
    文本/javascript应用程序/javascript应用程序/x-javascript
    文本/x-json 应用程序/json 应用程序/x-web-app-manifest+json
    文本/CSS 文本/纯文本/x 组件
    字体/opentype 应用程序/x-font-ttf 应用程序/vnd.ms-fontobject
    图像/x 图标;
gzip_disable "msie6";
``

### 🕌8.3、打开文件录音

```bash
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
``

### 🛕8.4、SSL缓存

```bash
ssl_session_cache 共享:SSL:10m;
ssl_session_timeout 10m;
``

### 🕍8.5、外部Keepalive

```bash
上游后端 
{
    服务器 127.0.0.1:8080;
    保活32;
}
服务器 {
    ...
    位置/api/{
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header 连接"";
    }
}
``

### ⛩️8.6、 监控点

使用`ngxtop`实时解析nginx访问日志,并且将处理结果输出到终端,功能破坏系统命令top。所有示例都可以读取nginx配置文件的访问日志位置和格式。如果要指定访问日志文件和/或日志。格式,请使用-f和-a选项。

<font color=#f44336 size=5 face= "楷体">注意:在nginx配置中`/usr/local/nginx/conf/nginx.conf`日志文件必须是绝对路径。 </font>
```bash
# 安装 ngxtop
pip 安装 ngxtop

#实时状态
顶
#状态为404的前10个请求的路径:
ngxtop 顶部 request_path --filter '状态 == 404'

#发送总字节数最多的前10个请求
ngxtop --order-by 'avg(bytes_sent) * count'

#排名前十位的IP,比如,攻击谁你最高
ngxtop --group-by remote_addr

#打印有4xx或5xx状态的请求,以及状态和http引用
ngxtop -i 'status >= 400' 打印请求状态 http_referer

#由200个请求路径响应发送的平均正文字节以'foo'开始:
ngxtop avg bytes_sent --filter 'status == 200 and request_path.startswith("foo")'

#使用“通用”日志格式从远程机器分析apache访问日志
ssh 远程尾 -f /var/log/apache2/access.log | ngxtop -f 通用
``

## 🕋9、常见使用场景

### ⛲9.1、跨域问题

<font color=#2962ff size=5=“楷体”>在工作中,正确会遇到接口不支持跨域,这时候可以简单的添加add_headers来支持cors跨域。配置如下:</font >


```bash
服务器 {
  听80;
  server_name api.xxx.com;
    
  add_header 'Access-Control-Allow-Origin' '*';
  add_header 'Access-Control-Allow-Credentials' 'true';
  add_header 'Access-Control-Allow-Methods' 'GET,POST,HEAD';

  地点 / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header 主机 $http_host;    
  } 
}
``
<font color=#2962ff size=5= "楷体解决">上面更改了头信息,还有,使用rewrite face自定义URI来跨域问题。 </font>

```bash
上游测试 
{
  服务器 127.0.0.1:8080;
  服务器本地主机:8081;
}
服务器 
{
  听80;
  server_name api.xxx.com;
  地点 /
   { 
    根html;#去请求../html文件夹里的文件
    index index.html index.htm; #首页响应地址
  }
  #用于拦截请求,匹配任何以/api/开头的地址,
  #匹配符合以后,停止往下搜索正则。
  位置 ^~/api/{ 
    # 替代拦截出现的请求,只能对域后边的其他参数外链生效,
    #例如www.a.com/proxy/api/msg?meth=1&par=2重写,只对/proxy/api/msg重写。
    # rewrite 的参数是一个简单的正则 ^/api/(.*)$,
    #$1代表正则中的第一个(),$2代表第二个()的值,以此类推。
    重写 ^/api/(.*)$ /$1 中断;
    
    #把请求代理到其他主机 
    #还有http://www.b.com/写法和http://www.b.com写法的区别如下
    # 如果你的请求地址是他 http://server/html/test.jsp
    #配置一:http://www.b.com/进入有“/” 
    # 将后端代理成 http://www.b.com/html/test.jsp 访问
    #配置一:http://www.b.com就没有“/” 
    # 将后端代理成 http://www.b.com/test.jsp 访问
    proxy_pass http://test;

    #如果proxy_pass URL是http://a.xx.com/platform/我们常见的情况
    #proxy_cookie_path应该设置成/platform//(注意两个斜杠之间有空格)。
    proxy_cookie_path /platfrom//;

    # http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_header
    # 设置 Cookie 头通过
    proxy_pass_header 设置-Cookie;
  } 
}
``

###⛺9.2、到跳转带www的域上面

```bash
服务器 
{
    听80;
    #配置正常的带www的域名
    server_name www.wangchujiang.com;
    root /home/www/wabg/download;
    地点 / {
        try_files $uri $uri//index.html =404;
    }
}
服务器 
{
    #这个要给你
    #将不带www的wangchujiang.com
    server_name wangchujiang.com;
    重写^(.*) https://www.wangchujiang.com$1 永久;
}
``

### 🌁9.3、代理转发

```bash
上游服务器 API{
    #api代理服务地址
    服务器 127.0.0.1:3110;    
}
上游服务器资源{
    #单一资源代理服务地址
    服务器 127.0.0.1:3120;
}
服务器 {
    听3111;
    server_name 本地主机;#这里指定的域名
    root /home/www/server-statics;
    # 匹配api的上网代理到API服务
    位置 ^~/api/ {
        重写 ^/(.*)$ /$1 中断;
        proxy_pass http://server-api;
    }
    # 假设这里验证码API服务中
    位置^~/验证码{
        重写 ^/(.*)$ /$1 中断;
        proxy_pass http://server-api;
    }
    #真实你的图片资源全部在另外一个服务上面
    位置 ^~/img/ {
        重写 ^/(.*)$ /$1 中断;
        proxy_pass http://server-resource;
    }
    # 导航在前端,有没有真实的语音,在不显示存在的404状态的页面返回/index.html
    #这个方式使用场景,你在写React或者Vue项目的时候,没有真实的听觉
    地点 / {
        try_files $uri $uri//index.html =404;
        #^空格很重要
    }
}
``

### 🌃9.4、 监控状态信息

<font color=#2962ff size=5 face= "楷体"> 通过`nginx -V` 来查看是否有`with-http_stub_status_module`该模块。 </font>

<font color=#2962ff size=5 face=“体”> `-V`这里V是大写的,如果是小楷的`v`即`nginx -v`,则不会出现有哪些模块,结果出现`nginx`的版本。 </font>

```bash
位置/nginx_status 
{
    存根状态开启;
    access_log off;
}
``
<font color=#2962ff size=5 face= "楷体">通过`http://127.0.0.1/nginx_status`访问出现以下结果。 </font>

```bash
活动连接数:3
服务器接受处理的请求
 7 7 5 
阅读:0 写作:1 等待:2
``
<font color#2962ff size=5 face= "楷体"> **1、主动连接(第1行)** </font>

**当前与http建立的连接数,包括等待的客户端连接:3**

<font color=#2962ff size=5 face= "楷体"> **2、服务器接受处理的请求(第 2~3 行)** </font>

**接受的客户端连接总数量:7**

**处理的客户端连接总数量:7**

**客户端总的请求数:5**

<font color=#2962ff size=5 face= "楷体"> **3、读取其他信(第4行)** </font>

**当前,nginx读请求连接**

**当前,nginx写响应返回给客户端**

**目前有多少客户端请求连接**

###🏙️9.5、代理转发连接替换

```bash
位置^~/api/上传 
{
    重写 ^/(.*)$ /wfs/v1/upload break;
    proxy_pass http://wfs-api;
}
``

### 🌄9.6、SSL配置
超文本传输​​安全协议(`缩写:HTTPS,英语:Hypertext Transfer Protocol Secure`)及超文本传输​​协议/TLS的组合,提供身份通讯对网络服务器的鉴别。万维网上交易支付和企业信息系统中敏感信息的传输。HTTPS 与在 RFC 2660 中定义的安全超文本传输​​协议(S-HTTP)相混。HTTPS 已经是所有隐私和安全的网站的首选,随着专利技术的不断发展,HTTPS网站已不再是大型网站,所有普通的个人站长和博客都可以自己动手搭建一个安全的知识网站。

创建SSL证书,如果你购买了证书,就可以直接下载

```bash
须藤 mkdir /etc/nginx/ssl
#创建了有效100年,智能强度为RSA2048的SSL证书密钥和X509文件。
须藤 openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
#上面有命令,下面需要填写的内容
国家名称(2 个字母代码)[AU]:美国
州或省名称(全名)[Some-State]:纽约
地点名称(例如,城市)[]:纽约市
组织名称(例如,公司)[Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
组织单位名称(例如,部分)[]:Ministry of Water Slides
通用名称(例如服务器 FQDN 或您的姓名)[]:your_domain.com
电子邮件地址 []:admin@your_domain.com
``
<font color=#2962ff size=5 face= "楷体">创建自签证书</font>


```bash
首先,创建证书和信仰的目录
# mkdir -p /etc/nginx/cert
# cd /etc/nginx/cert
创建服务器,命令你输入一个密码:
# openssl genrsa -des3 -out nginx.key 2048
创建签名请求的证书(CSR):
# openssl req -new -key nginx.key -out nginx.csr
在加载 SSL 的 Nginx 并使用了上面的时候脱离必须的口令支持:
# cp nginx.key nginx.key.org
# openssl rsa -in nginx.key.org -out nginx.key
标记证书使用了传统上和CSR:
# openssl x509 -req -days 365 -in nginx.csr -signkey nginx.key -out nginx.crt
``
<font color=#2962ff size=5 face=“楷体”>查看已知nginx的建议选项</font>

```bash
sbin/nginx -V
``
<font color=#2962ff size=5 face= "楷体"> 输出下面内容 </font>

```bash
nginx 版本:nginx/1.7.8
由 gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) 构建
启用 TLS SNI 支持
配置参数:--prefix=/usr/local/nginx-1.7.8 --with-http_ssl_module --with-http_spdy_module --with-http_stub_status_module --with-pcre
``
<font color=#2962ff size=5 face=“楷体”>如果依赖的模块不存在,可以进入安装目录,输入下面命令密集安装。</font>

```bash
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
``
<font color=#2962ff size=5 face= "楷体">运行完成之后还需要`make`(无需make install)</font>

```bash
# 备份nginx的二进制文件
cp -rf /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
#覆盖nginx的二进制文件
cp -rf objs/nginx /usr/local/nginx/sbin/
``

## 🌅10、HTTPS 服务器

```bash
服务器 
{
    听 443 ssl;
    server_name 本地主机;

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    #禁止在header中出现版本版本,防止漏洞利用版本
    server_tokens 关闭;
    # 设置sssl/tls 会话缓存的类型和大小。如果设置了这个,一般是共享的,构建的参数可能会内存碎片,默认是none,和关闭的,观察观察如共享:SSL:10m 表示我所有的参数。 nginx 工作流程共享 ssl 会话缓存,官网介绍说 1M 可以召开约 4000 个会话。 
    ssl_session_cache 共享:SSL:1m; 

    #客户端可以重用会话缓存中ssl参数的到期时间,内网系统默认5分钟太短了,可以设置成30分钟即30分钟甚至4小时。
    ssl_session_timeout 5m; 

    #选择智能套装,不同的浏览器所支持的套件(和顺序)可能会不同。
    #这里指定的是OpenSSL库能够识别的写法,你通过openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'(这是你指定的头部智能算法)可以看到所支持的算法。
    ssl_ciphers HIGH:!aNULL:!MD5;

    #设置优先智能算法时,优先使用我们服务端的装扮,而不是客户端浏览器的裸装。
    ssl_prefer_server_ciphers 开启;

    地点 / {
        根html;
        index index.html index.htm;
    }
}
``

### 🌆10.1、强制将http生成到https

```bash
服务器 
{
    听80;
    server_name example.com;
    重写 ^ https://$http_host$request_uri? 永恒的; #强制将http生成到https
    #在错误发布“服务”响应头页面和页面中或可以用作防止漏洞利用漏洞攻击的版本。
    server_tokens 关闭;
}
``

### 🌇10.2、两个虚拟主机

<font color=#2962ff size=5 face="楷体">纯蓝色-html支持</font>


```bash
http 
{
    服务器
     {
        听80;
        server_name www.domain1.com;
        access_log 日志/domain1.access.log 主;
        地点 / {
            索引 index.html;
            root /var/www/domain1.com/htdocs;
        }
    }
    服务器 {
        听80;
        server_name www.domain2.com;
        access_log 日志/domain2.access.log 主;
        地点 / {
            索引 index.html;
            root /var/www/domain2.com/htdocs;
        }
    }
}
``

### 🌉10.3、虚拟主机标准配置

```bash
http 
{
  服务器 
  {
    听80默认;
    服务器名称 _ *;
    access_log 日志/default.access.log 主;
    地点 / {
       索引 index.html;
       root /var/www/default/htdocs;
    }
  }
}
``

### 🎠10.4、爬虫过滤

<font color=#2962ff size=5 face= "楷体"> 可知`User-Agent`过滤请求,通过一个简单的正则表达式,就过滤不要求的爬虫要求(初级爬虫)。`~*`表示不随大小写的正则匹配</font>


```bash
地点 / 
{
    if ($http_user_agent ~* "python|curl|java|wget|httpclient|okhttp") {
        返回503;
    }
    #正常处理
    # ...
}
``

### 🎡10.5、链防盗

```bash
位置 ~* \.(gif|jpg|png|swf|flv)$ 
{
   根 html
   valid_referers 没有被阻止 *.nginxcn.com;
   如果($invalid_referer){
     改写^/ www.nginx.cn
     #返回404;
   }
}
``

### 🎢10.6、虚拟目录配置

<font color=#2962ff size=5 face=“楷体”> 别名指定的目录是准确的,根是指定目录的上级目录,并且该上级目录要包含位置指定名称的同名目录。</font>

```bash
位置 /img/ 
{
    别名 /var/www/image/;
}
#访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
位置 /img/ {
    根 /var/www/image;
}
#访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。]
``

###🚂10.7、防盗图

```bash
位置 ~ \/public\/(css|js|img)\/.*\.(js|css|gif|jpg|jpeg|png|bmp|swf) 
{
    valid_referers 没有被阻止 *.jslite.io;
    如果($invalid_referer){
        重写^/ http://wangchujiang.com/piratesp.png;
    }
}
``

### 🚃10.8、屏蔽.git等文件

```bash
位置 ~ (.git|.gitattributes|.gitignore|.svn) 
{
    否认一切;
}
``

###🚄10.9、域名路径加不加需要正常访问

```bash
http://wangchujiang.com/api/index.php?a=1&name=wcj
                                  ^ 有后缀

http://wangchujiang.com/api/index?a=1&name=wcj
                                 ^ 没有后缀
``

<font color=#2962ff size=5 face=“楷体”> nginx 重写规则如下:</font>


```bash
重写 ^/(.*)/$ /index.php?/$1 永久;
if (!-d $request_filename){
        设置 $rule_1 1$rule_1;
}
如果 (!-f $request_filename){
        设置 $rule_1 2$rule_1;
}
如果 ($rule_1 = "21"){
        最后重写^//index.php;
}
``

## 🚅11、驾驶舱
驾驶舱: [Github仓库](https://github.com/cockpit-project/cockpit) 

```bash
服务器{
    听80;
    server_name cockpit.xxxxxxx.com;
    返回 301 https://$server_name$request_uri;
}
 
服务器 {
    听 443 ssl;
    server_name cockpit.xxxxxxx.com;
 
    #ssl开启;
    ssl_certificate /etc/nginx/cert/cockpit.xxxxxxx.com.pem;
    ssl_certificate_key /etc/nginx/cert/cockpit.xxxxxxx.com.key;
 
    地点 / {
        根 /;
        索引 index.html;
        proxy_redirect 关闭;
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header 升级 $http_upgrade;
        proxy_set_header 连接“升级”;
        proxy_set_header 主机 $http_host;
    }
}
``
<font color=#2962ff size=5 face= "楷体">此时输入域名,可以看到登录页面,但登录后,显示不出内容,页面全白。这里要对`cockpit.conf`进行设置修改。 </font>
```bash
须藤vim /etc/cockpit/cockpit.conf
``
<font color=#2962ff size=5 face= "楷体">参照如下配置修改,注意域名替换为`your_domain_host`:</font>


```bash
[网络服务]
起源 = https://cockpit.xxxxxxx.com https://127.0.0.1:9090
ProtocolHeader = X-Forwarded-Proto
允许未加密 = 真
``

## 🚆12、错误问题

```bash
纯 HTTP 请求已发送到 HTTPS 端口
``
<font color=#2962ff size=5 face= "楷体"> 解决办法,`fastcgi_param HTTPS $https if_not_empty` 添加基础规则, </font>


```bash
永远 
{
    听 443 ssl;# 注意行为规则
    server_name my.domain.com;
    
    fastcgi_param HTTPS $https if_not_empty;
    fastcgi_param HTTPS 开启;

    ssl_certificate /etc/ssl/certs/your.pem;
    ssl_certificate_key /etc/ssl/private/your.key;

    地点 / {
        # 你的配置在这里...
    }
}
``

## 🚇13、精品文章参考

- [负载均衡原理的解析](https://my.oschina.net/u/3341316/blog/877206)   

- [Nginx泛域名解析,实现多个二级域名](http://blog.githuber.cn/posts/73)   

- [深入 NGINX:我们如何设计性能和扩展](https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/)  

- [NGINX 内部:我们如何为性能和规模而设计](https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/)

- [Nginx开发从入门到精通](http://tengine.taobao.org/book/index.html)

- [Nginx的优化与防盗链](http://os.51cto.com/art/201703/535326.htm#topx)

- [实战开发一个 Nginx 扩展(Nginx 模块)](https://segmentfault.com/a/1190000009769143)

- [Nginx+Keepalived(双机热备)搭建高可用支持均衡环境(HA)](https://my.oschina.net/xshuai/blog/917097)

- [Nginx 一级升级](http://www.huxd.orgarticles/2017/07/24/1500890692329.html)

- [Nginx最新模块——ngx_http_mirror_module分析可以做版本发布前的挖掘,进行流量放大后的压测等等](https://mp.weixin.qq.com/s?__biz=MzIxNzg5ODE0OA==&mid=2247483708&idx =1&sn=90b0b1dccd9c337922a0588245277666&chksm=97f38cf7a08405e1928e0b46d923d630e529e7db8ac7ca2a91310a075bdc5dc36666cfbc988
![插入插入图片描述](https://img-blog.csdnimg.cn/f7926bc0e1534476acf51c570d4c58f7.gif#pic_center)
# <font color=#0091ea size=6 face="楷体">🏳️‍🌈关注苏州程序大白,持续更新分享。谢谢大家支持🏳️‍🌈</font>
![插入插入图片描述](https://img-blog.csdnimg.cn/9c191a4f78d8430b9327de20f3120591.gif#pic_center)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档