Nginx安装及常用配置

一、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配置负载均衡
  1. 配置说明
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之后的版本才有这个配置。
  1. 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也会将新的请求分配给它。
	}
}
  1. 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. 方案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;
			}
		}
		...
}
  1. 方案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 设置访问验证
  1. 验证账户密码及安全验证文件
$ yum install -y httpd
$ which htpasswd
$ htpasswd -bc htpasswd admin 123456
  1. 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值