邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

centos7下安装gitlab并修改访问端口
centos7下安装gitlab并修改访问端口

官网安装说明
https://about.gitlab.com/install/#centos-7

1.=======================
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld

2.=======================
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix

3.=======================
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
yum install -y gitlab-ee
gitlab-ctl reconfigure //如果没有启动gitlab再执行,我的没有启动

ps:这个时候就可以通过服务器的地址直接访问了,第一次进入需要修改密码,用户名root


4.=======启动/暂停/重启=======
gitlab-ctl start
gitlab-ctl stop
gitlab-ctl restart


5.=========修改端口=============

vim /etc/gitlab/gitlab.rb
external_url 'http://我的服务器地址:8081'
nginx['listen_port'] = 8081

vim /var/opt/gitlab/nginx/conf/gitlab-http.conf
listen *:8081;
server_name localhost;
if ($http_host = "") {
set $http_host_with_default "localhost:8081";
}
然后执行
gitlab-ctl restart 
nginx中fastcgi_param参数说明
fastcgi_param  QUERY_STRING       $query_string;  #请求的参数;如?app=123
fastcgi_param  REQUEST_METHOD     $request_method; #请求的动作(GET,POST)
fastcgi_param  CONTENT_TYPE       $content_type; #请求头中的Content-Type字段
fastcgi_param  CONTENT_LENGTH     $content_length; #请求头中的Content-length字段。

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; #脚本名称
fastcgi_param  REQUEST_URI        $request_uri; #请求的地址不带参数
fastcgi_param  DOCUMENT_URI       $document_uri; #与$uri相同。
fastcgi_param  DOCUMENT_ROOT      $document_root; #网站的根目录。在server配置中root指令中指定的值 
fastcgi_param  SERVER_PROTOCOL    $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1; #cgi 版本
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version; #nginx 版本号,可修改、隐藏

fastcgi_param  REMOTE_ADDR        $remote_addr; #客户端IP
fastcgi_param  REMOTE_PORT        $remote_port; #客户端端口
fastcgi_param  SERVER_ADDR        $server_addr; #服务器IP地址
fastcgi_param  SERVER_PORT        $server_port; #服务器端口
fastcgi_param  SERVER_NAME        $server_name; #服务器名,域名在server配置中指定的server_name

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
nginx负载均衡 - 根据url做一致性hash
nginx负载均衡 - 根据url做一致性hash

目标:按照指定的参数(如分类/商品编号)做一致性hash,从而保证相同数据到一台机器上

先说下nginx里$request_uri和$uri的区别
$request_uri
This variable is equal to the *original* request URI as received from the client including the args. It cannot be modified. Look at $uri for the post-rewrite/altered URI. Does not include host name. Example: "/foo/bar.php?arg=baz" 
这个变量等于从客户端发送来的原生请求URI,包括参数。它不可以进行修改。$uri变量反映的是重写后/改变的URI。不包括主机名。例如:"/foo/bar.php?arg=baz"
$uri
This variable is the current request URI, without any arguments (see $args for those). This variable will reflect any modifications done so far by internal redirects or the index module. Note this may be different from $request_uri, as $request_uri is what was originally sent by the browser before any such modifications. Does not include the protocol or host name. Example: /foo/bar.html 
这个变量指当前的请求URI,不包括任何参数(见$args)。这个变量反映任何内部重定向或index模块所做的修改。注意,这和$request_uri不同,因$request_uri是浏览器发起的不做任何修改的原生URI。不包括协议及主机名。例如:"/foo/bar.html"
 
$document_uri
The same as $uri. 
同$uri.

实现步骤
第一步:在nginx中做简单配置,先实现轮训,域名可以根据自己的来
server {
    listen       80;
    server_name  default www.test.com;
    location / {
        proxy_pass http://www_posts;
        index index.html index.htm;
    }
}

upstream www_posts {
    server 127.0.0.1:7001;
    server 127.0.0.1:7002;
    server 127.0.0.1:7003;
}

server {
    listen       7001;
    server_name  default www.test.com;
    location / {
        root   /data/www/post1/;
        index index.html index.htm;
    }
}
server {
    listen       7002;
    server_name  default www.test.com;
    location / {
        root   /data/www/post2/;
        index index.html index.htm;
    }
}
server {
    listen       7003;
    server_name  default www.test.com;
    location / {
        root   /data/www/post3/;
        index index.html index.htm;
    }
}

完成后 重启nginx

第二步创建程序文件
mkdir /data/www/post1; cd /data/www/post1;
vim 1.html //写入 1-1
vim 2.html //写入 1-2
vim 3.html //写入 1-3
mkdir /data/www/post2; cd /data/www/post2;
vim 1.html //写入 2-1
vim 2.html //写入 2-2
vim 3.html //写入 2-3
mkdir /data/www/post3; cd /data/www/post3;
vim 1.html //写入 3-1
vim 2.html //写入 4-2
vim 3.html //写入 3-3

通过浏览器访问 www.test.com/1.html,不断刷新,可分别出现1-1,2-1,3-1

第三步 自定义hash key

在server-location中加入
if ( $uri ~* "^\/(\d+).html$" ){ set $defurlkey $1; }
修改upstream,结果如下
upstream www_posts {
hash $defurlkey;
    server 127.0.0.1:7001;
    server 127.0.0.1:7002;
    server 127.0.0.1:7003;
}

可通过分别访问,测试结果
www.test.com/1.html
www.test.com/2.html
www.test.com/3.html


php+nginx+mysql+apache查看其编译参数
查看nginx编译参数:/usr/local/nginx/sbin/nginx -V

查看php编译参数:/usr/local/php/bin/php -i | grep configure

查看mysql编译参数:cat /usr/local/mysql/bin/mysqlbug | grep CONFIGURE_LINE //待纠正

查看apache编译参数:cat /usr/local/apache2/build/config.nice   //待认证
关于负载均衡
负载均衡的工作方式

1.http重定向
当http代理(比如浏览器)向web服务器请求某个url后,web服务器可以通过http响应信息中的location标记来返回一个新的url。这意味着http代理需要继续请求这个新的url,完成自动跳转。
缺点:吞吐率限制
优点:不需要额外的技术支持

2.dns负载均衡
dns负责提供域名解析服务,当访问某个站点时,实际上首先需要通过该站点域名的dns服务器来获取域名指向的ip地址,这一过程,dns服务器完成了域名到ip地址的映射,同样,这样映射也可以是一对多的,这个时候,dns服务器便充当了负载均衡调度器
dig google.cn 查看dns的配置
缺点:dns记录缓存更新不及时、策略的局限性、不能做健康检查
优点:可以寻找最近的服务器,加快请求速度
适用场景:多机房部署的时候


3.反向代理负载均衡
在用户的请求到达反向代理服务器时(已经到达网站机房),由反向代理服务器根据算法转发到具体的服务器。常用的apache,nginx都可以充当反向代理服务器。反向代理的调度器可以根据扮演的是用户和实际服务器中间人的角色。
工作在http层(七层)
缺点:代理服务器成为性能的瓶颈,特别是一次上传大文件
有点:配置简单、策略丰富、维持用户回话、可根据访问路径做转发。
适用场景:请求量不高的,简单负载均衡。后端较大的应用。

4.ip负载均衡
工作在传输层(四层)
通过操作系统内修改发送来的ip数据包,将数据包的目标地址修改为内部实际服务器地址,从而实现请求的转发,做到负载均衡。lvs的nat模式。
缺点:所有数据进出还是过负载机器,网络宽带成为瓶颈。
优点:内核完成转发,性能高。
使用场景:对性能要求高,但对宽带要求不高的应用。视频和下载等大宽带的应用,不适合使用。

5.数据链路层的负载均衡
工作在数据链路层(二层)
在请求到达负载均衡器后,通过配置所有集群机器的虚拟ip和负载均衡器相同,再通过修改请求的mac地址,从而做到请求的转发。与ip负载均衡不一样的是,在请求访问服务器 之后,直接返回客户。而无需经过负载均衡器。LVS DR(Direct Routing)模式。
缺点:配置复杂
优点:由集群机器直接返回,提高了出口宽带。
适用场景:大型网站使用最广的一种负载均衡方法



负载均衡中维护用户的session会话
1.把同一个用户在某一个会话中的请求,都分配到固定的某一台服务器上去,常见的负载均衡算法有ip_hash法。
2.session数据集中存储。session数据集中存储就是利用数据库或者缓存来存储session数据,实现了session和应用服务器的解耦。
3.使用cookie代替session。


负载均衡常见的策略
1.轮询
能力比较弱的服务器导致能力较弱的服务器最先超载

2.加权轮询
这种算法解决了简单轮训调度算法的缺点:传入的请求按照顺序被分配到集群中服务器,但是会考虑提前为每台服务器分配的权重。

3.最少连接数
根据后端服务器当前的连接数情况,动态的选取其中当前积压连接数量最少的一台服务器处理当前的请求,尽可能的提高后端服务的利用效率,将请求合理的分流到每一台服务器

4.加权最少连接数

5.源ip_hash
这种方式通过生成请求源ip的哈希值,并通过这个hash值来找到正确的真实服务器,这意味着对于同一主机来说他对应的服务器总是相同。

6.随机
通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问,实际效果接近轮询的结果。


温习memcache

memcached 启动参数

memcached -m 64 -vv

-d 守护进程
-p 指定端口号 默认 11211
-m 指定最大使用内存大小 默认 64m
-t 线程数 默认4
-l 连接的ip地址 ,默认是本机
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数 默认 1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags 默认是48
-vv 详细信息 还打印客户端命令/响应
-I 重写每个数据页尺寸。调整数据项最大尺寸
-R 
通过限制某个连接可以连接提交的命令数,以避免其他连接等待时间过久。某连接提交的命令数一旦达到该阀值,服务器将暂时拒绝其后续的请求,则优先处理其他连接的请求。该限制默认是20,即每个连接可以提交的命令数

-B 绑定协议,ascii,binary,auto (default)


php扩展 memcached memcache
memcached 拥有更多的方法和支持,支持二进制协议,在性能方面更好。 Memcached::setOption


每个chunk size 大小80字节,共有13107个chunk (1024*1024/80=13107)。等于1MB,即1个page
数据存入时,会按照大小分配到不同的chunk中。50字节的数据,会放到 slab class1 中的chunk,浪费30字节

内存分配方式
-m 参数指定预留的内存空间总大小
切分成若干个页(page),默认每页1M,分配给slab class
不同的slab class 中再切割成不同大小的chunk
page被分配到 slab class 后,page就不再移动
每个 slab class 就像一个缓存系统。有自己的lru。



统计命令
stats
进程信息、连接数、请求数、网络流量、LRU
stats slabs
显示各个slab的信息,包括chunk的大小、数目、使用情况等
stats items
显示各个slab中item的数目,及最老item最后一次访问距离现在的秒数等
stats setting
显示进程启动的参数信息


Memcached添加item的逻辑
计算item的大小,选取合适的slab class。如果其对应的slab class为申请过page,则申请一个page的内存,并将该item存入其中一个chunk当中。即便达到预设的内存限制,也会申请一个page内存空间。

如果其对应的slab class出现过,则在该范围的page当中优先选择过期或被删除的chunk进行存储,其次选择未使用过的。

如果其对应的slab class出现过,但是其所属的所有page都已经存储满了,那么会申请一个新的page,这个page被等分为N个规定大小的chunk,存储到第一个chunk。

如果其对应的slab class出现过,但是其所属的所有page都已经存储满,并且memcached已不能再分配新的内存空间。将根据LRU算法(近期最少使用的),清除某个item并将新项存储到该位置。


http的request和response介绍
http请求
http request

1.request line
GET   /dir/1.html      HTTP/1.1
请求方法  资源位置 协议版本

2.HTTP HEADERS
通用header 请求header 实体 header

3.Content


request method
HTTP/1.1规范中的8个请求方法
1.GET      url长度有限制
2.POST 
3.HEAD
4.PUT  //201
5.DELETE
6.TRACE
7.OPTIONS
8.CONNECT



request headers
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
参数为 Content Type
q指定优先级[0-1],为不接受,默认为1
如果不指定*/*,则其他类型优先级为0

Accept-Encoding: gzip, deflate 

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

Authorization:
Basic
%%%%%%%%%%%%%%%%%

401 Unauthorized

Cookie:
version=1;skin=new;


Cache-Control: 
max-age=0

Host:
www.xingdong365.com

If-Match:
"aetaghdsfsdaf"

If-Modified-Since:
Sun,11 May 2018 08:30:44 GMT

If-None-Match:
"aetaghdsfsdaf"

If-Range:
"aetaghdsfsdaf"

If-Unmodified-Since:
Sun,11 May 2018 08:30:44 GMT

Referer:
http://xingdong365.com

Range:
bytes=0-499,1000-

Upgrade:
HTTP/2.0

Via:
192.168.0.26,example.com

X-Requested-With: //是否是ajax请求
XMLHttpRequest  

X-Forwarded-For:  //代理服务器转发
client1,proxy1,192.168.0.128



http response 

1.Status line
HTTP/1.1 200 OK

100-199:参考信息
200-299:成功
300-399:重定向
400-499:客户端错误
500-599:服务器错误

200 OK 一切ok
GET /index.html HTTP/1.1

201 Created 已创建 通常伴随 Location Header 返回 
PUT /a-new-doc.html HTTP/1.1

206 Partial Content 片段内容 
GET /large.zip HTTP/1.1
Range:bytes0-500

301 Moved Permanently 永久重定向 已永久移动到其他位置,配合location使用
seo适用,无结尾/请求目录时也会自动产生此响应
GET /beauty HTTP/1.1

302 Found 找到了 临时跳转
按HTTP规范,客户端此时应使用和导致产生此响应的请求方法 同样的方法再次请求Location指定位置的资源
在实践中,绝大多数浏览器都一律使用get请求location中指定的资源

304 Not Modified 未修改,无变动(用缓存中的)
Date:..........
ETag:"........"
GET /beauty HTTP/1.1
If-None-Match:"......."
If-Modified-Since:............

400 Bad Request 请求错误 打开的方式不对
401 Unauthorized 未被授权 浏览器收到此响应弹出一个输入用户名 密码的对话框
403 Forbidden 禁止访问
404 not found
405 Method not Allowed  
访问方法不对 服务器禁止以所请求的方法访问,同时一般会通过allow告知允许的方法 
Allow:GET,POST
406 Not Acceptable 无法接受
当请求中的accept系列header中列出的条件无法满足时,会产生此响应
GET / HTTP/1.1
Accept:application/json
408 Request timeout 请求超时 服务器一直没遇到 connection:close 会产生此响应并关闭连接

500 Internal Server Error 服务器错误
502 Bad Gateway 网关错误 代理服务器从上游服务器收到一个无效响应时,会给客户端返回此响应
503 service Unavailable 服务暂时不可用
504 Gateway Timeout 网关超时。代理服务器无法在限定时间内从上游服务器收到一个响应 


2.HTTP headers
通用header 响应header 实体header

ETag:"aetaghdsfsdaf"
Location:http://xingdong365.com
Refresh:3;url=http://xingdong365.com
Set-Cookie:........
Vary:Accept-Language,User-Agent

3.Content
<html>....</html>


http性能优化 performance

缓存
cache-control If-Modified-Since  ETag

cache-control 缓存策略
 max-age=600,no-cache="Set-Cookie"

no-cache="xxx" 缓存,但在发回客户端先做检查,传值则表示不缓存指定的header
no-store 不缓存任何内容,在ie中=no-cache
max-age=120 缓存最大有效期,单位秒(age response header)
max-stale=600 在缓存过期后还可以继续保存600秒,不赋值则表示可一直有效
no-transform 禁止缓存代理修改内容
only-if-cached 禁止缓存代理访问应用服务器,仅在有缓存时返回内容
public 任何客户端(代理服务器或浏览器)均可缓存
private 仅限私有客户端(一般是浏览器)可缓存内容
must-revalidate 必须重新验证缓存有效性(默认行为),此指令目的在于显示指明
proxy-revalidate 代理服务器需要重新验证缓存有效期,浏览器不需要
s-maxage 指定public 客户端上的maxage,private可忽略


第一次请求:服务器响应
Last-Modified : 时间A
第二次请求,附加header,检查是否从上次修改时间点后有过新的修改
If-Modified-Since:时间A

ETag:If-None-Match

Vary:Accept-Encoding
告知缓存代理服务器,客户端请求中发送了不同的Accept-Encoding就要缓存不同的版本

SELECT和EPOLL模式
SELECT和EPOLL模式

select模式
1.应用层首先初始化FD_SET(填入需要检测的socket集合),然后调用select函数
2.内核对FD_SET包含的所有socket进行了逐个检测,如果某个socket有状态发生,则填入内容分配一个数组,当所有socket都检查完成后,再将该数组copy到FD_SET中,然后返回应用层

3.select调用返回,应用层从返回的FD_SET中提取有状态发生的socket,并根据socket值映射客户端上下文(可以通过map或hash_map实现映射),然后处理收到的数据

epoll模式
1.应用层调用 epoll_wait检测有事件发生的连接
2.内核对epoll注册事件的socket进行跟踪,一旦某个socket有事件发生,便将其保存到一个内部数组。当接到应用层调用epoll_wait时,直接将该集合copy到epoll_wait数组返回给应用层即可,不需要象select模式对每个worker进行逐一检查。

3.epoll_wait调用返回,所有有事件发生的连接被填入一个epoll_event数组,应用层可根据epoll_event中的用户自定义变量 直接映射客户端上下文(不需要借助hash表),然后处理收到的数据


优惠券
最新微语