常用命令
# 安装, ubuntu系统为例,centos是其他命令
sudo apt-get install nginx
# 重启前先检查配置文件语法
nginx -t
# 如果没有报错,执行重启
nginx -s reload
常用配置
创建新站点
安装完nginx,会有sites-available
和sites-enabled
目录,只有在sites-enabled
目录下创建的站点配置文件才会生效,但是我们一般在sites-available
目录下站点配置文件,然后软链接到sites-enabled
,这样有个好处是假设下面的 www.booking.com 站点不需要了,只需要删掉这个链接文件即可,源文件还是在sites-available目录下面,方便还原。
sudo touch /etc/nginx/sites-available/www.booking.com
sudo ln -s /etc/nginx/sites-available/www.booking.com /etc/nginx/sites-enabled/
静态站点
server {
listen 80;
# 项目根目录
root /var/www/www.test.com/public
# 项目入口文件,按优先级依次匹配,先找index.html,如果找不到就找 index.htm...
index index.html index.htm index.nginx-debian.html;
# 域名,需要先提前配置解析
server_name test.com www.test.com;
# 如果匹配地址失败返回404状态码
location / {
try_files $uri $uri/ =404;
}
}
配置https
配置https需要先申请SSL证书,现在阿里云和腾讯云都可以申请免费1年的证书,我们可以在这些公有云上申请证书,安装在自己的服务器上面,Nginx 服务器 SSL 证书安装部署,文档比较详细,这里不在复述。
需要注意几点:
- 证书和域名相关,同一个域名可以申请多个证书
- 使用证书需要验证对应的域名的所有权,比如会让你在域名对应的根目录添加一个文件,可以正确访问到,最简单的方式DNS验证
- 在腾讯云上申请的证书没有只能应用在腾讯云购买服务器的限制,域名也不一定是在腾讯云购买的,当然都是用的同一家公有云的服务验证起来比较方便
basic认证
有些网站页面需要输入正确的用户名和密码才能打开
实现方法也比较简单
sudo apt-get install apache2-utils
cd /etc/nginx
# 使用htpasswd命令创建用户demo,密码123456文件名htpasswd的验证文件
sudo htpasswd -bc htpasswd demo 123456
# 编辑 nginx 站点配置文件
# 加入下面两行到 server 或 location 段中
auth_basic 'Restricted'; # 认证名称,随意填写
auth_basic_user_file /usr/local/nginx/htpasswd; # 认证的密码文件,需要生成。
# 重启 nginx
sudo nginx -t && sudo nginx -s reload
显示目录文件列表
场景:有个存放每日备份数据库或日志的目录,希望显示列表,方便下载文件
location / {
root /data/www/file //指定实际目录绝对路径;
autoindex on; //开启目录浏览功能;
autoindex_exact_size off; //关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
autoindex_localtime on; //开启以服务器本地时区显示文件修改日期!
charset utf-8,gbk; //避免中文乱码
}
另外,如果希望请求文件是下载而不是显示内容,可以通过添加下面参数实现:add_header Content-Disposition attachment;
反向代理
我们只需要记得正向代理代理的对象是客户端,最常见的就是FQ软件
反向代理代理的对象是服务端
客户端本来可以直接通过HTTP协议访问某网站应用服务器,如果网站管理员在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。
例子:Nginx监听来自外部访问80的请求,转发给自己服务器占用18083端口的服务
server {
listen 80;
index index.html index.htm index.nginx-debian.html;
server_name mqtt.demo.com;
location / {
proxy_pass http://127.0.0.1:18083;
}
}
整合 PHP
server {
listen 80;
server_name foo.com;
root /path;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ .php$ {
try_files $uri =404;
include fastcgi.conf;
# 需要确保 /run/php/php7.2-fpm.sock 文件存在
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
# fastcgi_pass 127.0.0.1:9000;
}
}
关于 try_files 指令
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# $uri 是变量 如 www.xxx.com/aaa.php 则 $uri是aaa.php
# 假设我们访问/a.php 先判断 a.php是不是文件,是返回
# 如果不是再判断是不是目录($uri/),是返回
# 如果都不是则返回404
try_files $uri $uri/ =404;
}
# 所有的请求引导到index.php中
try_files $uri $uri/ /index.php?$query_string =404;
@ 符号的使用
@用于定义一个 location 块,且该块不能被外部 Client 所访问,只能被 Nginx 内部配置指令所访问,比如 try_files
c49fb81c8f9141ae3fe7f9db2da60bd7.htm
实际上个不存在的文件,
下面的含义的如果访问项目根目录或blog目录底下的以php结尾的文件都走php fpm解析流程
location ~ \.php$ {
try_files /c49fb81c8f9141ae3fe7f9db2da60bd7.htm @php;
}
location /blog/\.php$ {
try_files /c49fb81c8f9141ae3fe7f9db2da60bd7.htm @php;
}
location @php {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/lib/php7.2-fpm/web10.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
}
验证头信息中的 referer 参数
请求头信息中的 referer 参数,记录了上一个页面的地址,Nginx可以对其进行校验,达到防盗链的目的。
通常在配置文件的location块中增加配置。
server {
listen 80; # 端口
server_name www.osvlabs.com; # 服务名,可以是IP地址或者域名
location / { # 根路径
root html; # 对应nginx安装目标下的html文件夹
index hello.html; # 指定首页为 hello.html
}
location ~* \.(GIF|PNG|jpg|bmp|jpeg) { # *代表不区分大小写
# 校验请求是否来自于osvlabs.com这个站点,不是则返回404页面
valid_referers *.osvlabs.com;
if ($invalid_referer) {
return 404;
}
root /home/img;
}
error_page 500 502 503 504 /50x.html; # 指定这些状态码跳转的错误页
location = /50x.html {
root html;
}
}
Nginx构建服务器集群
Nginx最常用的一个功能,就是为服务器构建集群,以达到实现高并发、高可用的目的。
首先在 upstream 块中,配置服务器集群中的IP地址,然后在location块中配置转发请求到此 upstream。
# 配置集群中的服务器
upstream osvlabs {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
server {
listen 80;
server_name www.osvlabs.com;
location / {
proxy_pass http://osvlabs;
}
}
默认按所有机器权重为1的轮询方式对集群服务进行访问,每个服务访问1次,然后访问下一个服务,适合集群中每台服务器性能差不多的情况。
权重配置也是经常用的,适用于机器性能有差异的情况。
upstream osvlabs {
server 192.168.1.101:8080 weight=1;
server 192.168.1.102:8080;
server 192.168.1.103:8080 weight=3;
}
weight 就是权重配置,不配默认是1,按照以上配置,在5次请求中,101和102会被访问1次,103会被访问3次。
使用down,可以标识某个服务已停用,Nginx便不会去访问他了。
upstream osvlabs {
server 192.168.1.101:8080;
server 192.168.1.102:8080 down;
server 192.168.1.103:8080;
}
使用backup,可以标识101是备用机,当102、103宕机后,101会进行服务。
upstream osvlabs {
server 192.168.1.101:8080 backup;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
使用 max_fails 和 fail_timeout 将服务动态停用 max_fails 默认是1,fail_timeout默认是10s
upstream osvlabs {
server 192.168.1.101:8080 max_fails=2 fail_timeout=10s;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
如此配置,101服务器在10秒内如果失败次数达到2次,会停用10秒。10秒后,会尝试连接101服务器,如果连接成功则恢复轮询方式,如果不成功,再等待10秒尝试。
使用keepalive设置长链接数量,提高吞吐量
upstream osvlabs {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
keepalive 50;
}
server {
listen 80;
server_name www.osvlabs.com;
location / {
proxy_pass http://osvlabs;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
需要在upstream块中增加 keepalive 配置,在server的location块中增加 proxy_http_version 和 proxy_set_header 配置。
这样设置可以减少连接断开、新建的损耗,增加吞吐量。
其他负载均衡策略
除了前面说到的轮询方式,Nginx在负载均衡时,还有其他策略。
- ip_hash:以客户端IP地址为依据,匹配服务器。
- hash $request_uri:以请求的URL为依据,匹配服务器。
- least_conn:以服务器连接数为依据,哪个服务器连接数少,匹配哪台服务器
upstream osvlabs {
# ip_hash;
# hash $request_uri;
least_conn;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}