nginx是反向代理服务器
正向代理:指为客户端做代理,隐藏客户的真实ip等信息;
反向代理:为服务端做代理,隐藏服务器的真实ip等信息;
1. 设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为nobody
user root;
2. worker进程工作数设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行
worker_processes 1;
3. nginx 日志级别debug | info | notice | warn | error | crit | alert | emerg,错误级别从左到右越来越大
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
4. 设置nginx进程 pid
pid logs/nginx.pid;
5. 设置工作模式
events {
# 默认使用epoll
use epoll;
# 每个worker允许连接的客户端最大连接数
worker_connections 10240;
}
6. http 是指令块,针对http网络传输的一些指令配置
http {
}
========================以下都是 http 指令块内的内容==========================
7. include 引入外部配置,提高可读性,避免单个配置文件过大
include mime.types;
8. 设定日志格式,main为定义的格式名称,如此 access_log 就可以直接使用这个变量了
9. sendfile使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,提高了效率。
sendfile on;
tcp_nopush on;
10. keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。
#keepalive_timeout 0;
keepalive_timeout 65;
11. gzip启用压缩,html/js/css压缩后传输会更快
gzip on;
12. server可以在http指令块中设置多个虚拟主机
- listen 监听端口
- server_name localhost、ip、域名
- location 请求路由映射,匹配拦截
- root 请求位置
- index 首页设置
server {
listen 88;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
13. server 中的 root与alias
假如服务器路径为:/home/didiok/files/img/face.png
- root 路径完全匹配访问,配置的时候为
location /didiok {
root /home
}
用户访问的时候请求为:url:port/didiok/files/img/face.png
- alias 可以为你的路径做一个别名,对用户透明 ,配置的时候为:
-
location /hello { alias /home/didiok }
用户访问的时候请求为:url:port/hello/files/img/face.png,如此相当于为目录 didiok 做一个自定义的别名。
14. location的匹配规则
◆ 空格:默认匹配——普通匹配
location / {
root /home;
}
◆ =:精确匹配
location = /didiok/img/face1.png {
root /home;
}
◆ ~*:匹配正则表达式,不区分大小写
#符合图片的显示
location ~* .(GIF|jpg|png|jpeg) {
root /home;
}
◆ ~:匹配正则表达式,区分大小写
#GIF必须大写才能匹配到
location ~ .(GIF|jpg|png|jpeg) {
root /home;
}
◆ ^:以某个字符路径开头
location ^~ /imooc/img {
root /home;
}
15. Nginx跨域配置支持
#允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;
如果上面的配置失败的话,可以试试下面的配置:
upstream api.didiok.com {
server 192.168.1.172:8088;
}
server {
listen 80;
server_name api.didiok.com;
#允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' $http_origin;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;
location / {
if ($request_method = 'OPTIONS'){
add_header Access-Control-Allow-Origin $http_origin always;
add_header Access-Control-Allow-Credentials true always;
add_header Access-Control-Allow-Methods * always;
add_header Access-Control-Allow-Headers 'Authorization,X-Requested-With,Content-Type,Origin,Accept,headerUserId' always;
add_header Access-Control-Max-Age 3600;
add_header Content-length 0;
return 200;
}
proxy_pass http://api.didiok.com;
}
}
16. nginx配置静态资源防盗链
#对源站点验证
valid_referers *.imooc.com;
#非法引入会进入下方判断
if ($invalid_referer) {
return 404;
}
17. upstream 指令参数
(1)max_conns : 限制最大连接数,限制每台server的连接数,用于保护避免过载,可起到限流作用
# worker进程设置1个,便于测试观察成功的连接数
worker_processes 1;
upstream tomcats {
server 192.168.1.173:8080 max_conns=2;
server 192.168.1.174:8080 max_conns=2;
server 192.168.1.175:8080 max_conns=2;
}
(2)slow_start(商业版本能使用,需要付费):缓慢的启动,慢慢加入到集群,会在配置的时间内将权重慢慢升级到配置的权重值,必须要使用在集群里面,必须要和权重一起使用
upstream tomcats {
server 192.168.1.173:8080 weight=6 slow_start=60s;
# server 192.168.1.190:8080;
server 192.168.1.174:8080 weight=2;
server 192.168.1.175:8080 weight=2;
}
-
该参数不能使用在hash和random load balancing中
-
如果在upstream中只有一台server,则该参数失效。
(3)upstream指令参数 down和backup
down:用于标记服务节点不可用
upstream tomcats {
server 192.168.1.173:8080 down;
# server 192.168.1.190:8080;
server 192.168.1.174:8080 weight=1;
server 192.168.1.175:8080 weight=1;
}
backup:表示当前服务器节点是备用机,只有在其他的服务器都宕机以后,自己才会加入到集群中,被用户访问到
upstream tomcats {
server 192.168.1.173:8080 backup;
# server 192.168.1.190:8080;
server 192.168.1.174:8080 weight=1;
server 192.168.1.175:8080 weight=1;
}
- backup参数不能使用在hash和random load balancing中。
(4)upstream指令参数 max_fails、fail_timeout
max_fails:表示失败几次,则标记server已宕机,剔出上游服务。
fail_timeout: 表示失败的重试时间。
max_fails=2 fail_timeout=15s
- 上面的设置表示:在15秒内请求某一server失败达到2次后,则认为该server已经挂了或者宕机了,随后再过15秒,这15秒内不会有新的请求到达刚刚挂掉的节点上,而是会请求到正常运作的server,15秒后会再有新请求尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复。
18. keepalive用于设置长连接数量,可以提高服务器的吞吐量
keepalive: 设置长连接处理的数量
proxy_http_version:设置长连接http版本为1.1
proxy_set_header:清除connection header 信息
upstream tomcats {
# server 192.168.1.173:8080 max_fails=2 fail_timeout=1s;
server 192.168.1.190:8080;
# server 192.168.1.174:8080 weight=1;
# server 192.168.1.175:8080 weight=1;
keepalive 32;
}
server {
listen 80;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
19. 负载均衡
(1)ip_hash
ip_hash 可以保证用户访问可以请求到上游服务中的固定的服务器,前提是用户ip没有发生更改。
使用ip_hash的注意点:
不能把后台服务器直接移除,只能标记down
upstream tomcats {
ip_hash;
server 192.168.1.173:8080;
server 192.168.1.174:8080 down;
server 192.168.1.175:8080;
}
-
ip_hash 的哈希算法只计算ip地址的前三段,例如:用户172.16.109.132访问服务器时哈希算法只计算172.16.109,所以IP地址前三段相同的用户会被指向同一个服务器。
-
由于ip_hash算法会将同一个用户的请求指向同一个服务器,所以如果用户发起的大量破坏性的请求的话,可能造成一个服务器负载过重。
-
如果要一处nginx中的服务器,标记为down,可以保留当前的用户ip的哈希算法。
(2)url_hash与least_conn
url_hash:根据每次请求的url地址,hash后访问到固定的服务器节点。
upstream tomcats {
# url hash
hash $request_uri;
# 最少连接数
# least_conn
server 192.168.1.173:8080;
server 192.168.1.174:8080;
server 192.168.1.175:8080;
}
server {
listen 80;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
}
}
(3)一致性哈希算法
根据服务器的ip或者主机名进行hash,使服务器分布在0~2^32-1的圆环上。
采用顺时针就近原则,用户会落到hash算法值后最近的节点;
当有服务器宕机(减少)或增加后,其余大部分的用户不会有变动,而离宕机服务器或者新增服务器 节点 (hash算法值)更接近的用户才会有影响(这样保证了大部分用户请求服务器节点的稳定性)
20. Nginx缓存
(1)浏览器缓存
加速用户访问,提升单个用户(浏览器访问者)体验,缓存在浏览器本地。
location /files {
alias /home/didiok;
# expires 10s;
# expires @22h30m;
# expires -1h;
# expires epoch;
# expires off;
expires max;
}
(2)Nginx的反向代理缓存
上游服务器静态资源缓存到nginx,比如有一台tomcat静态资源服务器,在Nginx中设置了缓存之后,会把从tomcat静态资源服务器请求到的静态资源缓存到Nginx,并且可以设置静态资源的缓存时间
# proxy_cache_path 设置缓存目录
# keys_zone 设置共享内存以及占用空间大小
# max_size 设置缓存大小
# inactive 超过此时间则被清理
# use_temp_path 临时目录,使用后会影响nginx性能
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=1m use_temp_path=off;
location / {
proxy_pass http://tomcats;
# 启用缓存,和keys_zone一致
proxy_cache mycache;
# 针对200和304状态码缓存时间为8小时
proxy_cache_valid 200 304 8h;
}
21. 使用nginx配置 Https域名证书
(1)安装SSL模块
- 要在nginx中配置https,就必须安装ssl模块,也就是: http_ssl_module;
- 进入到nginx的解压目录: /home/software/nginx-1.16.1;
- 新增ssl模块(原来的那些模块需要保留)
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_ssl_module
- 编译和安装
make && make install
(2)配置HTTPS
- 把ssl证书 *.crt 和 私钥 *.key 拷贝到 /usr/local/nginx/conf 目录中。
- 新增 server 监听 443 端口:
server {
listen 443;
server_name www.didiok.com;
# 开启ssl
ssl on;
# 配置ssl证书
ssl_certificate 1_www.didiok.com_bundle.crt;
# 配置证书秘钥
ssl_certificate_key 2_www.didiok.com.key;
# ssl会话cache
ssl_session_cache shared:SSL:1m;
# ssl会话超时时间
ssl_session_timeout 5m;
# 配置加密套件,写法遵循 openssl 标准
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://tomcats/;
index index.html index.htm;
}
}
(3)reload Nginx
./nginx -s reload
腾讯云Nginx配置https文档地址:SSL 证书 Nginx 服务器 SSL 证书安装部署-证书安装-文档中心-腾讯云