一、安裝git服務器所需軟件
打開終端輸入以下命令:
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
摘要: Git 教程http://www.runoob.com/git/git-tutorial.htmlGit本地服務器搭建及使用Git是一款免費、開源的分布式版本控制系統。眾所周知的Github便是基于Git的開源代碼庫以及版本控制系統,由于其遠程托管服務僅對開源免費,所以搭建本地Git服務器也是個較好的選擇,本文將對此進行詳細講解。(推薦一家提供私有源代碼免費托管的網站:Bitbucket,目前支持... 閱讀全文一、背景
系統管理員,最謹慎的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做的反向代理,因此不使用此連接器,因此需要注銷掉該連接器。
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
默認 Tomcat 是開啟了對war包的熱部署的。為了防止被植入木馬等惡意程序,因此我們要關閉自動部署。修改實例:
<Host 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的值可能需要自己調整,調節到能保證網絡正常使用情況下的最大值
安裝 MySQL 運行命令:
sudo apt-get install mysql-server mysql-client在安裝 Nginx 之前,如果你已經安裝 Apache2 先刪除在安裝 nginx:
service apache2 stop
update-rc.d -f apache2 remove
sudo apt-get remove apache2
我們必須通過 PHP-FPM 才能讓PHP5正常工作,安裝命令:
sudo apt-get install php5-fpmphp-fpm是一個守護進程。
安裝mysql和GD擴展
sudo apt-get install curl libcurl3 libcurl3-dev php5-curl
可以通過訪問Oracle官網下載,或者直接通過命令行下載。
lxh@ubuntu:~$ wget -c http://download.oracle.com/otn-pub/java/jdk/8u11-b12/jdk-8u25-linux-x64.tar.gz
lxh@ubuntu:~$ mkdir -p /usr/lib/jvm
lxh@ubuntu:~$ sudo mv jdk-8u25-linux-x64.tar.gz /usr/lib/jvm
lxh@ubuntu:~$ cd /usr/lib/jvm
lxh@ubuntu:~$ sudo tar xzvf jdk-8u25-linux-x64.tar.gz
在系統中添加環境變量,主要是PATH、CLASSPATH和JAVA_HOME。
lxh@ubuntu:~$ sudo vim ~/.profile
在文件最后加入
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_25/export JRE_HOME=/usr/lib/jvm/jdk1.8.0_25/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
保存退出,并通過命令使腳本生效:
lxh@ubuntu:~$ $source ~/.profile
在有的系統中會預裝OpenJDK,系統默認使用的是這個,而不是剛才裝的。所以這一步是通知系統使用Oracle的JDK,非OpenJDK。
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_25/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_25/bin/javac 300
sudo update-alternatives --config java
因為我是在虛擬機中安裝的Ubuntu 14.04,默認不安裝OpenJDK,所以沒有需要選擇的JDK版本。如果是在物理機上安裝的Ubuntu版本,會出現幾個候選項,可用于替換 java (提供 /usr/bin/java)。
====================================
啟動nginx1)使用在 /etc/init.d/ 目錄下創建名為 nginx 文件,注意沒有后綴名,將以下內容復制到該文件中(感謝提供腳本的兄弟)。
/usr/local/nginx/sbin/nginx
2)添加權限
$ sudo chmod +x nginx
3)服務方式啟動 如果配置服務前已啟動,執行以下命令停止Nginx。
$ sudo service nginx stop
4)啟動Nginx
$ sudo service nginx start
pastingnginx出現connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied)的錯誤
處理方式是:編輯/etc/php5/fpm/pool.d/www.conf文件,
將以下的注釋去掉:
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
然后重啟php5-fpm
$ sudo service php5-fpm restart
Ubuntu 14.04快速搭建SVN服務器及日常使用
SVN相關命令了解
svn:命令行客戶端
svnadmin:用來創建、調整或修復版本庫的工具
svnserve:svn服務程序
svndumpfilter:過濾svn版本庫轉儲數據流的工具
svnsync:svn數據同步工具,實現另外存一份相同的
svnlook:用來查看辦本科中不同的修訂版和事務
直接安裝
# apt-get install subversion
創建版本庫
# sudo mkdir /app/svn
# sudo svnadmin create /app/svn/prj
配置版本庫
# sudo vi svnserve.conf #將以下參數去掉注釋
[general]
anon-access = none #匿名訪問權限,默認read,none為不允許訪問
auth-access = write #認證用戶權限
password-db = passwd #用戶信息存放文件,默認在版本庫/conf下面,也可以絕對路徑指定文件位置
authz-db = authz
# sudo vi passwd #格式是用戶名=密碼,采用明文密碼
[users]
xiaoming = 123
zhangsan = 123
lisi = 123
# sudo vi authz
[groups] #定義組的用戶
manager = xiaoming
core_dev = zhangsan,lisi
[repos:/] #以根目錄起始的repos版本庫manager組為讀寫權限
@manager = rw
[repos:/media] #core_dev對repos版本庫下media目錄為讀寫權限
@core_dev = rw
備份與恢復
svnadmin dump備份
# 完整備份
svnadmin dump /app/svn/prj > YYmmdd_fully_backup.svn
# 完整壓縮備份
svnadmin dump /app/svn/prj | gzip > YYmmdd_fully_backup.gz
# 備份恢復
svnadmin load /app/svn/prj < YYmmdd_fully_backup.svn
zcat YYmmdd_fully_backup.gz | svnadmin load repos
### 增量備份 ###
# 先完整備份
svnadmin dump /app/svn/prj -r 0:100 > YYmmdd_incremental_backup.svn
# 再增量備份
svnadmin dump /app/svn/prj -r 101:200 --incremental > YYmmdd_incremental_backup.svn
svnadmin hotcopy備份
# 備份
svnadmin hotcopy /app/svn/prj YYmmdd_fully_backup --clean-logs
# 恢復
svnadmin hotcopy YYmmdd_fully_backup /app/svn/prj
Tomcat 內存優化
Linux下修改JVM內存大小
要添加在tomcat 的bin 下catalina.sh 里,位置cygwin=false前 。注意引號要帶上,紅色的為新添加的.
# OS specific support. $var _must_ be set to either true or false. JAVA_OPTS="-server -Xms512M -Xmx512M -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:PermSize=64M -XX:MaxPermSize=128m" cygwin=false
當然一定有人接私活接的很好,只是別人的成功很難複制,但別人的失敗可以避免,如果你能避掉我以上所說的陷阱也無法保證你能成功,因為這也只是冰山一角,我已經離開接私活的狀態很久,很多事忘了也不想去想,只是希望你在決定接私活前,仔細想一下,你真的只有接私活這個選項嗎 ? 如果可以,我會建議你應該要開發自己的產品及服務。
來自:電子豹博客
fn:contains 判斷字符串是否包含另外一個字符串 <c:if test="${fn:contains(name, searchString)}">
fn:containsIgnoreCase 判斷字符串是否包含另外一個字符串(大小寫無關) <c:if test="${fn:containsIgnoreCase(name, searchString)}">
fn:endsWith 判斷字符串是否以另外字符串結束 <c:if test="${fn:endsWith(filename, ".txt")}">
fn:escapeXml 把一些字符轉成XML表示,例如 <字符應該轉為< ${fn:escapeXml(param:info)}
fn:indexOf 子字符串在母字符串中出現的位置 ${fn:indexOf(name, "-")}
fn:join 將數組中的數據聯合成一個新字符串,并使用指定字符格開 ${fn:join(array, ";")}
fn:length 獲取字符串的長度,或者數組的大小 ${fn:length(shoppingCart.products)}
fn:replace 替換字符串中指定的字符 ${fn:replace(text, "-", "?")}
fn:split 把字符串按照指定字符切分 ${fn:split(customerNames, ";")}
fn:startsWith 判斷字符串是否以某個子串開始 <c:if test="${fn:startsWith(product.id, "100-")}">
fn:substring 獲取子串 ${fn:substring(zip, 6, -1)}
fn:substringAfter 獲取從某個字符所在位置開始的子串 ${fn:substringAfter(zip, "-")}
fn:substringBefore 獲取從開始到某個字符所在位置的子串 ${fn:substringBefore(zip, "-")}
fn:toLowerCase 轉為小寫 ${fn.toLowerCase(product.name)}
fn:toUpperCase 轉為大寫字符 ${fn.UpperCase(product.name)}
fn:trim 去除字符串前后的空格 ${fn.trim(name)}
函數
描述
fn:contains(string, substring)
如果參數string中包含參數substring,返回true
fn:containsIgnoreCase(string, substring)
如果參數string中包含參數substring(忽略大小寫),返回true
fn:endsWith(string, suffix)
如果參數 string 以參數suffix結尾,返回true
fn:escapeXml(string)
將有特殊意義的XML (和HTML)轉換為對應的XML character entity code,并返回
fn:indexOf(string, substring)
返回參數substring在參數string中第一次出現的位置
fn:join(array, separator)
將一個給定的數組array用給定的間隔符separator串在一起,組成一個新的字符串并返回。
fn:length(item)
返回參數item中包含元素的數量。參數Item類型是數組、collection或者String。如果是String類型,返回值是String中的字符數。
fn:replace(string, before, after)
返回一個String對象。用參數after字符串替換參數string中所有出現參數before字符串的地方,并返回替換后的結果
fn:split(string, separator)
返回一個數組,以參數separator 為分割符分割參數string,分割后的每一部分就是數組的一個元素
fn:startsWith(string, prefix)
如果參數string以參數prefix開頭,返回true
fn:substring(string, begin, end)
返回參數string部分字符串, 從參數begin開始到參數end位置,包括end位置的字符
fn:substringAfter(string, substring)
返回參數substring在參數string中后面的那一部分字符串??
fn:substringBefore(string, substring)
返回參數substring在參數string中前面的那一部分字符串
fn:toLowerCase(string)
將參數string所有的字符變為小寫,并將其返回
fn:toUpperCase(string)
將參數string所有的字符變為大寫,并將其返回
fn:trim(string)
在jsp中 使用EL表達式時,不可以使用java提供的功能,比如indexOf()等。
<c:if test="${Boolean.valueOf(requestScope.addresult)==false}">
報錯
The function valueOf must be used with a prefix when a default namespace is not specified
給大家推薦一處php主機-wopus主機,專業的wordpress主機!還可以省錢購買php主機,永久免費使用.
購買可以用wopus主機優惠碼:alpha, 提交訂單時手動輸入 alpha
或者通過>>wopus主機優惠碼<<鏈接進入直接購買就可獲得優惠,可以省錢喲. http://idc.wopus.org/?f=alpha
(wopus主機推介優惠碼:alpha 永久有效)!打算買php主機的朋友請看以下介紹!
WopusIDC一直致力于為廣大獨立博客用戶提供優質實惠的專業博客主機服務,現已積累有超過四年的專業博客主機服務經驗,成為眾多獨立博客們的主機首選。
從國外主機到國內主機,WopusIDC給用戶帶來多種主機選擇,打破訪問速度的瓶頸,給廣大獨立博客用戶帶來更佳的主機體驗。
依托于Wopus平臺上發布的數量眾多的主題、插件以及文章教程,WopusIDC用戶可以簡單快速的搭建屬于自己的個性化博客。
買php主機用 wopus主機優惠碼:alpha , 提交訂單時手動輸入 alpha ,永久免費使用,長期有效.
或 點擊 http://idc.wopus.org/?f=alpha 購買主機立即省錢!
cat access_log_2011_06_26.log |awk '{print $1}'|uniq -c|wc -l
1.關閉防火墻
[root@CentOS ~]# chkconfig iptables off
2.關閉selinux
vi /etc/sysconfig/selinux
//將SELINUX=enforcing修改為disabled然后重啟生效
3、配置CentOS 6.0 第三方yum源(CentOS默認的標準源里沒有nginx軟件包)
[root@CentOS ~]# yum install wget
//下載wget工具
[root@CentOS ~]# wget http://www.atomicorp.com/installers/atomic
//下載atomic yum源
[root@CentOS ~]# sh ./atomic
//安裝提示輸入時輸yes
[root@CentOS ~]# yum check-update
//更新yum軟件包
4.安裝開發包和庫文件
[root@CentOS ~]# yum -y install ntp make openssl openssl-devel pcre pcre-devel libpng
libpng-devel libjpeg-6b libjpeg-devel-6b freetype freetype-devel gd gd-devel zlib zlib-devel
gcc gcc-c++ libXpm libXpm-devel ncurses ncurses-devel libmcrypt libmcrypt-devel libxml2
libxml2-devel imake autoconf automake screen sysstat compat-libstdc++-33 curl curl-devel
5.卸載已安裝的apache、mysql、php
[root@CentOS ~]# yum remove httpd
[root@CentOS ~]# yum remove mysql
[root@CentOS ~]# yum remove php
6.安裝nginx
[root@CentOS ~]# yum install nginx
[root@CentOS ~]# service nginx start
[root@CentOS ~]# chkconfig --levels 235 nginx on
//設2、3、5級別開機啟動
7.安裝mysql
[root@CentOS ~]# yum install mysql mysql-server mysql-devel
[root@CentOS ~]# service mysqld start
[root@CentOS ~]# chkconfig --levels 235 mysqld on
[root@CentOS ~]# mysqladmin -u root password "123456"
//為root用戶設置密碼
[root@CentOS ~]# service mysqld restart
//重啟mysql
8.安裝php
[root@CentOS ~]# yum install php lighttpd-fastcgi php-cli php-mysql php-gd php-imap php-ldap
php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-mssql php-snmp php-soap
php-tidy php-common php-devel php-fpm
//安裝php和所需組件使PHP支持MySQL、FastCGI模式
[root@CentOS ~]# service php-fpm start
[root@CentOS ~]# chkconfig --levels 235 php-fpm on
9.配置nginx支持php
[root@CentOS ~]# mv /etc/nginx/nginx.conf /etc/nginx/nginx.confbak
//將配置文件改為備份文件
[root@CentOS ~]# cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf
//由于原配置文件要自己去寫因此可以使用默認的配置文件作為配置文件
//修改nginx配置文件,添加fastcgi支持
[root@CentOS ~]# vi /etc/nginx/nginx.conf
index index.php index.html index.htm;
//加入index.php
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
//將以上代碼注釋去掉,并修改成nginx默認路徑
10.配置php
//編輯文件php.ini,在文件末尾添加cgi.fix_pathinfo = 1
[root@CentOS ~]# vi /etc/php.ini
11.重啟nginx php-fpm
[root@CentOS ~]# service nginx restart
[root@CentOS ~]# service php-fpm restart
12.建立info.php文件
[root@CentOS ~]# vi /usr/share/nginx/html/info.php
<?php
phpinfo();
?>
13.測試nginx是否解析php
輸入:192.168.1.105/info.php
顯示php界面說明解析成功