nginx相关总结

nginx相关

nginx概述

Nginx(“engine x”)是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用Nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。官网地址:http://nginx.org/

nginx安装

1、安装依赖

yum install -y gcc gcc-c++ make libtool wget pcre pcre-devel zlib zlib-devel openssl openssl-devel

2、nginx下载

wget http://nginx.org/download/nginx-1.23.0.tar.gz

3、nginx解压

tar -zxvf nginx-1.23.0.tar.gz

4、nginx安装

./configure (如果需要安装ssl模块则执行 ./configure --with-http_ssl_module)

make && make install

nginx命令

普通启动服务:/usr/local/nginx/sbin/nginx

配置文件启动:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

  • 暴力停止服务:/usr/local/nginx/sbin/nginx -s stop
  • 优雅停止服务:/usr/local/nginx/sbin/nginx -s quit
  • 检查配置文件:/usr/local/nginx/sbin/nginx -t
  • 重新加载配置:/usr/local/nginx/sbin/nginx -s reload
  • 查看相关进程:ps -ef | grep nginx

nginx.conf相关说明

#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    #常见的一些基础配置
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓冲
    client_max_body_size 8m; #设定请求缓冲
    sendfile on; #开启高效文件传输模式,对于普通应用设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
    keepalive_timeout 120; #长连接超时时间,单位是秒

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。
    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模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区
    gzip_http_version 1.1; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型
    gzip_vary on; #增加响应头'Vary: Accept-Encoding'
    limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

    # HTTPS server
  
    server {
        listen       443 ssl;
        server_name  localhost;
        ssl_certificate      /opt/key/thunisoft-tap.pem;
        ssl_certificate_key  /opt/key/thunisoft-tap.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location / {
            root html; #root是配置服务器的默认网站根目录位置,默认为Nginx安装主目录下的html目录
            index index.html index.htm; #配置首页文件的名称
            proxy_pass http://127.0.0.1:88; #反向代理的地址
            proxy_redirect off; #是否开启重定向
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            #以下是一些反向代理的配置,可选。
            client_max_body_size 10m; #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k; #设置代理服务器(Nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
            proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;  #设定缓存文件夹大小
       }
    }
}

location使用说明

Nginx的location指令用于匹配客户端请求的URL,并定义如何处理匹配到的请求。location指令可以使用以下三种不同的方式进行匹配:

  1. 精确匹配:使用=前缀,例如location = /index.html,只有当客户端请求的URL为/index.html时才会匹配。
  2. 前缀匹配:不使用任何前缀,例如location /images/,当客户端请求的URL以/images/开头时会匹配。
  3. 正则匹配:使用前缀(区分大小写,*区分大小写),例如location ~ \.(gif|jpg|jpeg)$,当客户端请求的URL以.gif、.jpg或.jpeg结尾时会匹配。

对于正则匹配,还可以使用~* 前缀进行不区分大小写的匹配,例如location ~* \.png$,当客户端请求的URL以.png或.PNG结尾时会匹配。

下面附正则相关规则

特殊字符

特别字符描述
$匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 $。
( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
*匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。
.匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。
[标记一个中括号表达式的开始。要匹配 [,请使用 [。
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。
\将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。‘\n’ 匹配换行符。序列 ‘\’ 匹配 “”,而 ‘(’ 则匹配 “(”。
^匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 ^。
{标记限定符表达式的开始。要匹配 {,请使用 {。
|指明两项之间的一个选择。要匹配 |,请使用 |。

限定符

字符描述
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于 {0,}。
+匹配前面的子表达式一次或多次。例如,zo+ 能匹配 “zo” 以及 "zoo",但不能匹配 “z”。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 “do”“does”“doxy” 中的 “do”“does”。? 等价于 {0,1}
{n}n 是一个非负整数。匹配确定的 n 次。例如,o{2} 不能匹配 “Bob” 中的 o,但是能匹配 “food” 中的两个 o
{n,}n 是一个非负整数。至少匹配n 次。例如,o{2,} 不能匹配 “Bob” 中的 o,但能匹配 “foooood” 中的所有 o。o{1,} 等价于 o+。o{0,} 则等价于 o*。
{n,m}m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,o{1,3} 将匹配 “fooooood” 中的前三个 o。o{0,1} 等价于 o?。请注意在逗号和两个数之间不能有空格。

nginx负载均衡

负载均衡策略有六种

1、轮询,这种的默认的负载均衡策略

2、weight加权(加权轮询策略)

3、ip_hash (根据请求ip进行hash计算分配)

4、least_conn (最少连接,把请求转发给连接数较少的后端服务器。轮询算法是把请求平均地转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。)

5、url_hash (按访问url的hash结果来分配请求)

6、fair (根据页面大小、加载时间长短智能地进行负载均衡,nginx需要使用第三方模块)

##nginx负载均衡配置
#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    .....
	# 代理服务器,默认是轮询的方式
	# 设置服务器组
	upstream backend {
		ip_hash ;##这种是ip hash分配
		least_conn;##这种是最少连接分配
		hash $request_uri; ##这种是urlhash分配
		server localhost:9001 weight=10;  ##weight是加权轮询,数值越大分配到的概率越高
		server localhost:9002;
		server localhost:9003;
	}
	server {
		listen 8080;
		server_name localhost;
		location / {
			# backend 就是服务器组的名称
			proxy_pass http://backend/;
		}
	}
}

nginx动静分离

root

server {
        listen       8081;
        server_name  localhost;
        location /foo {
      			root  /opt/;
            	autoindex on;	
           }
        }

例如:如果输入http://ip:port/foo/test/xxx.html,则会返回nginx服务器上的/opt/foo/test/xxx.html文件

root最后实际文件的地址是url中从匹配到的部分(包含匹配到的部分)开始到结束,拼上root的内容,例如:本例中root部分是/opt/,url中匹配到的部分是/foo/test/xxx.html,则拼起来是/opt/foo/test/xxx.html。

alias

server {
        listen       8081;
        server_name  localhost;
        location /foo {
      			alias  /opt;
            	autoindex on;	
           }
        }

例如:如果输入的是http://ip:port/foo/test/xxx.html,则会返回nginx服务器上的/opt/test/xxx.html文件,和root比较文件在服务器上的路径少了foo部分。

alias最后实际文件的地址是url中从匹配到的部分(不包含匹配到的部分)开始到结束,拼上alias的内容,例如:本例中alias部分是/opt/,url中匹配到的部分是/test/xxx.html,则拼起来是/opt/test/xxx.html。

alias还有一种用法

server {
        listen       8081;
        server_name  localhost;
        location ~* ^/foo/file/s3(.*):(.*)$ {
      		alias  /opt/minio/data/$2;
            autoindex on; 	
        } 
   }

例如:如果输入http://ip:port/foo/file/s3woshi:ceshi.html,则最终返回nginx服务器上的/opt/minio/data/ceshi.html。

nginx反向代理https

1、自制ssl签名证书

执行命令,当前路径下生成test.keystore、test.cer两个文件(-ext san=ip:很重要,不然被其他服务访问时报 报错1【最开始验证是以为是可选的,就没加】,)

keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 36000 -alias test -keystore test.keystore -dname "CN=test, OU=thunisoft-tap, O=test, L=BJ, ST=BJ, C=CN" -keypass 123456 -storepass 123456 -ext san=ip:172.23.22.98

keytool -exportcert -alias test -keystore test.keystore -file test.cer -keypass 123456 -storepass 123456 -rfc

将包中的CoverToPfx.class文件放到上步的test.keystore同级目录,执行命令,生成test.pfx

java CoverToPfx test.pfx  test.keystore  123456
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.util.Enumeration;
public class ConventPFX {
    public static String PFX_KEYSTORE_FILE = "test.pfx";
    public static String KEYSTORE_PASSWORD = "123456";
    public static String JKS_KEYSTORE_FILE = "test.keystore";
    public static void coverTokeyStore() {
        try {
            KeyStore inputKeyStore = KeyStore.getInstance("PKCS12");
            FileInputStream fis = new FileInputStream(PFX_KEYSTORE_FILE);
            char[] nPassword = null;
            if ((KEYSTORE_PASSWORD == null)
                    || KEYSTORE_PASSWORD.trim().equals("")) {
                nPassword = null;
            } else {
                nPassword = KEYSTORE_PASSWORD.toCharArray();
            }
            inputKeyStore.load(fis, nPassword);
            fis.close();
            KeyStore outputKeyStore = KeyStore.getInstance("JKS");
            outputKeyStore.load(null, KEYSTORE_PASSWORD.toCharArray());
            Enumeration enums = inputKeyStore.aliases();
            while (enums.hasMoreElements()) { // we are readin just one
                // certificate.
                String keyAlias = (String) enums.nextElement();
                System.out.println("alias=[" + keyAlias + "]");
                if (inputKeyStore.isKeyEntry(keyAlias)) {
                    Key key = inputKeyStore.getKey(keyAlias, nPassword);
                    Certificate[] certChain = inputKeyStore
                            .getCertificateChain(keyAlias);
                    outputKeyStore.setKeyEntry(keyAlias, key, KEYSTORE_PASSWORD
                            .toCharArray(), certChain);
                }
            }
            FileOutputStream out = new FileOutputStream(JKS_KEYSTORE_FILE);
            outputKeyStore.store(out, nPassword);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void coverToPfx() {
        try {
            KeyStore inputKeyStore = KeyStore.getInstance("JKS");
            FileInputStream fis = new FileInputStream(JKS_KEYSTORE_FILE);
            char[] nPassword = null;
            if ((KEYSTORE_PASSWORD == null)
                    || KEYSTORE_PASSWORD.trim().equals("")) {
                nPassword = null;
            } else {
                nPassword = KEYSTORE_PASSWORD.toCharArray();
            }
            inputKeyStore.load(fis, nPassword);
            fis.close();
            KeyStore outputKeyStore = KeyStore.getInstance("PKCS12");
            outputKeyStore.load(null, KEYSTORE_PASSWORD.toCharArray());
            Enumeration enums = inputKeyStore.aliases();
            while (enums.hasMoreElements()) { // we are readin just one
                // certificate.
                String keyAlias = (String) enums.nextElement();
                System.out.println("alias=[" + keyAlias + "]");
                if (inputKeyStore.isKeyEntry(keyAlias)) {
                    Key key = inputKeyStore.getKey(keyAlias, nPassword);
                    Certificate[] certChain = inputKeyStore
                            .getCertificateChain(keyAlias);
                    outputKeyStore.setKeyEntry(keyAlias, key, KEYSTORE_PASSWORD
                            .toCharArray(), certChain);
                }
            }
            FileOutputStream out = new FileOutputStream(PFX_KEYSTORE_FILE);
            outputKeyStore.store(out, nPassword);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        PFX_KEYSTORE_FILE = args[0];
        JKS_KEYSTORE_FILE = args[1];
        KEYSTORE_PASSWORD = args[2];
        coverToPfx(); //jks to pfx
        //coverTokeyStore();    // pfx to jks
    }
}

执行命令,生成test.pem,(需要输入密码123456)

openssl pkcs12 -in test.pfx -out test.pem -nodes

执行命令,生成test.key

openssl pkey -in test.pem -out test.key

2、nginx安装ssl模块

./configure --with-http_ssl_module

3、配置nginx.conf文件

#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       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  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    # HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  localhost;
        ssl_certificate      /opt/key/test.pem;  ##证书位置
        ssl_certificate_key  /opt/key/test.key;  ##证书位置
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
       	ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location / {
            root   html;
            index  index.html index.htm;
       }
    }
}
  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值