官方文档:http://nginx.org/en/docs/
官方源安装nginx
cat>/etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
yum -y install nginx
默认配置文件
# /etc/nginx/nginx.conf 主配置文件
#第一个部分: 配置文件主区域配置
user www; #定义worker进程管理的用户
补充: nginx的进程
master process: 主进程 #管理服务是否能够正常运行 boss
worker process: 工作进程 #处理用户的访问请求 员工
worker_processes 2; #定义有几个worker进程 == CPU核数 / 核数的2倍
error_log /var/log/nginx/error.log warn; # 定义错误日志路径信息
pid /var/run/nginx.pid; #定义pid文件路径信息
#第二个部分: 配置文件事件区域
events {
worker_connections 1024; #一个worker进程可以同时接收1024访问请求
}
#第三个部分: 配置http区域
http {
include /etc/nginx/mime.types; #加载一个配置文件
default_type application/octet-stream; #指定默认识别文件类型
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 /var/log/nginx/access.log main; #指定日志路径
sendfile on; #特殊的数据传输功能
tcp_nopush on; #参数sendfile on用于开启文件高效传输模式,同时将tcp_nopush_on和tcp_nodelay on两个指令为on,可防止网络及磁盘I/O阻塞,提升Nginx工作效率
keepalive_timeout 65; #超时时间
include /etc/nginx/conf.d/*.conf; #加载配置文件
}
# /etc/nginx/nginx.d/default ---扩展配置(虚拟主机配置文件)
#第四个部分: server区域信息(配置一个网站 www/bbs/blog -- 一个虚拟主机)
server {
listen 8080; #指定监听的端口
server_name www.oldgao.cn; #指定网站域名
root /usr/share/nginx/html; #定义站点目录的位置
index index.html index.htm; #定义首页文件
error_page 500 502 503 504 /50x.html; #优雅显示页面信息
location = /50x.html {
root /usr/share/nginx/html;
}
}
配置https
- 首先申请SSL证书
- 查看NGINX是否安装SSL模块
./nginx -V # 注意,是大写的V,如果有ssl_module那就说明有,没有就自行安装
- 新建一个server,加入以下内容
server {
listen 80;
server_name www.xxxx.com;
rewrite ^(.*) https://$server_name$1 permanent; # 这里重定向到https
}
server {
listen 443 ssl;
server_name www.xxxx.com;
ssl_certificate ../certificate/xxx.pem; # 这里是下载下来的证书
ssl_certificate_key ../certificate/xxx.key; # 这里是下载下来的证书
ssl_session_cache shared:SSL:1m; # 这里是开启缓存 大小1M
ssl_session_timeout 5m; # 指定客户端可以重用会话参数的时间(超时之后不可使用)
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 选择加密套件
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #用来指定所开启协议的版本,目前1.2是主流而且更高效。不安全的SSLv2 和 SSLv3 都要禁用。
ssl_prefer_server_ciphers on; # 设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
location / {
root html;
index index.html index.htm;
}
}
4、检查配置以及重启
# 检查配置
./nginx -t
# 重启
./nginx -s reload
location作用说明
location进行匹配(uri)
错误页面优雅显示
location /oldgao {
root /html/www;
error_page 404 /oldgao.jpg;
}
前端请求后端避免跨域问题
location /api/ {
proxy_pass http://127.0.0.1:8000;
}
location详细配置:
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
- = 开头表示精确匹配。如 A 中只匹配根目录结尾的请求,后面不能带任何字符串;
- ^~ 开头表示uri以某个常规字符串开头,不是正则匹配;
- ~ 开头表示区分大小写的正则匹配;
- ~* 开头表示不区分大小写的正则匹配;
- / 通用匹配, 如果没有其它匹配,任何请求都会匹配到。
location = / { ### 精确匹配 优先级01 最高
[ configuration A ]
}
location ^~ /images/ { ### 优先匹配/不识别uri信息中符号信息 优先级02
[ configuration B ]
}
location /documents/ { ### 按照目录进行匹配 优先级03
[ configuration C ]
}
location ~ \.(gif|jpg|jpeg)$ { ###区分大小写进行正则匹配 优先级03
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ { ###不区分大小写进行正则匹配 优先级03
[ configuration E ]
}
location / { ### 默认匹配 优先级04 最低
[ configuration F ]
}
常用参数
try_files
放置位置 location
按指定的file顺序查找存在的文件,并使用第一个找到的文件进行请求处理,查找路径是按照给定的root或alias为根路径来查找的,如果给出的file都没有匹配到,则重新请求最后一个参数给定的uri,就是新的location匹配,如果是格式2,如果最后一个参数是 = 404 ,若给出的file都没有匹配到,则最后返回404的响应码。
location / {
root /var/www/html/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
client_max_body_size
放置位置 http, server, location
client_max_body_size 默认 1M,表示 客户端请求服务器最大允许大小,在“Content-Length”请求头中指定。如果请求的正文数据大于client_max_body_size,HTTP协议会报错 413 Request Entity Too Large。就是说如果请求的正文大于client_max_body_size,一定是失败的。如果需要上传大文件,一定要修改该值。
location / {
root /var/www/html/dist;
index index.html index.htm;
client_max_body_size 512m;
}
root
放置位置server,http,location
真实的路径是root指定的值加上location指定的值 。
location /i/ {
root /data/w3;
}
请求 http://oldgao.cn/i/top.gif 时,在服务器查找的资源路径是:/data/w3/i/top.gif
alias
放置位置 location
alias 正如其名,alias指定的路径是location的别名,不管location的值怎么写,资源的真实路径都是 alias 指定的路径 ,比如:
location /i/ {
alias /data/w3/;
}
请求 http://oldgao.cn/i/top.gif 时,在服务器查找的资源路径是: /data/w3/top.gif
常用功能
1. 搭建一个多网站(www bbs blog)
vim /etc/nginx/conf.d/myserver.conf
server {
listen 80;
server_name bbs.oldgao.com;
location / {
root /html/bbs;
index index.html;
}
}
server {
listen 80;
server_name blog.oldgao.com;
location / {
root /html/blog;
index index.html;
}
}
server {
listen 80;
server_name www.oldgao.com;
location / {
root /html/www;
index index.html;
}
}
2. 访问控制
10.0.0.0/24 不能访问 www.oldgao.com/AV/
172.16.1.0/24 可以访问 www.oldgao.com/AV/
location /AV {
deny 10.0.0.0/24;
allow 172.16.1.0/24;
root /html/www;
index index.html;
}
3. 密码认证
生成密码文件
#查看有没有`htpasswd`命令
rpm -qf `which htpasswd`
#如果没有需要安装httpd-tools
yum -y install httpd-tools
#创建目录
mkdir /etc/nginx/password
#生成密码文件
htpasswd -bc /etc/nginx/password/htpasswd admin 123456
修改配置文件
location / {
root /html/www;
index index.html;
auth_basic "提示";
auth_basic_user_file password/htpasswd;
}
修改权限
chown nginx. /etc/nginx/password/htpasswd
chmod 600 /etc/nginx/password/htpasswd
4. 搭建网站文件共享服务器
location / {
root /file; #指定哪个目录作为Http文件服务器的根目录,如果你这里写了file就是你的根目录,那么访问的时候file就不会出现在目录中
autoindex on; #设置允许列出整个目录
autoindex_exact_size off; #默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on; #默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间
charset utf-8; #防止文件乱码显示, 如果用utf-8还是乱码,就改成gbk试试
}
5. 对网站进行状态监控
location = /basic_status {
stub_status;
}
6. 实现页面跳转功能
rewrite
放置位置 server, location, if
匹配正则表达式
首页重定向到其他地方,网站首页一上来不想展示原先的内容要展示子路径的内容
location =/ {
rewrite ^(.*)$ http://www.oldgao.cn:9999/index.php/home;
}
现在公司旧域名www.google.com有业务需求变更,需要使用新域名www.oldgao.cn代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
server {
listen 80;
server_name www.google.com;
charset utf-8;
access_log /var/log/nginx/www.google.cn.access.log;
location / {
if ($host = 'www.google.com'){
rewrite ^/(.*)$ http://www.oldgao.cn/$1 permanent; #permanent:永久跳转 301 会将跳转信息进项缓存, redirect:302 临时跳转 不会缓存跳转信息
}
root html;
index index.html index.htm;
}
}
今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :10.0.0.12访问正常。
server {
listen 80;
server_name www.oldgao.cn; #域名修改
charset utf-8;
access_log /var/log/nginx/access.log; #日志修改
#设置是否合法的IP标记
set $isrewrite true; #设置变量$rewrite,变量值为boole值true
#判断是否为合法IP
if ($remote_addr = "10.0.0.12"){ #当客户端IP为10.0.0.12时,将变量值设为false,不进行重写
set $isrewrite false;
}
#除了合法IP,其它都是非法IP,进行重写跳转维护页面
if ($isrewrite = true){ #当变量值为true时,进行重写
rewrite (.+) /weihu.html; #将域名后边的路径重写成/weihu.html
}
location = /weihu.html {
root /usr/share/nginx/html; #网页返回/var/www/html/weihu.html的内容
}
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
反向代理和负载均衡
upstream oldgao { #负载均衡
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
server {
listen 80;
server_name www.oldgao.cn;
location / {
proxy_pass http://oldgao; #反向代理、
proxy_set_header Host $host; #这一行的作用是把原http请求的Header中的Host字段也放到转发的请求里。如果不加这一行的话,nginx转发的请求header里就不会有Host字段,而服务器是靠这个Host值来区分你请求的是哪个域名的资源的。
proxy_set_header X-Forwarded-For $remote_addr; #转发请求时带用户ip,可以在web服务器端获得用户的真实ip
proxy_next_upstream error timeout http_404 http_502 http_403; #屏蔽错误页面,提高用户体验
}
}
负载均衡配置模块详细说明
- 轮询分配请求(平均)
upstream oldgao {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
- 权重分配请求(能力越强责任越重)
upstream oldgao {
server 10.0.0.7:80 weight=3;
server 10.0.0.8:80 weight=2;
server 10.0.0.9:80 weight=1;
}
- 实现热备功能(备胎功能)
upstream oldgao {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80 backup;
}
- 健康检查参数
#Nginx基于连接探测,如果发现后端异常,在单位周期为fail_timeout设置的时间中达到max_fails次数,这个周期次数内,如果后端同一个节点不可用,那么接将把节点标记为不可用,并等待下一个周期(同样时常为fail_timeout)再一次去请求,判断是否连接是否成功。
upstream oldgao {
server 10.0.0.7:80 max_fails=5 fail_timeout=10s; # 定义最大失败次数;定义失败之后重发的间隔时间
server 10.0.0.8:80 max_fails=5 fail_timeout=10s;
server 10.0.0.9:80 backup;
}
根据用户访问的终端信息显示不同页面
upstream web {
server 10.0.0.8:80;
}
upstream mobile {
server 10.0.0.7:80;
}
upstream default {
server 10.0.0.9:80;
}
server {
listen 80;
server_name www.oldboy.com;
location / {
if ($http_user_agent ~* iphone) {
proxy_pass http://mobile;
}
if ($http_user_agent ~* Chrome) {
proxy_pass http://web;
}
proxy_pass http://default;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}