一、编译安装 nginx
nginx 官网:nginx.org
获取源码包
wget http://nginx.org/download/nginx-1.16.0.tar.gz
安装依赖:
pcre pcre-devel zlib zlib-devel
yum install pcre pcre-devel zlib zlib-devel -y
配置、编译及安装
./configure --prefix=/lamp/nginx
make & make install
开启防火墙
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
目录介绍:
conf 配置目录
html 网站根目录
logs 日志
sbin 二进制文件
二、nginx命令行参数
nginx -s stop 快速关闭
quit 优雅的关闭
reload 重新加载配置,使用新配置启动新的工作进程,正常关闭旧的工作进程
reopen 重新打开日志文件
三、虚拟主机配置
配置项:
worker_processes 1; 子进程数,一般设置为CPU数 * 核心数
worker_connections 1024; 一个子进程最大允许连接1024个链接
虚拟主机额外定义一个server就可以了
1.虚拟主机,不同域名
server {
listen 80;
server_name dust.com;
location / {
root /var/www/html;
index index.html;
}
}
2.虚拟主机,不同端口
server {
listen 8080;
server_name dust.com;
location / {
root /var/www/html;
index index.html;
}
}
需要提前打开8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
四、日志管理
main格式:
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
自定义日志:
# 需要提前将main格式的注释打开
access_log logs/dust.access.log main;
五、Location
location = patt {} 精准匹配
location patt {} 一般匹配
location ~ patt {} 正则匹配
首先看有没有精准匹配,如果有,则停止匹配过程。
普通匹配是匹配程度高的生效,不受排列顺序影响。
正则匹配收排列顺序影响,最后一个匹配的生效。
如果普通匹配和正则匹配同时存在,则正则匹配会覆盖普通匹配。
如果访问时没有具体的文件名,如:http://www.baidu.com/。则nginx会在内部二次访问。
六、Rewite
指令:
if
set 定义变量
return
break
rewirte
if 格式:
if (条件) {
重写模式
}
注意:if和()中间的空格不能少
条件:
= 等于
~ 正则匹配
~* 不区分大小写
-f -d -e 分别是 判断是否为文件、判断是否为目录、判断是否存在
例子:
// 禁止IP访问
if ($remote_addr = 192.168.182.1) {
return 403;
}
// 如果浏览器为chrome浏览器,则重定向到chrome.html这个页面
if ($http_user_agent ~* chrome) { // 正则不区分大小写匹配
rewrite ^.*$ /chrome.html; // 重写到chrome.html页面
break; // 重写后跳出,否则会500
}
// 如果页面不存在,跳转至404.html
if (!-e $document_root$fastcgi_script_name) {
rewrite ^.*$ /404.html;
break;
}
七、配置PHP解析
# nginx.conf 中打开注释
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
nginx重新加载配置
nginx/sbin/nginx -s reload
启动PHP-FPM
php/sbin/php-fpm
八、gzip压缩提升网站速度
gzip常用参数:
gzip on|off 是否开启gzip
gzip_buffers 32 4K | 16 8K 缓冲(压缩在内存中缓存几块?每块多大?)
gzip_comp_level [1-9] 推荐6 压缩级别(级别越高,压的越小,越浪费CPU资源)
gzip_disable 正则匹配 什么样的URL不进行gzip
gzip_min_length 200 开始压缩的最小长度 (mime类型可以在nginx/conf/mime.conf下查看)
gzip_proxied 设置请求者代理服务器该如何缓存内容
gzip_types text/plain application/xml 对那些类型的文件使用压缩 如:txt,xml,html,css
gzip_vary on|off 是否传输gzip压缩标志
配置:
压缩前大小
压缩后大小
九、expires缓存提升网站负载
格式:expires 30s; 30秒
expires 30h; 30小时
expires 30d; 30天
image目录下的图片全部缓存一天
出现红色框说明缓存成功
百度也使用了expires缓存
十、反向代理
nginx 使用反向代理让本地8080端口的apache服务器解析PHP
apache配置虚拟主机监听8080端口
从这里我们可以看出区别了,我的apache用的是PHP7,而我的nginx用的是5.6,这也就证明了nginx将PHP传递给apache解析。
这里有一个问题:就是请求的客户IP为nginx的IP,而不是真实客户的IP,所以我们在nginx设置,将客户IP传递过来。
这是apache的日志:上面是没有带客户IP,下面是带客户IP的
这是nginx的日志:上面是没有带客户IP,下面是带客户IP的
从这两个日志的结果来看,带客户IP和没带客户IP的是两种情况,因为是本机虚拟机测试,所以没有特别的结果。但是日志的不同也能看出这个参数的效果。
十一、nginx实现负载均衡
weight 权重
max_fails 节点请求失败次数
max_fails 节点请求失败时间
这里加了两个端口的server,用来模拟多个服务器
所有关于图片的请求全部由 "图片服务器" imgserver 处理。多个服务器就是由upstream "起别名",然后由proxy_pass指向别名。
然后请求三次,看两个服务器的日志。81的被请求两次,82的被请求一次。负载均衡默认的算法就是针对服务器的顺序逐个请求。
十二、nginx连接memcache
nginx配置:
location / {
// 设置变量
set $memcached_key "$uri";
// 请求memcache服务器
memcached_pass 127.0.0.1:11211;
// 没有结果则返回一个错误页面(回调页面)。
error_page 404 /callback.php;
}
callback.php
// 获取key,即URI
$uri = $_SERVER['REQUEST_URI'];
// 第一次请求则输出
echo 'request='.$uri;
// 实例化memcached
$memcache = new memcached();
// 添加一个服务器
$memcache->addServer('localhost',11211);
// 添加一条缓存
$memcache->add($uri, 'request='.$uri, 0, 300);
// 关闭所有链接
$memcache->quit();