一、Nginx安装
1、centos
sudo yum install epel-release
sudo yum install nginx
sudo systemctl enable nginx
sudo systemctl start nginx
2、ubuntu
sudo apt update -y
sudo apt install nginx
sudo systemctl enable nginx
sudo systemctl start nginx
二、Nginx配置
user root; #Nginx 使用的用户和用户组
worker_processes auto; # worker 进程数量
worker_rlimit_nofile 65535;
pid /var/run/nginx.pid; # nginx 使用的 PID 文件路径
# 日志等级 [ debug | info | notice | warn | error | crit ]
error_log /data/logs/nginx/error.log info; # 日志路径、日志等级
events {
use epoll; # 事件处理模型
worker_connections 65535; # 每个 Worker 处理的
multi_accept on;
}
http {
include mime.types; # 引入 mime-types
default_type application/octet-stream; # 设置默认情况下的 mime-type
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" '
'$request_time';
log_format json_log escape=json '{ "@timestamp": "$time_iso8601", '
'"app": "$app", '
'"remote_addr": "$remote_addr", '
'"referer": "$http_referer", '
'"request": "$request", '
'"status": $status, '
'"bytes": $body_bytes_sent, '
'"agent": "$http_user_agent", '
'"x_forwarded": "$http_x_forwarded_for", '
'"up_addr": "$upstream_addr",'
'"up_host": "$upstream_http_host",'
'"up_resp_time": "$upstream_response_time",'
'"request_time": "$request_time",'
'"server_name": "$server_name",'
'"x-zz-app-info": "$http_x_zz_app_info"'
' }';
access_log /data/logs/nginx/access.log; #全局nginx访问日志
sendfile on; # 使用 sendfile 发送文件
tcp_nopush on; # 仅依赖于 sendfile 的使用。它能够使 Nginx 在一个数据包中尝试发送响应头,以及在数据包中发送一个完整的文件
tcp_nodelay on; #启用或禁用 TCP_NODELAY 选项,用于 keep-alive 连接
keepalive_timeout 65; #指定 keep-alive 连接持续多久。第二个参数用于在响应头中这只”Keep-Alive”头
keepalive_requests 100;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on; # 是否开启 Gzip
gzip_min_length 1k; # Gzip 处理的底线阈值
gzip_buffers 4 128k; # gzip 压缩所用 Buffer
gzip_http_version 1.1; # 设置version
gzip_comp_level 4; # 设置压缩等级
gzip_types text/plain application/x-javascript text/css application/xml; # gzip 使用的 mime-type
gzip_vary on;
client_max_body_size 128m; # 客户端请求最大值
client_body_buffer_size 128k; # 客户端请求buffer最大值
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
client_header_buffer_size 1k; # 客户端头缓存大小
large_client_header_buffers 4 16k; # 较大客户端头缓存大小
include /etc/nginx/conf.d/*.conf; #加载子配置目录(配置server conf)
server {
listen one.example.com/80/443/ssl; # 监听域名或端口
server_name one.example.com www.one.example.com; # 主机域名
access_log /var/log/nginx.access_log main; #记录日志
location / {
proxy_pass http://127.0.0.1/; # 设置代理地址
proxy_redirect off; # 设置跟随转发
proxy_set_header Host $host; # 设置 proxy 头
proxy_set_header X-Real-IP $remote_addr; # 设置真实 IP
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置转发头
client_max_body_size 10m; # 客户端请求最大值
client_body_buffer_size 128k; # 客户端请求 Buffer 最大值
client_body_temp_path /var/nginx/client_body_temp; # 客户端请求临时路径
proxy_connect_timeout 70; # 客户端链接超时
proxy_send_timeout 90; # 客户端发送超时
proxy_read_timeout 90; # 客户端接收超时
proxy_send_lowat 12000; # 客户端链接超时
proxy_buffer_size 4k; # 代理 Buffer 大小
proxy_buffers 4 32k; # 代理大量 buffer 配置
proxy_busy_buffers_size 64k; # 代理较忙碌情况下 Buffer 配置
proxy_temp_file_write_size 64k; # 代理写文件缓存配置
proxy_temp_path /var/nginx/proxy_temp; # 代理缓存路径
charset utf-8; # charset 设置
}
error_page 404 /404.html; # 配置 404 页面
location = /404.html { # 设置 404 页面的规则
root /spool/www; # 设置 404 页面使用 /spool/www 目录
}
location /old_stuff/ { # 设置 /old_staff/规则
rewrite ^/old_stuff/(.*)$ /new_stuff/$1 permanent; # 301 跳转到新的规则
}
location /download/ { # 设置 /download 规则
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) { #屏蔽不是来自 *.example.com 的请求
#rewrite ^/ http://www.example.com/;
return 403;
}
#rewrite_log on;
# rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3
rewrite ^/(download/.*)/mp3/(.*)\..*$
/$1/mp3/$2.mp3 break;
root /spool/www;
#autoindex on; # 是否开启自动 Index
access_log /var/log/nginx-download.access_log download;
}
location ~* \.(jpg|jpeg|gif)$ {
root /spool/www;
access_log off;
expires 30d;
}
}
}
三、Nginx 命令操作
Nginx 的常用命令行操作如下:
- nginx -t 测试 Nginx 配置文件是否符合要求;
- nginx -s reload 重新加载 Nginx 配置文件;
- nginx -V 查看 Nginx 版本信息、编译参数等。
四、常用 Nginx 的 配置
nginx location匹配优先级
location表达式类型
~ 表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
= 进行普通字符精确匹配。也就是完全匹配
@ "@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
location优先级说明
在nginx的location和配置中location的顺序没有太大关系。跟location表达式的类型有关。相同类型的表达式,字符串长的会优先匹配。
第一优先级:等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
第二优先级:^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
第三优先级:正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
第四优先级:常规字符串匹配类型。按前缀匹配。
location优先级示例 配置项如下:
location = / {
# 仅仅匹配请求 /
[ configuration A ]
}
location / {
# 匹配所有以 / 开头的请求。但是如果有更长的同类型的表达式,则选择更长的表达式。如果有正则表达式可以匹配,则
# 优先匹配正则表达式。
[ configuration B ]
}
location /documents/ {
# 匹配所有以 /documents/ 开头的请求。但是如果有更长的同类型的表达式,则选择更长的表达式。
#如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration C ]
}
location ^~ /images/ {
# 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找。所以,即便有符合的正则表达式location,也
# 不会被使用
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif jpg jpeg结尾的请求。但是 以 /images/开头的请求,将使用 Configuration D
[ configuration E ]
}
请求匹配示例
/ -> configuration A
/index.html -> configuration B
/documents/document.html -> configuration C
/images/1.gif -> configuration D
/documents/1.jpg -> configuration E
0、Nginx配置负载均衡
- 配置说明
weight 默认为1,将请求平均分配给每台server,最高为100,数值越大,分配的请求越多。
max_fails 默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。
fail_timeout默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它。
backup 备份机,所有服务器挂了之后才会生效。
down 标识某一台server不可用。
max_conns 限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置。
- http配置:
http {
...
upstream tomcats {
server 192.168.0.10:8080 weight=2 max_fails=3 fail_timeout=15;
server 192.168.0.11:8080 weight=3;
server 192.168.0.12:8080 weight=1;
server 192.168.0.13:8080 backup; # 在10、11、12、15都挂了之前,13为不可用状态,不会将请求分配给它。只有当10、11、12、15都挂了,13才会被启用。
server 192.168.0.14:8080 down; # 这台Server为无效状态,不会将请求分配给它。
server 192.168.0.15:8080 max_conns=1000; #表示最多给100这台Server分配1000个请求,如果这台Server正在处理1000个请求,nginx将不会分配新的请求给到它。假如有一个请求处理完了,还剩下999个请求在处理,这时nginx也会将新的请求分配给它。
}
}
- server配置
server {
listen 80;
location / {
proxy_pass http://tomcats;
}
}
1、Nginx开启ssl
server {
listen 80;
server_name www.example.com;
location / {
rewrite (.*) https://www.example.com$1 permanent;
}
}
server {
listen 443 ssl;
server_name www.example.com;
ssl on;
ssl_certificate /etc/ssl/private/ssl-bundle.crt;
ssl_certificate_key /etc/ssl/private/91zll_net.key;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_prefer_server_ciphers on;
}
2、Nginx配置跨域
- 方案1 *:通配符,全部允许,存在安全隐患(不推荐)。
- 一旦启用本方法,表示任何域名皆可直接跨域请求:
server {
...
location / {
# 允许 所有头部 所有域 所有方法
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Headers' '*';
add_header 'Access-Control-Allow-Methods' '*';
# OPTIONS 直接返回204
if ($request_method = 'OPTIONS') {
return 204;
}
}
...
}
- 方案2:多域名配置(推荐)
- 配置多个域名在map中 只有配置过的允许跨域:
map $http_origin $corsHost {
default 0;
"~https://zzzmh.cn" https://zzzmh.cn;
"~https://chrome.zzzmh.cn" https://chrome.zzzmh.cn;
"~https://bz.zzzmh.cn" https://bz.zzzmh.cn;
}
server {
...
location / {
# 允许 所有头部 所有$corsHost域 所有方法
add_header 'Access-Control-Allow-Origin' $corsHost;
add_header 'Access-Control-Allow-Headers' '*';
add_header 'Access-Control-Allow-Methods' '*';
# OPTIONS 直接返回204
if ($request_method = 'OPTIONS') {
return 204;
}
}
...
}
3、Nginx设置目录浏览,浏览器列出整个目录
server {
listen 80;
charset utf-8;
server_name localhost;
root /www/web/default;
location / {
autoindex on;
autoindex_exact_size off; #默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on; # 默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间
}
}
4、Nginx 设置访问验证
- 验证账户密码及安全验证文件
$ yum install -y httpd
$ which htpasswd
$ htpasswd -bc htpasswd admin 123456
- nginx配置
server {
listen 80;
server_name www.oldboy.com;
location / {
root /html/www;
index index.html;
auth_basic "安全验证";
auth_basic_user_file /var/www/html/htpasswd;
}
}
5、开启 Nginx 状态监控
location /status {
stub_status on;
access_log off;
}
6、整站 301 跳转
server {
server_name old-site.com
return 301 $scheme://new-site.com$request_uri;
}
7、屏蔽特定 IP
location / {
# block one workstation
deny 192.168.1.1;
# allow anyone in 192.168.1.0/24
allow 192.168.1.0/24;
# drop rest of the world
deny all;
}
8、设置代理头
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
9、开启 Gzip 压缩
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
text/xml application/xml application/atom+xml application/rss+xml
application/xhtml+xml image/svg+xml
text/javascript application/javascript application/x-javascript
text/x-json application/json application/x-web-app-manifest+json
text/css text/plain text/x-component
font/opentype application/x-font-ttf application/vnd.ms-fontobject
image/x-icon;
gzip_disable "msie6";
10、Nginx配置透传客户端真实IP
-
由于默认情况下无法在后端web服务器查看到真实客户端ip,在实际生产中可能会影响到用户分析等后续行为,为了避免此情况的出现,则要用到IP透传。IP透传的工作原理是Nginx代理服务器在转发请求时添加一个头,即header,这个header里携带有真实客户端IP,另外后端web服务器在配置文件的日志记录格式部分添加与Nginx服务器中相同的自定义名称。
-
代理分为一级代理和多级代理,不同层级的代理有不同的配置
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://locahost;
proxy_http_version 1.1;
Proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr; # 针对一级代理
proxy_set_header X-Forwarded-For $http_x_forwarded_for; # 针对多级代理
}
11、开启 Nginx 文件缓存
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
12、开启 Nginx SSL 缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
13、隐藏除了 .well-known 以外的所有隐藏文件
location ~ /\.(?!well-known).* {
access_log off;
log_not_found off;
return 404;
}
14、隐藏 .git
location ~ /\.git {
access_log off;
log_not_found off;
return 404;
}
15、隐藏 .htaccess
location ~ /\.ht {
access_log off;
log_not_found off;
return 404;
}
16、设置强制 HTTPS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
17、从 @ 域跳转到 www 域,加上 www
server {
listen 80;
server_name example.org;
return 301 $scheme://www.example.org$request_uri;
}
server {
listen 80;
server_name www.example.org;
...
}
18、从 www 域跳转至 @域,去除 www
server {
listen 80;
server_name www.domain.com;
return 301 $scheme://domain.com$request_uri;
}
server {
listen 80;
server_name domain.com;
# nginx config for virtualhost goes here
}
19、设置 Edge 使用最新的 IE 内核渲染
add_header "X-UA-Compatible" "ie=edge";
20、设置内容过期时间
add_header Cache-Control "max-age=31536000, immutable";
21、移除结尾多余的 /
if ($request_uri ~ "^[^?]*?//") {
return 301 $scheme://$host$uri$is_args$args;
}
22、为不含 / 结尾的 URL 加上 /
if ($uri !~ "\.[a-z0-9]{2,4}$") {
rewrite "[^/]$" $scheme://$host$uri/ permanent;
}