Nginx
nginx功能:
静态的 web 资源服务器 html,图片, js, css, txt等静态资源
http/https 协议的反向代理
结合 FastCGI /uWSGI /SCGl 等协议反向代理动态资源请求
tcp/udp协议的请求转发(反向代理)
#编译安装Nginx
yum -y install gcc pcre-devel openssl-devel zlib-devel
tar xf nginx-1.18.0.tar.gz
cd nginx-1.18.0/
useradd -r -s /sbin/nologin nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx -v
#nginx正常配置
user nginx nginx;
worker_processes auto;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
multi_accept off;
accept_mutex off;
}
http {
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
sendfile_max_chunk 512k;
tcp_nopush on;
keepalive_timeout 65;
tcp_nodelay on;
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 256k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
server_tokens off;
access_log off;
server {
listen 80 default_server reuseport;
server_name _;
# location / { #访问路径
# root /home/jjy/html/;
# index index.html index.htm;
# }
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
location /nginx_status
{
stub_status on;
access_log off;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ ^/(images|img|javascript|js|css|flash|media|static)/
{
root /home/jjy/html/;
autoindex on;
access_log off;
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /.well-known {
allow all;
}
location ~ /\.
{
deny all;
}
access_log /home/nginxlog/access.log;
}
include vhost/*.conf; #可以创建vhost文件写入.conf
}
代理
server {
listen 80;
server_name jjy.com;
keepalive_timeout 60;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_hide_header Etag;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
#proxy_next_upstream error timeout http_500 http_503;
location / {
proxy_pass http://192.168.11.11:8080;
}
}
地址重写
server {
listen 80;
server_name crm.dcmstest.mid.henglu-sh.com;
keepalive_timeout 60;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_hide_header Etag;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
#proxy_next_upstream error timeout http_500 http_503;
location /jj/asd/ {
proxy_pass http://192.168.11.13:1111;
rewrite ^/jj/asd/(.*) /$1 break;
}
}
轮询
#http字段中添加
upstream register-center {
server 192.168.11.11:8080;
server 192.168.11.11:8081;
}
server {
listen 80 default_server reuseport;
server_name _;
location /register-center {
proxy_pass http://register-center;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #加这行可以在范文日志中查看到源ip
}
如果访问js文件访问不到可使用
server {
listen 80;
listen [::]:80;
server_name jjy.com;
root /home/jjy/;
location / {
if ($request_filename ~* .*\.(?:htm|html)$){
add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
}
index index.html index.htm;
try_files $uri /index.html;
}
error_page 500 502 503 504 /50x.html;
}
跨域问题
location / {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE' always;
add_header 'Access-Control-Allow-Headers' '*' always;
add_header 'Access-Control-Max-Age' 1728000 always;
add_header 'Content-Length' 0;
add_header 'Content-Type' 'text/plain; charset=utf-8';
return 204;
}
if ($request_method ~* '(GET|POST|DELETE|PUT)') {
add_header 'Access-Control-Allow-Origin' '*' always;
}
proxy_pass http://127.0.0.1:1111;
}
添加密码访问
yum install -y httpd-tools
mkdir -p /usr/local/nginx/src/
htpasswd -c /usr/local/nginx/src/passwd jjy
New password: ##输入密码
#可以查看当前生成内容
cat /usr/local/nginx/src/passwd
#修改nginx配置文件
server {
listen 80;
..............
auth_basic "Please input password";
auth_basic_user_file /usr/local/nginx/src/passwd;
location /{
............
}
nginx -s reload
Nginx优化
访问状态统计
Nginx 内置了 HTTP_STUB_STATUS 状态统计模块, 用来反馈当前的 Web访问情况。配置编译参数时可添加–with-http_stub_status_module 来启用此模块支持
修改 nginx.conf 配置文件, 指定访问位置并添加 stub_status 配置代码
server {
location / {
root html;
index index.html index.php;
}
location /status { #访问位置为/status
stub_status on; #打开状态统计功能
access_log off; #关闭此位置的日志记录
}
}
配置完成后登录web查看访问状态: 192.168.11.11/status
基于客户端的访问控制规则
deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。
示例:
vim /usr/local/nginx/conf/nginx.conf
server {
location / { #在此配置字段添加
deny 192.168.11.1; //客户端 IP
allow all;
}
隐藏版本号
vim /usr/local/nginx/conf/nginx.conf
http {
server_tokens off; #关闭版本号
}
修改用户组
主进程由 root 创建, 子进程由指定的用户与组创建。 Nginx默认使用 nobody 用户帐号与组帐号, 一般也要进行修改
vim /usr/local/nginx/conf/nginx.conf
user nginx nginx; //修改用户为 nginx ,组为 nginx
配置网页缓存
修改 Nginx 的配置文件, 在新 location 段加入 expires 参数, 指定缓存的时间, 1d表示一天。
vim /usr/local/nginx/conf/nginx.conf
添加 location
location ~ .(gif|jpg|jepg|png|bmp|ico)$ {
root html; #t下
expires 1d; #指定缓存时间,r下
}
日志切割
Nginx 没有类似 Apache 的 cronlog 日志分割处理功能, 但是可以通过Nginx 的信号控制功能脚本来实现日志的自动切割, 并将脚本加入到Linux 的计划任务中, 让脚本在每天的固定时间执行, 便可实现日志切割功能。
vim /opt/jjy.sh
#!/bin/bash
d=$(date -d “-1 day” “+%Y%m%d”)
logs_path=”/var/log/nginx”
pid_path=”/usr/local/nginx/logs/nginx.pid”
[ -d $logs_path ] || mkdir -p $logs_path
mv /usr/local/nginx/logs/access.log
${logs_path}/test.com-access.log-$d
#移动并重命名日志文件
kill -USR1 $(cat $pid_path)
#重建新日志文件
find $logs_path -mtime +30 | xargs rm -f
#删除 30 天之前的日志文件
chmod +x /opt/fenge.sh
配置计划任务
crontab -e
5 0 * * * /opt/fenge.sh &>/dev/null
6.设置连接超时
在企业网站中, 为了避免同一个客户长时间占用连接, 造成资源浪费, 可设置相应的连接超时参数, 实现控制连接访问时间。可以修改配置文件nginx.conf, 设置 keepalive_timeout 超时时间。
vim /usr/local/nginx/conf/nginx.conf
http {
keepalive_timeout 65 180;
#默认是 65 秒,设置超时是 180 秒
client_header_timeout 80;
#等待客户端发送请求头的超时时间
client_body_timeout 80;
#请求体读超时时间
}
配置网页压缩
Nginx 的 ngx_http_gzip_module 压缩模块提供了对文件内容压缩的功能,允许 Nginx服务器将输出内容发送到客户端之前进行压缩, 以节约网站的带宽, 提升用户的访问体验。
gzip on:开启 gzip 压缩输出;
gzip_min_length 1k: 用于设置允许压缩的页面最小字节数;
gzip_buffers 4 16k: 表示申请 4 个单位为 16k 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果;
gzip_http_version 1.0: 用于设置识别 http 协议版本,默认是 1.1,目前大部分浏览器已经支持 gzip 解压,但处理最慢,也比较消耗服务器CPU 资源;
gzip_comp_level 2: 用来指定 gzip 压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理速度最慢,使用默认即可;
gzip_types text/plain: 压缩类型,是对哪些网页文档启用压缩功能;
gzip_vary on: 选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面。
vim /usr/local/nginx/conf/nginx.conf
gzip on;
gzip_buffers 4 64k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_min_length 1k;
gzip_vary on;
gzip_types text/*;
配置防盗链
vim /usr/local/nginx/conf/nginx.conf
location ~* .(jpg|gif|swf)$ {
valid_referers none blocked *.jjy.com jjy.com; #t下
if ($invalid_referer) { #v下
rewrite ^/ http://www.aaa.com/error.ico; #$下
}
}
~* .(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg或.gif 或.swf 结尾的文件
valid_referers: 设置信任的网站,可以正常使用图片。
none :浏览器中 referer 为空的情况,就是直接在浏览器访问图片。
blocked :referer 不为空的情况 ,但是值被代理或防火墙删除了,这些值不以 http:// 或https:// 开头。
后面的网址或者域名:referer 中包含相关字符串的网址。
If 语句:如果链接的来源域名不在 valid_referers 所列出的列表中,$invalid_referer 为1,则执行后面的操作,即进行重写或返回 403 页面