打开终端输入以下命令:
ubuntu:~$ sudo apt-get install git-core openssh-server openssh-client
git-core是git版本控制核心软件
安装openssh-server和openssh-client是由于git需要通过ssh协议来在服务器与客户端之间传输文件
然后中间有个确认操作,输入y后等待系统自动从镜像服务器中下载软件安装,安装完后会回到用户当前目录。如果
安装提示失败,可能是因为系统软件库的索引文件太旧了,先更新一下就可以了,更新命令如下:
ubuntu:~$ sudo apt-get update
更新完软件库索引后继续执行上面的安装命令即可。
安装python的setuptools和gitosis,由于gitosis的安装需要依赖于python的一些工具,所以我们需要先安装python
的setuptools。
执行下面的命令:
ubuntu:~$ sudo apt-get install python-setuptools
这个工具比较小,安装也比较快,接下来准备安装gitosis,安装gitosis之前需要初始化一下服务器的git用户信息,这个随便填。
ubuntu:~$ git config --global user.name "myname"
ubuntu:~$ git config --global user.email "******@gmail.com"
初始化服务器用户信息后,就可以安装gitosis了,gitosis主要是用于给用户授权,设置权限也算是很方便的。
可以通过以下命令获取gitosis版本文件
ubuntu:~$ git clone https://github.com/res0nat0r/gitosis.git
注意:中间有两个是数字零
获取gitosis文件后,进入到文件目录下面
ubuntu:/tmp$ cd gitosis/
接着使用python命令安装目录下的setup.py的python脚本进行安装
ubuntu:/tmp/gitosis$ sudo python setup.py install
到这里,整个安装步骤就完成了,下面就开始对git进行一些基本的配置。
二、创建git管理员账户、配置git
创建一个账户(git)作为git服务器的管理员,可以管理其他用户的项目权限。
ubuntu:/tmp/gitosis$ sudo useradd -m git
ubuntu:/tmp/gitosis$ sudo passwd git
然后再/home目录下创建一个项目仓库存储点,并设置只有git用户拥有所有权限,其他用户没有任何权限。
ubuntu:/tmp/gitosis$ sudo mkdir /home/gitrepository
ubuntu:/tmp/gitosis$ sudo chown git:git /home/gitrepository/
ubuntu:/tmp/gitosis$ sudo chmod 700 /home/gitrepository/
由于gitosis默认状态下会将仓库放在用户的repositories目录下,例如git用户的仓库地址默认在/home/git/repositories/目录下,这里我们需要创建一个链接映射。让他指向我们前面创建的专门用于存放项目的仓库目录/home/gitrepository。
ubuntu:/tmp/gitosis$ sudo ln -s /home/gitrepository /home/git/repositories
这里我将在服务器端生成ssh公钥,如果想在其他机器上管理也可以在其他机器上生成一个ssh的公钥。
ubuntu:/home/git$ ssh-keygen -t rsa
这里会提示输入密码,我们不输入直接回车即可。
然后用刚生成公钥id_rsa.pub来对gitosis进行初始化。
向gitosis添加公钥并初始化:
$ cp ~/.ssh/id_rsa.pub /tmp
$ sudo -h -u gitadmin gitosis-init < /tmp/id_rsa.pub
出现如上信息说明gitosis已经初始化成功。
gitosis主要是通过gitosis-admin.git仓库来管理一些配置文件的,如用户权限的管理。这里我们需要对其中的一个post-update文件添加可执行的权限。
ubuntu:/home/git$ sudo chmod 755 /home/gitrepository/gitosis-admin.git/hooks/post-update
三、服务器上创建项目仓库
使用git账户在服务器上创建一个目录(mytestproject.git)并初始化成git项目仓库。
ubuntu:/home/git$ su git
$ cd /home/gitrepository
$ mkdir mytestproject.git
$ git init --bare mytestproject.git
$ exit
如果出现以下信息就说明已经成功创建了一个名为mytestproject.git的项目仓库了,新建的这个仓库暂时还是空的,不能被客户端clone,还需要对gitosis进行一些配置操作。
四、使用gitosis管理用户操作项目的权限
首先需要在前面生成ssh公钥(用来初始化gitosis)的机器上将gitosis-admin.git的仓库clone下来。
在客户端机器上新建一个目录用于存放gitosis-admin.git仓库
ubuntu:~$ mkdir gitadmin
ubuntu:~$ cd gitadmin/
ubuntu:~/gitadmin$ git clone git@192.168.1.106:gitosis-admin.git
clone正确会显示以下信息
clone下来会有一个gitosis.conf的配置文件和一个keydir的目录。gitosis.conf用于配置用户的权限信息,keydir主要用户存放ssh公钥文件(一般以“用户名.pub”命名,gitosis.conf配置文件中需使用相同用户名),用于认证请求的客户端机器。
现在让需要授权的用户使用前面的方式各自在其自己的机器上生成相应的ssh公钥文件,管理员把他们分别按用户名命名好,复制到keydir目录下。
ubuntu:~$ cp /home/aaaaa/desktop/zhangsan.pub /home/aaaaa/gitadmin/gitosis-admin/keydir/
ubuntu:~$ cp /home/aaaaa/desktop/lisi.pub /home/aaaaa/gitadmin/gitosis-admin/keydir/
继续编辑gitosis.conf文件
[gitosis]
[group gitosis-admin]
####管理员组
members = charn@ubuntu
####管理员用户名,需要在keydir目录下找到相应的.pub文件,多个可用空格隔开(下同)
writable = gitosis-admin####可写的项目仓库名,多个可用空格隔开(下同)
[group testwrite]
####可写权限组
members = zhangsan####组用户
writable = mytestproject####可写的项目仓库名
[group
testread] ####只读权限组
members =lisi####组用户
readonly= mytestproject####只读项目仓库名
因为这些配置的修改只是在本地修改的,还需要推送到服务器中才能生效。
ubuntu:~/gitadmin/gitosis-admin$ git add .
ubuntu:~/gitadmin/gitosis-admin$ git commit -am "add a user permission"
ubuntu:~/gitadmin/gitosis-admin$ git push origin master
推送成功会显示下面提示信息
又是后新增的用户不能立即生效,这时候需要重新启动一下sshd服务
ubuntu:~/gitadmin/gitosis-admin$ sudo /etc/init.d/ssh restart
现在,服务端的git就已经安装和配置完成了,接下来就需要有权限的组成员在各自的机器上clone服务器上的相应
项目仓库进行相应的工作了。
五、客户端(windows)使用git
下载安装windows版本的git客户端软件,下载地址:http://msysgit.github.io/
安装完成后右键菜单会出现几个git相关的菜单选项,我们主要使用其中的git
bash通过命令行来进行操作。
在本地新建一个目录,使用git初始化这个目录,然后再里面新建一个文本文件用于测试,最后关联到git服务器仓库
中的相关项目,最后上传本地版本到服务器。
$ mkdir testgit
$ cd testgit
$ git init
$ echo "this is a test text file,will push to server" > hello.txt
$ git add .
$ git commit -am "init a base version,add a first file for push to server"
$ git remote add origin git@serverip:mytestproject.git
$ git push origin master
这样服务端就创建好了一个mytestproject.git的仓库的基础版本了,现在其他组员只要从服务端进行clone就可以了。
window下面进入到需要克隆的本地目录下面右键选择git bash选项,输入
$ git clone git@serverip:mytestproject.git
就可以把项目clone到本地仓库了。
下面进行简单的修改和提交操作
$ cd mytestproject
$ echo "this is another text file created by other" >another.txt
$ git add .
$ git commit -am "add a another file by other"
$ git push origin master
最后推送到服务器成功会显示如下信息
gitolite搭建git仓库(服务端 客户端)
http://blog.csdn.net/chichengit/article/details/49863383
系统管理员,最谨慎的linux就是rm命令了,一不小心数据就没干掉,最恐怖的是数据没有备份,没法还原了,此类事情发生的太多了,针对于此,我们经过多次尝试演练,终于成功的把大部分删除的数据找回来了,下面我把演练过程给大家介绍一下。
二、安装恢复软件
extundelete,该工具官方给出的是可以恢复ext3或者ext4文件系统被删除的文件。
1:通过命令安装
#yum install extundelete -y
2:通过源码编译安装
#yum -y install e2fsprogs-devel e2fsprogs #wget http://zy-res.oss-cn-hangzhou.aliyuncs.com/server/extundelete-0.2.4.tar.bz2 #tar -xvjf extundelete-0.2.4.tar.bz2 #cd extundelete-0.2.4 #./configure #make &&make install
三、删除数据查找
首先,我们先删除一个文件,如图:
如上图,我们刚才在/boot目录下删除了个symvers-2.6.32-431.el6.x86_64.gz文件,/boot是落到/dev/sda1下
在linux下可以通过“ls -id”命令来查看某个文件或者目录的inode值,例如查看根目录的inode值,可以输入:
[root@cloud boot]# ls -id /boot 2 /boot
注:根目录的inode一般为2
然后我们开始查找被删除的文件,需要根据分区inode查找,命令如下:
#extundelete /dev/sda1 --inode 2
结果如下图:
我们就可以看到标识为deleted的被删除数据了。
四、数据恢复
我们就开始恢复,命令如下:
#extundelete /dev/sda1 --restore-file symvers-2.6.32-431.el6.x86_64.gz
如图:
还原成功
当然,还有可能删除整个文件夹,我们也举个例子,如下:
#extundelete /dev/sda1 --restore-directory test
恢复全部删除数据,如下:
#extundelete /dev/sdb1 --restore-all
也可以通过时间段恢复,这里就不说了,参数如下:
--version, -[vv],显示软件版本号。 --help,显示软件帮助信息。 --superblock,显示超级块信息。 --journal,显示日志信息。 --after dtime,时间参数,表示在某段时间之后被删的文件或目录。 --before dtime,时间参数,表示在某段时间之前被删的文件或目录。 动作(action)有: --inode ino,显示节点“ino”的信息。 --block blk,显示数据块“blk”的信息。 --restore-inode ino[,ino,...],恢复命令参数,表示恢复节点“ino”的文件,恢复的文件会自动放在当前目录下的restored_files文件夹中,使用节点编号作为扩展名。 --restore-file 'path',恢复命令参数,表示将恢复指定路径的文件,并把恢复的文件放在当前目录下的recovered_files目录中。 --restore-files 'path',恢复命令参数,表示将恢复在路径中已列出的所有文件。 --restore-all,恢复命令参数,表示将尝试恢复所有目录和文件。 -j journal,表示从已经命名的文件中读取扩展日志。 -b blocknumber,表示使用之前备份的超级块来打开文件系统,一般用于查看现有超级块是不是当前所要的文件。 -b blocksize,通过指定数据块大小来打开文件系统,一般用于查看已经知道大小的文件。
五、总结
数据恢复,不一定能全部将数据恢复回来,还是一句话,操作要谨慎。万一操作失误,也不要慌,将损失减少到最小,首先停止所有操作,其次让专业人员去处理。
rpm -uvh http://nginx.org/packages/centos/7/noarch/rpms/nginx-release-centos-7-0.el7.ngx.noarch.rpm安裝後,會自動產生 yum 的 repository 設定(在 /etc/yum.repos.d/nginx.repo),
yum install nginx
systemctl start nginx
查看目前運作狀態
systemctl status nginx查看 nginx 服務目前的啟動設定
systemctl list-unit-files | grep nginx
若是 disabled,可以改成開機自動啟動
systemctl enable nginx若有設定防火牆,查看防火牆運行狀態,看是否有開啟 nginx 使用的 port
firewall-cmd --state
永久開放開啟防火牆的 http 服務
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload
列出防火牆 public 的設定
firewall-cmd --list-all --zone=public經過以上設定,應該就可以使用瀏覽器訪問 nginx 的預設頁面。
yum install php php-fpm php-mysql查看 php-fpm 服務目前的啟動設定
systemctl list-unit-files | grep php-fpm
改成開機自動啟動
systemctl enable php-fpm立即啟動
systemctl start php-fpm
查看目前運作狀態
systemctl status php-fpm
listen = 127.0.0.1:9000
改成
listen = /var/run/php-fpm/php-fpm.sock然後重新啟動 php-fpm
systemctl restart php-fpm
註:不要改成 listen = /tmp/php-fcgi.sock (將 php-fcgi.sock 設定在 /tmp 底下), 因為系統產生 php-fcgi.sock 時,會放在 /tmp/systemd-private-*/tmp/php-fpm.sock 隨機私有目錄下, 除非把 /usr/lib/systemd/system/ 裡面的 privatetmp=true 設定改成 privatetmp=false, 但還是會產生其他問題,所以還是換個位置最方便 # yum remove php*
centos/rhel 7.x:
# rpm -uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm # rpm -uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
centos/rhel 6.x:
# rpm -uvh https://mirror.webtatic.com/yum/el6/latest.rpm
yum install php70w php70w-opcache
安装其他插件(选装)
注:如果安装pear,需要安装php70w-devel
php70w
php70w-bcmath
php70w-cli
php70w-common
php70w-dba
php70w-devel
php70w-embedded
php70w-enchant
php70w-fpm
php70w-gd
php70w-imap
php70w-interbase
php70w-intl
php70w-ldap
php70w-mbstring
php70w-mcrypt
php70w-mysql
php70w-mysqlnd
php70w-odbc
php70w-opcache
php70w-pdo
php70w-pdo_dblib
php70w-pear
php70w-pecl-apcu
php70w-pecl-imagick
php70w-pecl-xdebug
php70w-pgsql
php70w-phpdbg
php70w-process
php70w-pspell
php70w-recode
php70w-snmp
php70w-soap
php70w-tidy
php70w-xml
php70w-xmlrp
配置(configure)、编译(make)、安装(make install)
编译安装一定要指定定prefix,这是安装目录,会把所有文件限制在这个目录,卸载时只需要删除那个目录就可以,如果不指定会安装到很多地方,后边删除不方便。
configuration: --cache-file=file cache test results in file --help print this message --no-create do not create output files --quiet, --silent do not print `checking...' messages --version print the version of autoconf that created configure directory and file names: --prefix=prefix install architecture-independent files in prefix [/usr/local] --exec-prefix=eprefix install architecture-dependent files in eprefix
注意
内存小于1g安装往往会出错,在编译参数后面加上一行内容--disable-fileinfo
--exec-prefix=exec-prefix
可以把体系相关的文件安装到一个不同的位置,而不是prefix设置的地方.这样做可以比较方便地在不同主机之间共享体系相关的文件
--bindir=directory
为可执行程序声明目录,缺省是 exec-prefix/bin
--datadir=directory
设置所安装的程序需要的只读文件的目录.缺省是 prefix/share
--sysconfdir=directory
用于各种各样配置文件的目录,缺省为 prefix/etc
--libdir=directory
库文件和动态装载模块的目录.缺省是 exec-prefix/lib
--includedir=directory
c 和 c 头文件的目录.缺省是 prefix/include
--docdir=directory
文档文件,(除 “man(手册页)”以外, 将被安装到这个目录.缺省是 prefix/doc
--mandir=directory
随着程序一起带的手册页 将安装到这个目录.在它们相应的manx子目录里. 缺省是prefix/man
注意: 为了减少对共享安装位置(比如 /usr/local/include) 的污染,configure 自动在 datadir, sysconfdir,includedir, 和 docdir 上附加一个 “/postgresql” 字串, 除非完全展开以后的目录名字已经包含字串 “postgres” 或者 “pgsql”.比如,如果你选择 /usr/local 做前缀,那么 c 的头文件将安装到 /usr/local/include/postgresql, 但是如果前缀是 /opt/postgres,那么它们将 被放进 /opt/postgres/include
--with-includes=directories
directories 是一系列冒号分隔的目录,这些目录将被加入编译器的头文件 搜索列表中.如果你有一些可选的包(比如 gnu readline)安装在 非标准位置,你就必须使用这个选项,以及可能还有相应的 --with-libraries 选项.
--with-libraries=directories
directories 是一系列冒号分隔的目录,这些目录是用于查找库文件的. 如果你有一些包安装在非标准位置,你可能就需要使用这个选项 (以及对应的--with-includes选项)
--enable-xxx
打开xxx支持
--with-xxx
制作xxx模块
[global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /usr/local/php/var/log/php-fpm.log [www] listen = /var/run/php-fpm/php-fpm.sock user = www group = www pm = dynamic pm.max_children = 800 pm.start_servers = 200 pm.min_spare_servers = 100 pm.max_spare_servers = 800 pm.max_requests = 4000 rlimit_files = 51200 listen.backlog = 65536 ;設 65536 的原因是-1 可能不是unlimited ;說明 http://php.net/manual/en/install.fpm.configuration.php#104172 slowlog = /usr/local/php/var/log/slow.log request_slowlog_timeout = 10
user nginx; worker_processes 8; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { use epoll; worker_connections 65535; } worker_rlimit_nofile 65535; #若沒設定,可能出現錯誤:65535 worker_connections exceed open file resource limit: 1024 http { include /etc/nginx/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 /var/log/nginx/access.log main; sendfile on; tcp_nopush on; keepalive_timeout 65; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 8m; server_tokens off; client_body_buffer_size 512k; # 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; fastcgi_intercept_errors on; #gzip (說明 http://nginx.org/en/docs/http/ngx_http_gzip_module.html) gzip off; gzip_min_length 1k;#1k以上才壓縮 gzip_buffers 32 4k; #http://stackoverflow.com/questions/4888067/how-to-get-linux-kernel-page-size-programatically #使用 getconf pagesize 取得系統 one memory page size, gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/css text/xml application/javascript application/atom xml application/rss xml text/plain application/json; #查看 nginx 的 mime.types 檔案(/etc/nginx/mime.types),裡面有各種類型的定義 gzip_vary on; include /etc/nginx/conf.d/*.conf; }若出現出現錯誤:setrlimit(rlimit_nofile, 65535) failed (1: operation not permitted)
ulimit -n若設定值太小,修改 /etc/security/limits.conf
vi /etc/security/limits.conf加上或修改以下兩行設定
* soft nofile 65535 * hard nofile 65535
1.关于tomcat的session数目
这个可以直接从tomcat的web管理界面去查看即可
或者借助于第三方工具lambda probe来查看,它相对于tomcat自带的管理稍微多了点功能,但也不多
2.监视tomcat的内存使用情况
使用jdk自带的jconsole可以比较明了的看到内存的使用情况,线程的状态,当前加载的类的总量等
jdk自带的jvisualvm可以下载插件(如gc等),可以查看更丰富的信息。如果是分析本地的tomcat的话,还可以进行内存抽样等,检查每个类的使用情况
3.打印类的加载情况及对象的回收情况
这个可以通过配置jvm的启动参数,打印这些信息(到屏幕(默认也会到catalina.log中)或者文件),具体参数如下:
-xx: printgc:输出形式:[gc 118250k->113543k(130112k), 0.0094143 secs] [full gc 121376k->10414k(130112k), 0.0650971 secs]
-xx: printgcdetails:输出形式:[gc [defnew: 8614k->781k(9088k), 0.0123035 secs] 118250k->113543k(130112k), 0.0124633 secs] [gc [defnew: 8614k->8614k(9088k), 0.0000665 secs][tenured: 112761k->10414k(121024k), 0.0433488 secs] 121376k->10414k(130112k), 0.0436268 secs]
-xx: printgctimestamps -xx: printgc:printgctimestamps可与上面两个混合使用,输出形式:11.851: [gc 98328k->93620k(130112k), 0.0082960 secs]
-xx: printgcapplicationconcurrenttime:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用。输出形式:application time: 0.5291524 seconds
-xx: printgcapplicationstoppedtime:打印垃圾回收期间程序暂停的时间。可与上面混合使用。输出形式:total time for which application threads were stopped: 0.0468229 seconds
-xx:printheapatgc: 打印gc前后的详细堆栈信息
-xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析
-verbose:class 监视加载的类的情况
-verbose:gc 在虚拟机发生内存回收时在输出设备显示信息
-verbose:jni 输出native方法调用的相关情况,一般用于诊断jni调用错误信息
4.添加jms远程监控
对于部署在局域网内其它机器上的tomcat,可以打开jmx监控端口,局域网其它机器就可以通过这个端口查看一些常用的参数(但一些比较复杂的功能不支持),同样是在jvm启动参数中配置即可,配置如下:
-dcom.sun.management.jmxremote.ssl=false -dcom.sun.management.jmxremote.authenticate=false
-djava.rmi.server.hostname=192.168.71.38 设置jvm的jms监控监听的ip地址,主要是为了防止错误的监听成127.0.0.1这个内网地址
-dcom.sun.management.jmxremote.port=1090 设置jvm的jms监控的端口
-dcom.sun.management.jmxremote.ssl=false 设置jvm的jms监控不实用ssl
-dcom.sun.management.jmxremote.authenticate=false 设置jvm的jms监控不需要认证
5.专业点的分析工具有
ibm isa,jprofiler等,具体监控及分析方式去网上搜索即可。
单个tomcat的处理性能是有限的,当并发量较大的时候,就需要有部署多套来进行负载均衡了。
集群的关键点有以下几点:
1.引入负载端
软负载可以使用nginx或者apache来进行,主要是使用一个分发的功能
参考:
http://ajita.iteye.com/blog/1715312(nginx负载)
http://ajita.iteye.com/blog/1717121(apache负载)
2.共享session处理
目前的处理方式有如下几种:
1).使用tomcat本身的session复制功能
参考http://ajita.iteye.com/blog/1715312(session复制的配置)
方案的有点是配置简单,缺点是当集群数量较多时,session复制的时间会比较长,影响响应的效率
2).使用第三方来存放共享session
目前用的较多的是使用memcached来管理共享session,借助于memcached-sesson-manager来进行tomcat的session管理
参考http://ajita.iteye.com/blog/1716320(使用msm管理tomcat集群session)
3).使用黏性session的策略
对于会话要求不太强(不涉及到计费,失败了允许重新请求下等)的场合,同一个用户的session可以由nginx或者apache交给同一个tomcat来处理,这就是所谓的session sticky策略,目前应用也比较多
参考:http://ajita.iteye.com/blog/1848665(tomcat session sticky)
nginx默认不包含session sticky模块,需要重新编译才行(windows下我也不知道怎么重新编译)
优点是处理效率高多了,缺点是强会话要求的场合不合适
3.小结
以上是实现集群的要点,其中1和2可以组合使用,具体场景具体分析吧~
tomcat本身还是运行在jvm上的,通过对jvm参数的调整我们可以使tomcat拥有更好的性能。针对jvm的优化目前主要在两个方面:
1.内存调优
内存方式的设置是在catalina.sh中,调整一下java_opts变量即可,因为后面的启动参数会把java_opts作为jvm的启动参数来处理。
具体设置如下:
java_opts="$java_opts -xmx3550m -xms3550m -xss128k -xx:newratio=4 -xx:survivorratio=4"
其各项参数如下:
-xmx3550m:设置jvm最大可用内存为3550m。
-xms3550m:设置jvm促使内存为3550m。此值可以设置与-xmx相同,以避免每次垃圾回收完成后jvm重新分配内存。
-xmn2g:设置年轻代大小为2g。整个堆大小=年轻代大小 年老代大小 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,sun官方推荐配置为整个堆的3/8。
-xss128k:设置每个线程的堆栈大小。jdk5.0以后每个线程堆栈大小为1m,以前每个线程堆栈大小为256k。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-xx:newratio=4:设置年轻代(包括eden和两个survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-xx:survivorratio=4:设置年轻代中eden区与survivor区的大小比值。设置为4,则两个survivor区与一个eden区的比值为2:4,一个survivor区占整个年轻代的1/6
-xx:maxpermsize=16m:设置持久代大小为16m。
-xx:maxtenuringthreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
2.垃圾回收策略调优
垃圾回收的设置也是在catalina.sh中,调整java_opts变量。
具体设置如下:
java_opts="$java_opts -xmx3550m -xms3550m -xss128k -xx: useparallelgc -xx:maxgcpausemillis=100"
具体的垃圾回收策略及相应策略的各项参数如下:
串行收集器(jdk1.5以前主要的回收方式)
-xx: useserialgc:设置串行收集器
并行收集器(吞吐量优先)
示例:
java -xmx3550m -xms3550m -xmn2g -xss128k -xx: useparallelgc -xx:maxgcpausemillis=100
-xx: useparallelgc:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-xx:parallelgcthreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
-xx: useparalleloldgc:配置年老代垃圾收集方式为并行收集。jdk6.0支持对年老代并行收集
-xx:maxgcpausemillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,jvm会自动调整年轻代大小,以满足此值。
-xx: useadaptivesizepolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
并发收集器(响应时间优先)
示例:java -xmx3550m -xms3550m -xmn2g -xss128k -xx: useconcmarksweepgc
-xx: useconcmarksweepgc:设置年老代为并发收集。测试中配置这个以后,-xx:newratio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-xmn设置。
-xx: useparnewgc: 设置年轻代为并行收集。可与cms收集同时使用。jdk5.0以上,jvm会根据系统配置自行设置,所以无需再设置此值。
-xx:cmsfullgcsbeforecompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次gc以后对内存空间进行压缩、整理。
-xx: usecmscompactatfullcollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片
3.小结
在内存设置中需要做一下权衡
1)内存越大,一般情况下处理的效率也越高,但同时在做垃圾回收的时候所需要的时间也就越长,在这段时间内的处理效率是必然要受影响的。
2)在大多数的网络文章中都推荐 xmx和xms设置为一致,说是避免频繁的回收,这个在测试的时候没有看到明显的效果,内存的占用情况基本都是锯齿状的效果,所以这个还要根据实际情况来定。
ajp是为 tomcat 与 http 服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果tomcat前端放的是apache的时候,会使用到ajp这个连接器。由于我们公司前端是由nginx做的反向代理,因此不使用此连接器,因此需要注销掉该连接器。
默认 tomcat 是开启了对war包的热部署的。为了防止被植入木马等恶意程序,因此我们要关闭自动部署。修改实例:
name ="localhost" appbase="" unpackwars="false" autodeploy="false">
3.配置pptp.首先我们要编辑/etc/pptpd.conf文件:
#vim /etc/pptpd.conf
找到”locapip”和”remoteip”这两个配置项,将前面的”;”注释符去掉,更改为你期望的ip段值.localip表示服务器的ip,remoteip表示分配给客户端的ip地址,可以设置为区间.这里我们使用pptp默认的配置:
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245
注意,这里的ip段设置,将直接影响后面的iptables规则添加命令.请注意匹配的正确性,如果你嫌麻烦,建议就用本文的配置,就可以一直复制命令和文本使用了.
4.接下来我们再编辑/etc/ppp/options.pptpd文件,为vpn添加google dns:
#vim /etc/ppp/options.pptpd
在末尾添加下面两行:
ms-dns 8.8.8.8
ms-dns 8.8.4.4
5、设置pptp vpn账号密码.我们需要编辑/etc/ppp/chap-secrets这个文件:
#vim /etc/ppp/chap-secrets
在这个文件里面,按照”用户名 pptpd 密码 *”的形式编写,一行一个账号和密码.比如添加用户名为test,密码为1234的用户,则编辑如下内容:
test pptpd 1234 *
6、修改内核设置,使其支持转发.编辑/etc/sysctl.conf文件:
#vim /etc/sysctl.conf
将”net.ipv4.ip_forward”改为1,变成下面的形式.
net.ipv4.ip_forward=1
保存退出,并执行下面的命令来生效它:
#sysctl -p
7、添加iptables转发规则.经过前面的6个步骤,我们的vpn已经可以拨号了,但是还不能访问任何网页.最后一步就是添加iptables转发规则了,输入下面的指令:
#iptables -t nat -a postrouting -s 192.168.0.0/24 -o eth0 -j masquerade
需要注意的是,这个指令中的”192.168.0.0/24″是根据之前的配置文件中的”localip”网段来改变的,比如你设置的”10.0.0.1″网段,则应该改为”10.0.0.0/24″.此外还有一点需要注意的是eth0,如果你的外网网卡不是eth0,而是eth1(比如softlayer的服务器就是这样的情况),那么请记得将eth0也更改为对应的网卡编号,不然是上不了网的.
然后我们输入下面的指令让iptables保存我们刚才的转发规则,以便重启系统后不需要再次添加:
#/etc/init.d/iptables save
然后我们重启iptables:
#/etc/init.d/iptables restart
8、重启pptp服务.输入下面的指令重启pptp:
#/etc/init.d/pptpd restart
现在你已经可以连接自己的vpn并浏览网页了.不过我们还需要做最后的一步.
9、设置开机自动运行服务.我们最后一步是将pptp和iptables设置为开机自动运行,这样就不需要每次重启服务器后手动启动服务了,当然你不需要自动启动服务的话可以忽略这一步,输入指令:
#chkconfig pptpd on
#chkconfig iptables on
这样就大功告成了,赶快到windows下建立一个vpn连接,ip填写自己的服务器ip,用户名和密码填写自己设置好的用户名和密码,点击”连接”,成功后就可以使用服务器去浏览网页啦.
备注:
多ip服务器转发指定规则
iptables -t nat -a postrouting -s 192.168.8.0/24 -j snat --to-source 192.168.8.1
or
iptables -t nat -a postrouting -s 192.168.8.0/24 -j snat --to-source 服务器外网ip
如果iphone之类的设备能连上,访问网页或者youtube特别慢,需要做如下修改:
vi /etc/ppp/ip-up
增加一行
/sbin/ifconfig $1 mtu 1400
或者修改iptables规则
iptables -a forward -p tcp --syn -s 192.168.8.0/24 -j tcpmss --set-mss 1356
1356的值可能需要自己调整,调节到能保证网络正常使用情况下的最大值