nginx实用教程
nginx是一个高性能的web服务器软件,也是一款轻量级的代理服务器软件。
大多数的软件项目都会使用nginx来作为前端的服务器或者静态资源的服务器软件来使用,在前后端分离的项目中也会使用nginx的代理功能来处理浏览器的跨域问题。
nginx在大型项目中的使用也是非常的流行的,其中的负载均衡的功能十分的强大,非常适合于分布式系统的搭建。
一、下载和安装
nginx是一个跨平台的软件,在Windows、Linux上都有对应的版本可以使用。不管在什么平台上nginx的操作方式都是一样的。
1. Windows版本的下载和安装
- 下载
进入nginx的官网网站,选择稳定版下载即可。
注意:务必选择Stable version稳定版进行下载。
下载地址:http://nginx.org/en/download.html

- 安装
找到nginx的安装包,对安装包进行解压,把解压后的文件夹,放到合适的位置,然后把路径配置进环境变量即可。
比如你把nginx解压到了这个文件夹C:\Program Files\nginx-1.18.0,那么你只需要把这个目录添加到系统变量的PATH中即可。
- 常用指令
nginx -v # 查看nginx的版本
start nginx # 启动nginx
nginx -s reload # 重新载入配置文件
nginx -s reopen # 重启 Nginx
nginx -s stop # 停止 Nginx
nginx -s quit # 逐步停止nginx
2. Linux版本的下载和安装
Linux有很多各种不同的发行版,不同的发行版的操作有差异,这里以centOS为例进行讲解。
- 使用yum命令安装nginx
yum install -y nginx
- 常用指令
nginx -v # 查看nginx的版本
systemctl start nginx # 启动nginx
systemctl status nginx # 查看nginx的运行状态
systemctl stop nginx # 停止Nginx
systemctl restart nginx # 重启nginx
systemctl reload nginx # 重新加载nginx的配置文件
二、访问nginx
nginx自带了一个案例的项目,使用的端口号是80端口,所以当nginx启动起来了,就可以直接通过输入IP:端口号的方式在浏览器中进行访问了。
比如:http://127.0.0.1:80 。
当然,如果你是在服务器上进行安装的,可以使用服务器的公网IP:80的方式进行访问。
三、使用nginx部署项目
关于nginx的操作全部都是通过对nginx的配置文件进行修改的方式进行的,不管是Windows还是Linux的版本,配置的内容和方式都是一样的。
在windows上,nginx的配置文件的路径为:C:\Program Files\nginx-1.18.0\conf\nginx.conf
在centOS上,nginx的配置文件的路径为:/etc/nginx/nginx.conf
在配置文件中,一个server对应一个项目。
- 常用参数解释:
| 参数 | 说明 |
|---|---|
| listen | 项目监听的端口号 |
| server_name | 虚拟主机服务名称,可以设置多个,用空格隔开。一般写域名或者IP。 |
| root | 项目所在路径 |
| index | 默认访问项目中的哪个文件,默认为index.html |
| location | nginx的访问策略,根据配置到的请求地址不同访问对应的内容。 |
| proxy_pass | 代理转发的目标服务地址 |
| upstream | 设置服务组 |
1. nginx部署静态项目
在这里nginx主要的作用是给静态项目提供服务。
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
2. nginx部署前后端分离的项目
说明:前后端分离的项目中,前端的代码会去访问后端的资源,因为浏览器存在跨域的限制,所以需要配置代理。nginx会根据location中所配置的转发规则将请求自动转发到proxy_pass的地址中。

server {
listen 88;
server_name _;
root /usr/website/birthday;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location /test {
proxy_pass http://127.0.0.1:8080/books;
}
}
3. nginx配置负载均衡
说明:使用upstream设置一个服务组,通过这种配置方式,nginx会根据设置的规则将请求,转发到服务组中所包含的地址中。

- 参数说明:
- ip_hash:负载均衡的策略之一,能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上,ip_hash模式能够保证同一个用户的所有请求都被分配到同一个服务器上。
- least_conn:负载均衡的策略之一,能够把请求分派给连接数最少的服务器。
- weight = 1 表示权重,nginx会根据权重的比例来分配请求数量。
- max_fails = 2 连接失败次数,如果该地址连接失败两次,则表示该服务器已经挂了,就不会在分配任务给它。
- fail_timeout = 3 超时时长,多久没连接上则表示连接失败
upstream appServer {
ip_hash;
server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=8;
server 43.143.133.62:8080 weight=2 max_fails=3 fail_timeout=8;
server 101.43.230.91:8080 weight=3 max_fails=3 fail_timeout=8;
}
server {
listen 2222;
server_name _;
root /usr/website/rencai;
index index.html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
location / {
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location /test {
proxy_pass http://appServer/books;
}
}
4. nginx配置https项目
在生产项目中为了请求的安全一般会使用https协议,nginx配置https协议非常简单,只需要有对应的密钥和key即可。
server {
listen 443 ssl;
server_name rencai.testgoup.com;
root /software/website/rencai;
ssl_certificate "/software/CA/rencai/Nginx/1_rencai.testgoup.com_bundle.crt";
ssl_certificate_key "/software/CA/rencai/Nginx/2_rencai.testgoup.com.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location /rencai {
proxy_pass http://127.0.0.1:8088/rencai;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
5. 多个nginx组合应用
说明:在利用nginx部署大型且复杂的项目的时候,可以使用多个nginx服务进行组合发方式来部署。
四、nginx的代理相关配置解释
| 配置项 | 说明 |
|---|---|
| proxy_pass | 指定将请求转发到哪个后端服务器,格式为URL |
| proxy_connect_timeout | Nginx从接收请求到连接上后端服务器的最长等待时间 |
| proxy_read_timeout | 从后端服务器接收响应的最长等待时间 |
| proxy_send_timeout | 向后端服务器发送请求数据的最长等待时间 |
| proxy_http_version | HTTP协议版本,如HTTP/1.1 |
| proxy_set_header | 先修改请求头的值,再将请求发送给后端服务器 |
| proxy_buffering | 是否启用代理缓冲区(on/off)。如果禁用,代理一接收到内容就同步发送给客户端 |
| proxy_max_temp_file_size | 在启用代理缓冲区时,如果数据内容超过缓冲区大小,可以将数据存放到硬盘上的大小。为0时,将禁止往硬盘上写数据 |
| proxy_buffer_size | 设置缓冲区大小,用于缓冲后端服务器响应的头部信息。默认值是proxy_buffer_size 4k/8k |
| proxy_buffers | 响应上游服务器的缓冲数量和大小。默认值是proxy_buffers 8 4k/8k |
| proxy_busy_buffers_size | 分配给发送客户端响应的缓冲区大小。通常设置为proxy_buffer_size的2倍 |
| gzip | 是否启用数据压缩(on/off) |
| gzip_static | 预读gzip功能(on/off) |
| gzip_comp_level | 数据压缩等级1~9 |
| gzip_http_version | HTTP协议版本,如HTTP/1.1 |
| gzip_types | 除了默认的text/html外,启用压缩的文件类型,在mime.types中对应查找 |
| gzip_min_length | 超过这个值的数据才会被压缩 |
| gzip_buffers | 压缩数据使用的缓冲数量和大小 |
五、nginx流量复制
nginx的流量复制功能对于测试人员来说十分的有用。
在我们做灰度测试的时候,因为人力和测试设计的限制,很多时候我们都无法充分测试到灰度环境上的项目是否存在问题,那如果我们能完全的在灰度环境上模拟出用户的使用过程,那么这个问题是不是就迎刃而解了呢。
利用nginx的mirror功能,就可以实现将生产环境的流量复制到预上线环境或测试环境。

参考:https://www.cnblogs.com/kevingrace/p/14001080.html
upstream kevin-order {
server 127.0.0.1:8088;
}
upstream kevin-mirror1 {
server 172.16.60.230:8088;
}
server {
listen 80;
server_name kevin.com;
access_log /usr/local/nginx/logs/kevin.com-access.log main;
error_log /usr/local/nginx/logs/kevin.com-error.log;
# 源站点
location /order {
proxy_pass http://kevin-order;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
mirror_request_body on; # 复制请求体
mirror /mirror; # 流量复制,写几条,流量翻几倍。
}
# 镜像站点
location /mirror {
internal; # 指定此location只能被“内部的”请求调用,外部的调用请求会返回”Not found” (404)
proxy_pass http://kevin-mirror1$request_uri;
proxy_pass_request_body on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
六、常见问题解决
1. history模式的Vue项目刷新404问题
history模式的Vue项目利用nginx部署后,会出现在刷新页面是404的问题。
location / {
try_files $uri $uri/ /index.html;
}
2. 后端无法获取用户真实IP
用户在通过nginx的代理访问后端时,后端获取到的IP是nginx所在的服务器的IP,并不能拿到用户真实的IP。这种情况可以在nginx的项目中加上以下配置,后端就可以通过请求头中的X-Real-IP字段拿到用户真实的IP了。
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
}
3. nginx实现重定向
server {
server_name zentao.testgoup.com;
rewrite ^ http://119.29.76.174:9000/zentao/my/$request_uri? permanent;
}
4. nginx部署h5项目
server {
location / {
root /software/website/tgu/client; # PC端
if ($http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)")
{
root /software/website/tgu/h5; # h5
}
}
}
七、踩坑记录
1、重载配置文件出现问题
nginx: [error] CreateFile() "C:\Program Files\nginx-1.18.0/logs/nginx.pid" failed (2: The system cannot find the file specified)
解决方法:任务管理器中关闭nginx进程后,重新启动。
2、修改nginx的配置文件后无法启动
这个一般都是因为配置文件的内容格式错误导致的问题,可以通过systemctl status nginx 查看nginx的状态,确实配置文件的错误原因,然后再对应的去修改解决即可。


浙公网安备 33010602011771号