nginx配置与使用
自从使用前后端分离模式开发项目后,前端开发需要了解掌握的东西也越多了。
虽然前端不需要精通nginx,但熟悉nginx基本的配置对一些项目的本地开发调试来说非常方便有效。
因此,记录一下nginx的基本配置和使用。
前言
- 现在大部分都使用vue,react等脚手架快捷开发项目,大大提高了前端开发效率
- 当有一些功能修改之后需要部署到线上环境才能验证时,就需要build打包代码后放到测试环境进行测试。
- 可以将build打包后的代码放入本地nginx服务器中模拟测试,测试OK后再部署到测试环境进行测试,避免因频繁修改代码并部署而影响线上环境。
- 对于一些不需要用到脚手架的小项目,nginx中配置下代理转发,便可以进行跨域访问了,这样就可以直接在nginx中进行开发调试了。
下面分享下nginx的安装、配置使用以及配置https访问方法
nginx下载与安装
Nginx版本说明
- Mainline version :开发版,主要是给广大Nginx爱好者,测试、研究和学习的,但是不建议使用于生产环境。
- Stable version : 稳定版,也就是我们说的长期更新版本。这种版本一般比较成熟,经过长时间的更新测试,所以这种版本也是主流版本。
- legacy version : 历史版本,如果你需要以前的版本,Nginx也是有提供的。
下载安装
nginx下载地址:nginx.org/download/
下载对应版本的安装包(我下载的版本是nginx-1.17.3),将其解压到本地的任一目录下。
我电脑系统是win10 64位的,解压到的目录:D:\nginx-1.17.3。
html目录下放置我们前端build打包好的代码或者非脚手架的前端代码,conf目录下有个非常重要的文件nginx.conf,用来配置nginx服务器。
nginx配置说明
nginx文件结构
...... # main全局块
events { # events块
......
}
http # http块
{
...... # http全局块
server # server块
{
...... # server全局块
location [PATTERN] # location块
{
......
}
location [PATTERN]
{
......
}
}
server
{
......
}
upstream name { # upstream块
......
}
...... # http全局块
}
如上述配置文件所示,主要由6个部分组成:
- main全局块:用于nginx工作模式的配置,配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events块:用于nginx工作模式的配置,配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http块:用于进行http协议信息的一些配置,可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- server块:用于进行服务器访问信息的配置,配置虚拟主机的相关参数,一个http中可以有多个server。
- location块:用于进行访问路由的配置,配置请求的路由,以及各种页面的处理情况。
- upstream块:用于进行负载均衡的配置
nginx服务器基本配置
打开conf目录下的nginx.conf文件,这个文件就是nginx服务器配置文件,下面是我的一些配置:
########### 每个指令必须有分号结束。#################
# user administrator administrators; # 配置用户或者组,默认为nobody nobody。
worker_processes 1; # 允许生成的进程数,默认为1
# 制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别依次为:debug|info|notice|warn|error|crit|alert|emerg
# error_log log/error.log debug;
# error_log logs/error.log;
# error_log logs/error.log notice;
# error_log logs/error.log info;
# pid logs/nginx.pid; # 指定nginx进程运行文件存放地址
events {
accept_mutex on; # 设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; # 设置一个进程是否同时接受多个网络连接,默认为off
# use epoll; # 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
## 以下配置可以开启目录浏览功能,可在http下全局设置,也可单独某个server的location目录下设置
autoindex on; # 开启目录浏览功能;
autoindex_exact_size off; # 关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
autoindex_localtime on; # 开启以服务器本地时区显示文件修改日期!
include mime.types; # 文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型,默认为text/plain
# access_log log/access.log myFormat; # combined为日志格式的默认值
access_log off; # 取消服务日志
## 自定义格式
# <1>
# log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';
# <2>
# log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
sendfile on; # 允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; # 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; # 连接超时时间,默认为75s,可以在http,server,location块。
client_max_body_size 200m;
#gzip on;
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; # 热备
}
server {
# keepalive_requests 120; # 单连接请求上限次数。
listen 5555; # 监听端口
server_name localhost; # 监听地址
location ~*^.+$ { # 请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
# root path; # 根目录
# root D:/my-workspace/login; # 设置D:\my-workspace\login为根目录
# index index.html index.htm; # 设置默认页
proxy_pass http://mysvr; # 请求转向mysvr 定义的服务器列表
deny 127.0.0.1; # 拒绝的ip
allow 10.200.120.122; # 允许的ip
}
}
server {
# keepalive_requests 120; # 单连接请求上限次数。
listen 9999;
server_name localhost;
location / {
root html; # 设置nginx的html文件夹为根目录
# index index.html index.htm;
try_files $uri $uri/ /index.html; # vue history模式时的路径匹配设置
# 以下配置可以开启目录浏览功能,可在http下全局设置,也可单独某个server的location目录下设置
# autoindex on; # 开启目录浏览功能;
# autoindex_exact_size off; # 关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
# autoindex_localtime on; # 开启以服务器本地时区显示文件修改日期!
}
# 配置代理。由于项目是在本地起动的,当我们的request需要跨域请求其他ip地址时, 可以使用下面的配置进行匹配
# 如果你的request链接为localhost:9999/api/login?name=zhangsan,那么下面配的就是location /api,最终会被代理到 http://192.168.1.206:80/login?name=zhangsan
location /api {
proxy_pass http://192.168.1.206:80;
}
# 如果你的项目是多页面的,则需要用到下面的配置。
# 因为此时你的浏览器的url不是localhost:9999/#/login,而是 localhost:9999/a.html/#/login
# 所以我们需要将路径中a.html指向具体的某个文件夹中的html文件,因为默认指向index.html
location /a.html {
alias html;
index a.html;
}
location /b.html{
alias html;
index b.html;
}
# 404页面配置,页面同样在html文件夹中
error_page 404 /404.html;
location = /404.html {
root html;
}
# 其他错误码页面配置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 9998;
# server_name localhost;
location / {
root html; # 设置nginx的html文件夹为根目录
# index index.html index.htm;
try_files $uri $uri/ /index.html; # vue history模式时的路径匹配设置
# 以下配置可以开启目录浏览功能,可在http下全局设置,也可单独某个server的location目录下设置
# autoindex on; # 开启目录浏览功能;
# autoindex_exact_size off; # 关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
# autoindex_localtime on; # 开启以服务器本地时区显示文件修改日期!
}
location /phone/ {
proxy_pass http://192.168.1.206:80/phone/; # 将地址代理到/phone/
}
# 404页面配置,页面同样在html文件夹中
error_page 404 /404.html;
location = /404.html {
root html;
}
# 其他错误码页面配置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
上面是nginx的一些基本配置,需要注意的有以下几点:
- 日志几个常见配置项:
- $remote_addr:与 $http_x_forwarded_for 用以记录客户端的ip地址;
- $remote_user:用来记录客户端用户名称;
- $time_local: 用来记录访问时间与时区;
- $request: 用来记录请求的url与http协议;
- $status: 用来记录请求状态;成功是200;
- $body_bytes_s ent:记录发送给客户端文件主体内容大小;
- $http_referer:用来记录从那个页面链接访问过来的;
- $http_user_agent:记录客户端浏览器的相关信息;
- 惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。
文章末尾列出了nginx各个模块的详细信息,可供参考
nginx启动、关闭、重启等
进入nginx目录(D:\nginx-1.17.3),双击nginx.exe,来启动nginx。
启动完成后在浏览器地址栏输入localhost:9999看到nginx默认的欢迎页面,则说明本地的nginx服务器搭建好了
nginx有一些常用命令,可以启动,关闭,重启nginx,下面是一些常用的命令
nginx常用命令
由于nginx执行程序没有添加到系统变量,所以一定要进入nginx的安装目录才能执行
start nginx启动nginxnginx -s stop强制关闭nginx -s quit安全关闭nginx -t -c conf/nginx.conf检查测试 nginx 配置文件nginx -s reload改变配置文件的时候,重启nginx工作进程,来时配置文件生效nginx -s reopen打开日志文件nginx -v查看Nginx版本
命令封装
虽然使用命令行可以进行nginx的操作,但是每次都需要进入nginx目录,还需要手动敲命令,个人感觉不是很方便
下面就将一些常用操作进行封装,封装到一个.bat的批处理文件,以后只需要双击这个文件就可以快捷操作了
- 1、首先在桌面新建一个nginx.txt文本文件,将下面的批处理代码复制粘贴进去,保存,关闭文件
@echo off
rem 提供Windows下nginx的启动,重启,关闭功能
echo ==================begin========================
cls
::ngxin 所在的盘符
set NGINX_PATH=D:
::nginx 所在目录
set NGINX_DIR=D:\nginx-1.17.3\
color 0a
TITLE Nginx 管理程序增强版
CLS
echo.
echo. ** Nginx 管理程序 ***
echo.
:MENU
echo. ***** nginx 进程list ******
::tasklist|findstr /i "nginx.exe"
tasklist /fi "imagename eq nginx.exe"
echo.
if ERRORLEVEL 1 (
echo nginx.exe不存在
) else (
echo nginx.exe存在
)
echo.
::*************************************************************************************************************
echo.
echo. [1] 启动Nginx
echo. [2] 关闭Nginx
echo. [3] 重启Nginx
echo. [4] 刷新控制台
echo. [5] 重新加载Nginx配置文件
echo. [6] 检查测试nginx配置文件
echo. [7] 查看nginx version
echo. [0] 退 出
echo.
echo.请输入选择的序号:
set /p ID=
IF "%id%"=="1" GOTO start
IF "%id%"=="2" GOTO stop
IF "%id%"=="3" GOTO restart
IF "%id%"=="4" GOTO MENU
IF "%id%"=="5" GOTO reloadConf
IF "%id%"=="6" GOTO checkConf
IF "%id%"=="7" GOTO showVersion
IF "%id%"=="0" EXIT
PAUSE
::*************************************************************************************************************
::启动
:start
call :startNginx
GOTO MENU
::停止
:stop
call :shutdownNginx
GOTO MENU
::重启
:restart
call :shutdownNginx
call :startNginx
GOTO MENU
::检查测试配置文件
:checkConf
call :checkConfNginx
GOTO MENU
::重新加载Nginx配置文件
:reloadConf
call :checkConfNginx
call :reloadConfNginx
GOTO MENU
::显示nginx版本
:showVersion
call :showVersionNginx
GOTO MENU
::*************************************************************************************
::底层
::*************************************************************************************
:shutdownNginx
echo.
echo.关闭Nginx......
taskkill /F /IM nginx.exe > nul
echo.OK,关闭所有nginx 进程
goto :eof
:startNginx
echo.
echo.启动Nginx......
IF NOT EXIST "%NGINX_DIR%nginx.exe" (
echo "%NGINX_DIR%nginx.exe"不存在
goto :eof
)
%NGINX_PATH%
cd "%NGINX_DIR%"
IF EXIST "%NGINX_DIR%nginx.exe" (
echo "start '' nginx.exe"
start "" nginx.exe
)
echo.OK
goto :eof
:checkConfNginx
echo.
echo.检查测试 nginx 配置文件......
IF NOT EXIST "%NGINX_DIR%nginx.exe" (
echo "%NGINX_DIR%nginx.exe"不存在
goto :eof
)
%NGINX_PATH%
cd "%NGINX_DIR%"
nginx -t -c conf/nginx.conf
goto :eof
::重新加载 nginx 配置文件
:reloadConfNginx
echo.
echo.重新加载 nginx 配置文件......
IF NOT EXIST "%NGINX_DIR%nginx.exe" (
echo "%NGINX_DIR%nginx.exe"不存在
goto :eof
)
%NGINX_PATH%
cd "%NGINX_DIR%"
nginx -s reload
goto :eof
::显示nginx版本
:showVersionNginx
echo.
%NGINX_PATH%
cd "%NGINX_DIR%"
nginx -V
goto :eof
-
2、将nginx.txt文件重命名为nginx.bat,弹窗,点击确定即可
-
3、双击执行nginx.bat文件,效果如下图,列出了7个操作,想要执行哪个操作,只需要输入对应操作的编号即可
输入1启动nginx,可以看到nginx启动后的效果,命令行窗口打印出了当前nginx进程相关信息
通过执行批处理文件,可以非常方便快捷的进行nginx的启动,关闭以及重启等操作
nginx配置https访问
安装OpenSSL
(1)下载地址:去slproweb.com/products/Wi…下载OpenSSL(根据系统选择32位或者64位版本下载安装)。
我的系统是win10 64位的,本次下载的版本为 Win64 OpenSSL v1.1.1g的.exe安装包。
下载完成后选择任意一个目录进行安装,我安装在了D:\OpenSSL目录)
(2)配置环境变量:
-
在环境变量中添加环境变量,变量名为
OPENSSL_HOME,变量值为D:\OpenSSL\bin(指向OpenSSL的安装路径下的bin目录)。 -
在 Path变量 结尾添加一条:
%OPENSSL_HOME%。 -
在环境变量中添加环境变量,变量名为
OPENSSL_CONF,变量值为D:\OpenSSL\bin\openssl.cfg(指向openssl.cfg文件)。
生成证书
(1)在Nginx安装目录中创建ssl文件夹用于存放证书。以管理员的身份运行cmd.exe,进入ssl文件夹。
(2)创建私钥
在命令行中执行命令:
openssl genrsa -des3 -out openssl.key 1024 # openssl.key 可以随意取名,以.key后缀名结尾即可
此处要输入和验证密码(本次设置为123456),输入时界面是看不到密码的,请认真输入并记住改密码,后面会用到。
(3)创建csr证书
在命令行中执行命令:
openssl req -new -key openssl.key -out openssl.csr
其中openssl.key文件为刚才生成的.key文件。
执行上述命令后,需要输入一系列的信息。
输入的信息中最重要的为Common Name,这里输入的域名即为我们要使用https访问的域名,比如我输入的是localhost,其它的内容随便填即可。
以上步骤完成后,ssl文件夹内会有两个文件:openssl.csr 和 openssl.key
(4)去除密码
在加载SSL支持的Nginx并使用上述私钥时需要输入密码,为了启动方便,先去除密码。
首先拷贝一份openssl.key并重命名为 openssl_copy.key。
在命令行中执行如下命令以去除密码:
openssl rsa -in openssl_copy.key -out openssl.key
如下图所示,此命令需要密码,这个密码就是上文中在创建私钥的时候输入的密码。
(5)生成crt证书
在命令行中执行如下命令:
openssl x509 -req -days 365 -in openssl.csr -signkey openssl.key -out openssl.crt
至此,证书生成完毕。我们发现,ssl文件夹中一共生成了4个文件。
下面在nginx中配置https服务器的时候,我们需要用到的是其中的openssl.crt和openssl.key这两个文件。
修改nginx.conf配置文件
- 打开nginx安装目录
D:\nginx-1.17.3\conf\下的nginx.conf文件 - 找到HTTPS server配置https的那一段(即包含有listen 443 ssl的那一段),默认这段代码被注释掉了,删除前面的
#号解除注释 - 然后分别修改其中的
ssl_certificate和ssl_certificate_key配置项为刚才所生成的openssl.crt和openssl.key这两个文件的路径。 - nginx默认读取的是conf目录下的证书,可以将刚才生成的证书放到conf目录下,我的证书在ssl目录,这里需要返回到ssl目录去获取证书
- 默认
https://localhost即可访问页面。 server_name配置项可以随意设置,比如"local-https",启动之后也可以使用https://local-https访问
修改后的该段配置如下:
server {
# 默认localhost的80端口可以访问
listen 443 ssl;
server_name local-https;
ssl_certificate ../ssl/openssl.crt;
ssl_certificate_key ../ssl/openssl.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
# try_files $uri $uri/ /index.html; # vue history模式时的路径匹配设置
# 固定写法-------------
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto $scheme;
# proxy_set_header X-Forwarded-Port $server_port;
# proxy_pass http://127.0.0.1:8086;
}
}
重启nginx,在浏览器地址栏输入 https://localhost 并回车。
这时候,你可能看到“您的连接不是私密连接”的提示,单击页面中的“高级”,并接着单击“继续前往xxx(不安全)”,就可以看到界面了。说明https服务器已经配置成功了。
模块详解
main模块
示例代码:
# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;
上述配置都是存放在main全局配置模块中的配置项
- user:用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
- worker_processes:指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
- error_log:定义错误日志文件的位置及输出级别 debug|info|notice|warn|error|crit|alert|emerg
- pid:用来指定进程id的存储文件的位置
- worker_rlimit_nofile:用于指定一个进程可以打开最多文件数量的描述
event 模块
示例代码:
event {
worker_connections 1024;
multi_accept on;
use epoll;
}
上述配置是针对nginx服务器的工作模式的一些操作配置
- worker_connections:指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。
- multi_accept:配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
- use epoll:配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue
http模块
作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可!
(1)基础配置
-
sendfile on:配置on让sendfile发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处
-
tc_nopush on:让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
-
tcp_nodelay on:让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦
-
keepalive_timeout 10:给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好
-
client_header_timeout 10:设置请求头的超时时间
-
client_body_timeout 10:设置请求体的超时时间
-
send_timeout 10:指定客户端响应超时时间,如果客户端两次操作间隔超过这个时间,服务器就会关闭这个链接
-
limit_conn_zone $binary_remote_addr zone=addr:5m :设置用于保存各种key的共享内存的参数,
-
limit_conn addr 100: 给定的key设置最大连接数
-
server_tokens:虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处哦
-
include mime.types:指定在当前文件中包含另一个文件的指令
-
default_type application/octet-stream:指定默认处理的文件类型可以是二进制
-
type_hash_max_size 2048:混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢
(2)日志配置
- access_log logs/access.log:设置存储访问记录的日志
- error_log logs/error.log:设置存储记录错误发生的日志
(3)SSL证书加密
- ssl_protocols:指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。
- ssl prefer server ciphers:设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件
(4)压缩配置
- gzip:是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
- gzip_disable:为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
- gzip_static:告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。
- gzip_proxied:允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。
- gzip_min_length:设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。
- gzip_comp_level:设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。
- gzip_type:设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。
(5)文件缓存配置
- open_file_cache:打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。
- open_file_cache_valid:在
open_file_cache中指定检测正确信息的间隔时间。 - open_file_cache_min_uses:定义了
open_file_cache中指令参数不活动时间期间里最小的文件数。 - open_file_cache_errors:指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。
server模块
srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息
- server:一个虚拟主机的配置,一个http中可以配置多个server
- server_name:用力啊指定ip地址或者域名,多个配置之间用空格分隔
- root:表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录
- index:用户访问web网站时的全局首页
- charset:用于设置www/路径中配置的网页的默认编码格式
- access_log:用于指定该虚拟主机服务器中的访问记录日志存放路径
- error_log:用于指定该虚拟主机服务器中访问错误日志的存放路径
location模块
location模块是nginx配置中出现最多的一个配置,主要用于配置路由访问信息
在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,所以location模块也是一个非常重要的配置模块
(1)基本配置
location / {
root /nginx/www;
index index.php index.html index.htm;
}
- location /:表示匹配访问根目录
- root:用于指定访问根目录时,访问虚拟主机的web目录
- index:在不指定访问具体资源时,默认展示的资源文件列表
(2)反向代理配置方式
通过反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化
location / {
proxy_pass http://bbb.example.com;
proxy_set_header X-real-ip $remote_addr;
# proxy_set_header Host $http_host;
# proxy_set_header Host $proxy_host;
}
如果想要将aaa.example.com/api的请求代理到bbb.example.com/api
- 当Host设置为
$http_host时,不会改变请求头的值,所以当要转发到bbb.example.com的时候,请求头还是aaa.example.com的Host信息 - 当Host设置为
$proxy_host时,则会重新设置请求头为bbb.example.com的Host信息。 - 如果不设置Host,则默认host的值为proxy_pass后面跟的那个域名或者IP(一般写IP)
(3)uwsgi配置
wsgi模式下的服务器配置访问方式
location / {
include uwsgi_params;
uwsgi_pass localhost:9999
}
upstream模块
upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器
简单的配置方式如下
upstream name {
ip_hash;
server 192.168.1.100:8000;
server 192.168.1.100:8001 down;
server 192.168.1.100:8002 max_fails=3;
server 192.168.1.100:8003 fail_timeout=20s;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
配置信息说明:
- ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定
- server host:port:分发服务器的列表配置
- down:表示该主机暂停服务
- max_fails:表示失败最大次数,超过失败最大次数暂停服务
- fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求