隨筆-179  評論-666  文章-29  trackbacks-0
            2012年9月17日
          一、準備 正式開始前,編譯環境gcc、g++等開發庫需要提前安裝。
          nginx依賴以下模塊: gzip模塊需要 zlib 庫 rewrite模塊需要 pcre 庫 ssl 功能需要openssl庫
          源碼目錄為:/usr/local/src
          1、安裝make yum -y install gcc automake autoconf libtool make
          2、安裝g++ yum install gcc gcc-c++
          3、安裝PCRE庫 cd /usr/local/src wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.42.tar.gz tar -zxvf pcre-8.42.tar.gz cd pcre-8.42/ ./configure make && make install 出現如下報錯: make[2]: *** [install-libLTLIBRARIES] Error 1 make[2]: Leaving directory `/usr/local/src/pcre-8.42' make[1]: *** [install-am] Error 2 make[1]: Leaving directory `/usr/local/src/pcre-8.42' make: *** [install] Error 2 權限不夠,切換到root,重新make install即可。
          4、安裝zlib庫 cd /usr/local/src wget http://zlib.net/zlib-1.2.11.tar.gz tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11/ ./configure make && make install
          5、安裝OpenSSL庫 cd /usr/local/src wget http://www.openssl.org/source/openssl-1.1.0h.tar.gz tar -zxvf openssl-fips-2.0.16.tar.gz cd openssl-fips-2.0.16/ ./config make && make install 編譯安裝 Openssl 1.1.1 支持國密標準 https://blog.51cto.com/1012682/2380553 6、創建用戶及用戶組 一般為了服務器安全,會指定一個普通用戶權限的賬號做為Nginx的運行角色,這里使用www用戶做為Nginx工作進程的用戶。后續安裝的PHP也以www用戶作為工作進程用戶。 groupadd -r www useradd -r -g www www 二、NGINX 1、下載 cd /usr/local/src wget http://nginx.org/download/nginx-1.14.0.tar.gz tar –zxvf nginx-1.14.0.tar.gz cd nginx-1.14.0 2、配置 ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi make && make install nginx編譯選項說明: --prefix表示nginx要安裝到哪個路徑下,這里指定剛才新建好的/alidata/server目錄下的nginx-1.12.2; --sbin-path表示nginx的可執行文件存放路徑 --conf-path表示nginx的主配置文件存放路徑,nginx允許使用不同的配置文件啟動,通過命令行中的-c選項 --pid-path表示nginx.pid文件的存放路徑,將存儲的主進程的進程號。安裝完成后,可以隨時改變的文件名 , 在nginx.conf配置文件中使用 PID指令。默認情況下,文件名 為prefix/logs/nginx.pid --error-log-path表示nginx的主錯誤、警告、和診斷文件存放路徑 --http-log-path表示nginx的主請求的HTTP服務器的日志文件的存放路徑 --user表示nginx工作進程的用戶 --group表示nginx工作進程的用戶組 --with-select_module或--without-select_module表示啟用或禁用構建一個模塊來允許服務器使用select()方法 --with-poll_module或--without-poll_module表示啟用或禁用構建一個模塊來允許服務器使用poll()方法 --with-http_ssl_module表示使用https協議模塊。默認情況下,該模塊沒有被構建。建立并運行此模塊的OpenSSL庫是必需的 --with-pcre表示pcre的源碼路徑,因為解壓后的pcre是放在root目錄下的,所以是/root/pcre-8.41; --with-zlib表示zlib的源碼路徑,這里因為解壓后的zlib是放在root目錄下的,所以是/root/zlib-1.2.11 --with-openssl表示openssl庫的源碼路徑 配置OK: Configuration summary + using PCRE library: /usr/local/src/pcre-8.42 + using OpenSSL library: /usr/local/src/openssl-1.1.0h + using zlib library: /usr/local/src/zlib-1.2.11 nginx path prefix: "/usr/local/nginx" nginx binary file: "/usr/local/nginx/sbin/nginx" nginx modules path: "/usr/local/nginx/modules" nginx configuration prefix: "/usr/local/nginx" nginx configuration file: "/usr/local/nginx/nginx.conf" nginx pid file: "/usr/local/nginx/nginx.pid" nginx error log file: "/usr/local/nginx/logs/error.log" nginx http access log file: "/usr/local/nginx/logs/access.log" nginx http client request body temporary files: "/var/tmp/nginx/client/" nginx http proxy temporary files: "/var/tmp/nginx/proxy/" nginx http fastcgi temporary files: "/var/tmp/nginx/fcgi/" nginx http uwsgi temporary files: "/var/tmp/nginx/uwsgi" nginx http scgi temporary files: "/var/tmp/nginx/scgi" 3、安裝 make && make install 4、啟動 /usr/local/nginx/sbin/nginx 啟動時報錯: nginx: [emerg] mkdir() "/var/tmp/nginx/client/" failed (2: No such file or directory) 手動創建該目錄即可:mkdir -p /var/tmp/nginx/client 再次啟動,打開瀏覽器訪問此機器的IP,瀏覽器出現Welcome to nginx! 則表示 Nginx 已經安裝并運行成功。
          5、設置軟連接 ln -sf /usr/local/nginx/sbin/nginx /usr/sbin 這樣就可以直接執行nginx來啟動了。
          6、檢測nginx nginx -t 顯示: nginx: the configuration file /usr/local/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/nginx.conf test is successful 三、PHP 1、安裝PHP需要的常用庫 yum -y install libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel 2、下載 cd /usr/local/src wget http://cn2.php.net/downloads.php/php-7.2.5.tar.gz tar -zxvf php-7.2.5.tar.gz 3、配置 ./configure --prefix=/usr/local/php \ --with-mysql=mysqlnd \ --enable-mysqlnd \ --with-gd \ --enable-gd-jis-conv \ --enable-fpm 4、安裝 make && make install 安裝信息如下: Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/ Installing PHP CLI binary: /usr/local/php/bin/ Installing PHP CLI man page: /usr/local/php/php/man/man1/ Installing PHP FPM binary: /usr/local/php/sbin/ Installing PHP FPM defconfig: /usr/local/php/etc/ Installing PHP FPM man page: /usr/local/php/php/man/man8/ Installing PHP FPM status page: /usr/local/php/php/php/fpm/ Installing phpdbg binary: /usr/local/php/bin/ Installing phpdbg man page: /usr/local/php/php/man/man1/ Installing PHP CGI binary: /usr/local/php/bin/ Installing PHP CGI man page: /usr/local/php/php/man/man1/ Installing build environment: /usr/local/php/lib/php/build/ Installing header files: /usr/local/php/include/php/ Installing helper programs: /usr/local/php/bin/ program: phpize program: php-config Installing man pages: /usr/local/php/php/man/man1/ page: phpize.1 page: php-config.1 Installing PEAR environment: /usr/local/php/lib/php/ [PEAR] Archive_Tar: upgrade to a newer version (1.4.3 is not newer than 1.4.3) [PEAR] Console_Getopt: upgrade to a newer version (1.4.1 is not newer than 1.4.1) [PEAR] Structures_Graph: upgrade to a newer version (1.1.1 is not newer than 1.1.1) [PEAR] XML_Util: upgrade to a newer version (1.4.2 is not newer than 1.4.2) [PEAR] PEAR: upgrade to a newer version (1.10.5 is not newer than 1.10.5) /usr/local/src/php-7.2.5/build/shtool install -c ext/phar/phar.phar /usr/local/php/bin ln -s -f phar.phar /usr/local/php/bin/phar Installing PDO headers: /usr/local/php/include/php/ext/pdo/ 5、添加環境變量 vim /etc/profile 在末尾加入 export PHP_HOME=/usr/local/php export PATH=/bin:/usr/bin:/usr/sbin:/sbin:$PATH:PHP_HOME/bin:$PHP_HOME/sbin 保存修改后,使用source命令重新加載配置文件: source /etc/profile 查看環境變量: echo $PATH 6、配置php-fpm cd /usr/local/php/etc cp php-fpm.conf.default php-fpm.conf cd php-fpm.d/ cp www.conf.default www.conf 使用vim命令對php-fpm.conf的內容進行如下修改: pid = /usr/local/php/var/run/php-fpm.pid 使用vim命令對php-fpm.conf的內容進行如下修改: user = www group = www 其他配置可根據需求進行修改,比如pm.max_children(php-fpm 能啟動的子進程的最大數量)、pm.start_servers(php啟動時,開啟的子進程的數量)、pm.min_spare_servers(動態方式空閑狀態下的最小php-fpm進程數量)、pm.max_spare_servers(動態方式空閑狀態下的最大php-fpm進程數量)等。 7、啟動php-fpm /usr/local/php/sbin/php-fpm 可以通過ps aux | grep php查看php進程。 https://www.cnblogs.com/sunshineliulu/p/8991957.html 三、MySQL https://blog.csdn.net/weixin_33859844/article/details/90948191 https://www.cnblogs.com/yangchunlong/p/8477743.html
          posted @ 2019-08-13 17:37 Alpha 閱讀(409) | 評論 (0)編輯 收藏

          一、安裝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

          Ubuntu完美搭建Git服務器

          出現如上信息說明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正確會顯示以下信息

          Ubuntu完美搭建Git服務器

          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

          推送成功會顯示下面提示信息

          Ubuntu完美搭建Git服務器

          又是后新增的用戶不能立即生效,這時候需要重新啟動一下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

          最后推送到服務器成功會顯示如下信息

          Ubuntu完美搭建Git服務器


          gitolite搭建git倉庫(服務端+客戶端)

          http://blog.csdn.net/ChiChengIT/article/details/49863383

          posted @ 2018-03-13 15:35 Alpha 閱讀(1209) | 評論 (0)編輯 收藏
               摘要: Git 教程http://www.runoob.com/git/git-tutorial.htmlGit本地服務器搭建及使用Git是一款免費、開源的分布式版本控制系統。眾所周知的Github便是基于Git的開源代碼庫以及版本控制系統,由于其遠程托管服務僅對開源免費,所以搭建本地Git服務器也是個較好的選擇,本文將對此進行詳細講解。(推薦一家提供私有源代碼免費托管的網站:Bitbucket,目前支持...  閱讀全文
          posted @ 2018-03-08 10:44 Alpha 閱讀(3259) | 評論 (0)編輯 收藏
          1.查看內存  free
          2.查看cpu  cat cpuinfo
          3.查看磁盤  fdisk -l
          4.查看帶寬  iptraf-ng
          5.查看負載  top
          6.查看請求數  netstat  -anp | wc -l
          7.查看請求詳情  netstat  -anp
          8.查看某個程序請求數  netstat -anp | grep php |wc -l
          9.查看磁盤使用情況  df -h
          10.查看系統日志  dmesg
          11.查看進程數量  ps aux | wc -l
          12.查看運行網絡程序 ps auxww | more
          13.
          查看php運行程序 ps auxww | grep php
          14.查看php運行程序數量 ps auxww | grep php | wc -l
          15.查看init.d運行  
          ls -al /etc/init.d/
          16.查找文件路徑   find / -name php.ini
          17.查看mysql端口   netstat -anp | grep 3306
          18.查看本機ip地址  ip add
          19.查找某個字符串在文件中出現的  grep 127.0.0.1:9000  *.conf
          20.

          posted @ 2017-12-25 10:16 Alpha 閱讀(640) | 評論 (0)編輯 收藏

          一、背景

          系統管理員,最謹慎的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

          三、刪除數據查找

          首先,我們先刪除一個文件,如圖:

          Linux怎樣恢復誤刪除的數據

          如上圖,我們剛才在/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

          結果如下圖:

          Linux怎樣恢復誤刪除的數據

          我們就可以看到標識為Deleted的被刪除數據了。

          四、數據恢復

          我們就開始恢復,命令如下:

          #extundelete /dev/sda1 --restore-file symvers-2.6.32-431.el6.x86_64.gz

          如圖:

          Linux怎樣恢復誤刪除的數據

          Linux怎樣恢復誤刪除的數據

          還原成功

          當然,還有可能刪除整個文件夾,我們也舉個例子,如下:

          #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,通過指定數據塊大小來打開文件系統,一般用于查看已經知道大小的文件。

          五、總結

          數據恢復,不一定能全部將數據恢復回來,還是一句話,操作要謹慎。萬一操作失誤,也不要慌,將損失減少到最小,首先停止所有操作,其次讓專業人員去處理。

          阿里云服務器優惠券

          posted @ 2017-12-23 16:11 Alpha 閱讀(2013) | 評論 (0)編輯 收藏
          阿里云服務器優惠券
          1. 安裝 nginx 
            CentOS 7 沒有內建的 nginx,所以先到 nginx 官網  http://nginx.org/en/linux_packages.html#stable ,找到 CentOS 7 的 nginx-release package 檔案連結,然後如下安裝
            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 指令安裝 nginx
            yum install nginx
          2. 啟動 nginx 
            以前用 chkconfig 管理服務,CentOS 7 改用 systemctl 管理系統服務 
            立即啟動
            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 的預設頁面。
          3. 安裝 PHP-FPM 
            使用 yum 安裝 php、php-fpm、php-mysql
            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
          4. 修改 PHP-FPM listen 的方式 
            若想將 PHP-FPM listen 的方式,改成 unix socket,可以編輯 /etc/php-fpm.d/www.conf 
            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*

            rpm 安裝 Php7 相應的 yum源

            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安裝php7

            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

            編譯安裝php7

            配置(configure)、編譯(make)、安裝(make install)

            使用configure --help

            編譯安裝一定要指定定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模塊

            • PHP FPM設定參考
              [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
            • nginx.conf 設定參考 
              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



          阿里云服務器優惠券
          posted @ 2016-08-10 13:44 Alpha 閱讀(6041) | 評論 (0)編輯 收藏
          阿里云服務器優惠券

          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可以組合使用,具體場景具體分析吧~

           

          JVM優化

          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設置為一致,說是避免頻繁的回收,這個在測試的時候沒有看到明顯的效果,內存的占用情況基本都是鋸齒狀的效果,所以這個還要根據實際情況來定。

           

          Server.xml的Connection優化

          Tomcat的Connector是Tomcat接收HTTP請求的關鍵模塊,我們可以配置它來指定IO模式,以及處理通過這個Connector接受到的請求的處理線程數以及其它一些常用的HTTP策略。其主要配置參數如下: 

          1.指定使用NIO模型來接受HTTP請求 
          protocol="org.apache.coyote.http11.Http11NioProtocol" 指定使用NIO模型來接受HTTP請求。默認是BlockingIO,配置為protocol="HTTP/1.1" 
          acceptorThreadCount="2" 使用NIO模型時接收線程的數目 

          2.指定使用線程池來處理HTTP請求 
          首先要配置一個線程池來處理請求(與Connector是平級的,多個Connector可以使用同一個線程池來處理請求) 
          <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
          maxThreads="1000" minSpareThreads="50" maxIdleTime="600000"/> 
          <Connector port="8080"
          executor="tomcatThreadPool" 指定使用的線程池 

          3.指定BlockingIO模式下的處理線程數目 
          maxThreads="150"http://Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數。默認值200。可以根據機器的時期性能和內存大小調整,一般可以在400-500。最大可以在800左右。 
          minSpareThreads="25"---Tomcat初始化時創建的線程數。默認值4。如果當前沒有空閑線程,且沒有超過maxThreads,一次性創建的空閑線程數量。Tomcat初始化時創建的線程數量也由此值設置。 
          maxSpareThreads="75"--一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程。默認值50。一旦創建的線程超過此數值,Tomcat會關閉不再需要的線程。線程數可以大致上用 “同時在線人數*每秒用戶操作次數*系統平均操作時間” 來計算。 
          acceptCount="100"----指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。默認值10。如果當前可用線程數為0,則將請求放入處理隊列中。這個值限定了請求隊列的大小,超過這個數值的請求將不予處理。 
          connectionTimeout="20000" --網絡連接超時,默認值20000,單位:毫秒。設置為0表示永不超時,這樣設置有隱患的。通常可設置為30000毫秒。 

          4.其它常用設置 
          maxHttpHeaderSize="8192" http請求頭信息的最大程度,超過此長度的部分不予處理。一般8K。 
          URIEncoding="UTF-8" 指定Tomcat容器的URL編碼格式。 
          disableUploadTimeout="true" 上傳時是否使用超時機制 
          enableLookups="false"--是否反查域名,默認值為true。為了提高處理能力,應設置為false 
          compression="on"   打開壓縮功能 
          compressionMinSize="10240" 啟用壓縮的輸出內容大小,默認為2KB 
          noCompressionUserAgents="gozilla, traviata"   對于以下的瀏覽器,不啟用壓縮 
          compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源類型需要壓縮 

          5.小結 
          關于Tomcat的Nio和ThreadPool,本身的引入就提高了處理的復雜性,所以對于效率的提高有多少,需要實際驗證一下。 

          6.配置示例 
          <Connector port="8080" 
          redirectPort="8443"
          maxThreads="150" 
          minSpareThreads="25" 
          maxSpareThreads="75" 
          acceptCount="100" 
          connectionTimeout="20000" 
          protocol="HTTP/1.1" 

          maxHttpHeaderSize="8192" 
          URIEncoding="UTF-8" 
          disableUploadTimeout="true" 
          enableLookups="false" 
          compression="on" 
          compressionMinSize="10240" 
          noCompressionUserAgents="gozilla, traviata" 
          compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"> 
          ... 
          </Connector>

           

           

          管理AJP端口

          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">

          阿里云服務器優惠券
          posted @ 2016-04-29 11:59 Alpha 閱讀(2523) | 評論 (2)編輯 收藏
               摘要: 最新的版本可以在這里獲取,目前下載的最新版本是5.08,更新于2016-02-03。在這里可以找到更多的說明。   下載好后,server端分為兩個部分,一個是tracker,一個是storage。顧名思義,前者調度管理,負載均衡,后者則是實際的存儲節點。兩個都能做成集群,以防止單點故障。以前的4.x版本依賴libevent,現在不需要了,只需要libfastcommon。安裝方法如下: 1....  閱讀全文
          posted @ 2016-04-07 13:58 Alpha 閱讀(2855) | 評論 (2)編輯 收藏
               摘要: 1.第一步需要安裝PPTP,以用來提供VPN服務. ? 1 sudo apt-get install pptpd ...  閱讀全文
          posted @ 2016-03-07 12:30 Alpha 閱讀(545) | 評論 (0)編輯 收藏
          1.# rpm -Uvh http://poptop.sourceforge.net/yum/stable/rhel6/pptp-release-current.noarch.rpm 
          2. yum install pptpd 

          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的值可能需要自己調整,調節到能保證網絡正常使用情況下的最大值




          posted @ 2016-02-25 22:31 Alpha 閱讀(515) | 評論 (0)編輯 收藏
               摘要: 關于IP Tables在初始化設置系統后,為了讓系統更安全,Ubuntu把Iptabls作為發行版的默認防火墻。起初,盡管Ubuntu防火墻已經被配置了,但是它設置為通過一個虛擬主機允許所有的進入與流出流量。要打開服務器上某些更強的保護功能,我們需要在IP Table山增加一些基礎的規則。IP Table 規則來自于一系列可以組合起來創建各自的特定的處理方法的選項。每一個通過防火墻的包被所有的規則...  閱讀全文
          posted @ 2015-10-31 15:51 Alpha 閱讀(2577) | 評論 (0)編輯 收藏
          我有一個阿里云推薦碼,分享給大家免費使用,購買云服務器ECS或云數據庫RDS可享受原價優惠,拿走不謝。
          購買可以用阿里云主機推薦碼

          點擊領取優惠券:
          https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=dmb0rzcj&utm_source=dmb0rzcj

          馬上可享受優惠,購買阿里云主機馬上給你省錢!



          我有幾張阿里云幸運券分享給你,用券購買或者升級阿里云相應產品會有特惠驚喜哦!把想要買的產品的幸運券都領走吧!快下手,馬上就要搶光了。
          點擊領取幸運券https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=dmb0rzcj&utm_source=dmb0rzcj


          posted @ 2015-10-28 14:25 Alpha 閱讀(717) | 評論 (0)編輯 收藏

          安裝 MySQL 5 數據庫

          安裝 MySQL 運行命令:

          sudo apt-get install mysql-server mysql-client

          將mysql的datadir從默認的/var/lib/mysql 移到/app/data/mysql下,操作如下:
          1.修改了/etc/mysql/my.cnf,改為:datadir = /app/data/mysql
          2.cp -a /var/lib/mysql /app/data/
          3./etc/init.d/mysql start


          如果出現系統報錯,無法啟動mysql,日志顯示為:Can't find file: "./mysql/plugin.frm'(errno:13)
          [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.

          修改系統的chroot,需要修改/etc/apparmor.d下的相關文件,這里以mysql為例,需要修改:usr.sbin.mysqld和abstractions/mysql兩個文件。

          1.修改usr.sbin.mysqld里面的兩行內容:/var/lib/mysql/ r,改為:/app/data/mysql/ r,/var/lib/mysql/** rwk,改為:/app/data/mysql/** rwk,
          2.修改abstractions/mysql中一行:/var/lib/mysql/mysql.sock rw,改為:/app/data/mysql/mysql.sock rw,
          3.重新加載apparmor服務:/etc/init.d/apparmor reload

          安裝 Nginx

          在安裝 Nginx 之前,如果你已經安裝 Apache2 先刪除在安裝 nginx:

          service apache2 stop
          update-rc.d -f apache2 remove
          sudo apt-get remove apache2

          sudo apt-get install nginx

          安裝 PHP5

          我們必須通過 PHP-FPM 才能讓PHP5正常工作,安裝命令:

          sudo apt-get install php5-fpm

          php-fpm是一個守護進程。

          安裝mysql和GD擴展

          sudo apt-get install php5-gd libapache2-mod-auth-mysql php5-mysql openssl libssl-dev

          sudo apt-get install curl libcurl3 libcurl3-dev php5-curl

          安裝 JDK8

          可以通過訪問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

          配置默認JDK版本

          在有的系統中會預裝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)。

          ====================================

          編譯安裝nginx 
          1. 下載最新版nginx
          2.解壓
          3. 安裝
          $ ./configure  #檢查編譯前置條件
          $ make  #編譯
          $ sudo make install  #使用sudo權限進行安裝
          安裝后路徑在 /usr/local/
          啟動nginx 
          /usr/local/nginx/sbin/nginx
          1)使用在 /etc/init.d/ 目錄下創建名為 nginx 文件,注意沒有后綴名,將以下內容復制到該文件中(感謝提供腳本的兄弟)。
           1 #! /bin/sh
           2 #用來將Nginx注冊為系統服務的腳本
           3 #Author CplusHua
           4 #http://www.219.me
           5 #chkconfig: - 85 15
           6 set -e
           7 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
           8 DESC="Nginx Daemon"
           9 NAME=nginx
          10 DAEMON=/usr/local/nginx/sbin/$NAME
          11 SCRIPTNAME=/etc/init.d/$NAME
          12 #守護進程不存在就退出
          13 test -x $DAEMON ||exit 0
          14 d_start(){
          15   $DAEMON ||echo -n "aready running"
          16 }
          17 d_stop(){
          18   $DAEMON -s quit || echo -n "not running"
          19 }
          20 d_reload(){
          21   $DAEMON -s reload || echo -n "could not reload"
          22 }
          23 case "$1" in
          24   start)
          25     echo -n "Starting $DESC: $NAME"
          26     d_start
          27     echo "."
          28   ;;
          29   stop)
          30     echo -n "Stopping $DESC: $NAME"
          31     d_stop
          32     echo "."
          33   ;;
          34   reload)
          35     echo -n "Reloading $DESC: configurationg.."
          36     d_reload
          37     echo "reloaded."
          38   ;;
          39   restart)
          40     echo -n "Restarting $DESC: $NAME"
          41     d_stop
          42     sleep 3
          43     d_start
          44     echo "."
          45   ;;
          46   *)
          47     echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
          48     exit 3
          49   ;;
          50 esac
          51 
          52 exit 0



          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

               
           啟動svn服務

            # sudo svnserve -d -r /app/svn
            # 查看是否啟動成功,可看的監聽3690端口
            # sudo netstat -antp |grep svnserve
            tcp    0      0 0.0.0.0:3690    0.0.0.0:*      LISTEN    28967/svnserve 
            # 如果想關閉服務,可使用pkill svnserve

          訪問svn
            # 訪問repos版本庫地址
            svn://192.168.1.100/prj


          備份與恢復
             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

           


          posted @ 2015-10-07 15:28 Alpha 閱讀(1002) | 評論 (0)編輯 收藏
          我本身是 Java 工程師出身,寫代碼至今已超過 15 年,創業也超過 10 年,曾經外包過很多項目給別人,也接過很多外包的項目,現在不接了,只經營電子報發送平臺,在二年內累積超過 5000 家企業用戶使用。身處在創業圈,只要有創業朋友主動問過我的,我都會和他說如果你能不接就不要接 ( 當然我也知道,如果不是為了活下去,誰愿意接 ? ),因為這其中有太多陷阱,我分享如下給大家作個參考: 

          因為你寫代碼很快 

          通常會出來接私活的工程師大多是有些年資,也會有自己擅常的工具及 library,所以往往可以很快完成主管交代的工作,會認為客戶的需求只要能在很短的時間內完成,這個項目就賺錢了。 

          【BUT】項目完成的快慢取決于客戶的心情,只要他心情不好,就慢慢拖吧。你以為你的 Code 可以 reuse,最后你才發現真正被 reuse 的是你的肝。 

          因為你寫代碼很快,所以只要客戶比價、殺價、壓你結案時間,你就會心里想一下:嗯,只要我努力趕一下,應該沒問題。 

          【BUT】,無形中你就犧牲了你的利潤空間,只有賺到微利,你知道工程師估完成時間的準確率有多少嗎 ? 準確率有多高,賺到微利的機率就有多高。 

          因為你可以賺每年的維護費 

          接私活是這樣,只要你接了,之后的維護客戶也很難不找你維護,只要慢慢的累積,每年都會有可觀的維護費可以賺。 

          【BUT】,你知道大部份臺灣公司有個不成文規定,同一套系統的維護費預算是每年遞減的,客戶會想:系統每年調整也該穩定了吧,都穩定了你也沒作什么事為什么還要拿這么多錢 ? 接下來,你可能會想說如果客戶想加新功能第一個一定先找你,試想一下,叫你照著三年前自己寫的代碼架構來新增功能,如果沒有吐血,大概代表這三年你也沒什么長進。不接總行吧 ? 偏偏你就這么有責任感,你不接客戶也只能打掉重來請別人重新作一套,你忍心嗎 ? 所以你覺得這維護費好賺嗎? 

          因為你很能為客戶著想 

          你因為很為公司著想,常常在開發過程中發現缺了什么或是主管規劃錯了,你會主動的加班把這些缺的部份補上調好,公司對你贊譽有加,如果接私活的時候以這樣的態度來對待自己的客戶,那雙方合作的感覺一定很好。 

          【BUT】,你的客戶當然好啊,因為你主動幫他加功能把系統調的更好,都不用再花錢啊。加錢 ? 合約當初就簽好了,如何告訴客戶要加錢 ? 況且這是你自己主動要加功能的。可以不加嗎 ? 可以啊,但你可以忍受你的作品明明可以更好的而不讓它更好嗎 ? 如果是當初規劃就錯了,不調整能驗收嗎 ? 

          因為你知道客戶要什么 

          因為在公司時主管常常也語無倫次,但你總是能分析出主管要的是什么,你也都能完成它,所以接私活時就算對方不懂技術,你也能完成他需要的功能。 

          【BUT】,你知道客戶要的是什么嗎 ? 不,你不知道,因為絕大部份客戶自己要什么都不知道,而且你知道客戶的上面還有老板嗎 ? 你知道客戶的老板要的是什么嗎 ? 不,你不會知道,因為連他老板自己都不知道,這是最可怕的嗎 ? 不,還有更可怕的,他們會告訴你他們知道想要的功能是什么,但你就是無法作出他們想要的。 

          因為你很能規劃 

          你是個邏輯觀念很好的人,只要主管告訴你他的需求,你可以很快畫出系統架構圖、代碼架構圖甚至是資料庫架構圖,準確率非常高,所以接私活的時候只要客戶告訴你需求,你很快腦中就會出現各種架構圖雛形。 

          【BUT】,你知道規格是誰開的嗎 ? 對,是客戶開的,因為他不開你就無法報價,如果他要你開,你也怕開完后報價他不接受就等于作白工了。那你覺得客戶的邏輯會有你好嗎 ? 所以通常你要作的是先了解客戶的邏輯,然后找出矛盾的地方,然后提出更好的解決方桉,這一段來來回回就要花不少時間了,喔對,這一段通常是收不到錢的,客戶會覺得你要接我的項目,你本來就要先來了解我的需求。 

          因為你有團隊 

          因為你在業界有一定的人脈了,自己會寫代碼,再找個業務高手、美編高手,這樣最小單位就好,大家可以分工,這樣接私活的問題就變少、進行更順利。 

          【BUT】,因為你有三個人,所以你只能接可以養活 >= 3 個人的項目,這種項目通常會稍大一點,因為以上所述種種原因會造成結案很慢,如果不結案人卡在這個項目拿不到錢,新的項目接不了,怎么辦 ? 對,加人,所以你的團隊變成了 4 個人,接下來你只能接可以養活 >= 4 個人的項目,這個時候如果來了個大項目呢 ? 對,你會陷入無限迴圈,直到你再也接不到更大的項目。 

          因為你想用客戶的項目來練兵 

          正如阿甘說的:人生就像一盒巧克力,你永遠不知道下一個會是什么口味。所以你永遠不知道下一個項目在那里,但當你開始有了團隊,每個月都要付薪水時,這時來一個不大不小的項目,反正也不知道下一個項目何時進來,這個剛好可以付團隊薪水又可以拿來練兵,這也蠻好的。 

          【BUT】,接私活有個特性是你接了這個項目就會降低接下個項目的能力,因為人力及時間總是有限,如果你因為接了一個小項目造成大項目沒人力接,你說大家氣不氣 ? 不幸這個小項目的業主特別麻煩 (基于上述原因,你知道這機率還不小),那你磨練團隊的可不是他們的技術,你磨練的可是大家的身心靈啊,慢慢的就會有一股將相無能,累死三軍的聲音傳出來了 … 你為何不自己開發個小產品來練兵呢 ? 

          因為你應對客戶有一套 

          你的個性很好,以前在公司的時候都可以和廠商或客戶相處很好,可以接的接,不可以接的也會擋,如果出來接私活和客戶應對對不會有問題。 

          【BUT】,客戶百百款,你對客戶有一套,客戶對你可是有好幾套,他可以議價、殺價、壓時間、加功能、拖驗收、會計不見、老板出國 …..,最后怪你為何拖這么久再扣你一筆錢,說了一句:你們不是專業的嗎 ? 開發階段你們是朋友,驗收階段你們就變甲乙雙方。 

          因為你從來不缺客戶 

          你從來不需要自己去陌生開發,客戶都是透過朋友介紹或是客戶轉介紹來的,這比一般公司好太多了,別人想要客戶都還沒有呢。 

          【BUT】,你有沒有想過,你有上面所述種種優點,重點是你還比別人便宜,別人不找你,我都想找你了。所以你賺到錢了嗎 ? 

          因為你都有簽合約 

          為了避免以上不必要的問題,每個項目你一定都會簽合約保護雙方,凡事照合約走就沒問題了。 

          【BUT】,對方有法務你有嗎 ? 對方有錢你有嗎 ? 真正要打官司你打的起嗎 ? 你真的有把握合作過程中你完全沒錯 ? 合約里有辦法規范到所有的功能細節、操作流程 ? 合約訂了一大本,你客戶會和你簽 ? 所以,你真的能照合約走嗎 ? 

          你最近一次開心寫代碼是什么時候 

          在我和你有一樣能力的時候,我曾經說過一句話:我希望我死前的最后一個動作是按下 【Enter】,我寫代碼的動力不是賺錢 ( 當然賺錢很重要,但如果只是賺錢,我大可去作直銷、賣保險、到大公司上班 … ),精準來說不只是賺錢,我的動力來源來自于我寫出來的代碼可以讓非常多人使用,真正幫助到很多人,而且很多人都說好。( 相信我,如果你真的作到這一點,其實你也賺到錢了 ) 

          但自從我接私活之后,我最多只能幫助到我有限的客戶,說精準一點也許就只有真正使用系統的某些人,也只有這些人會說我好,其它人也只會認為那是你該作的,但只要最后驗收時他離職了、他生氣了、一切努力就沒了。所以那時我只有二個時候點是開心的,一個是收到訂金、另一個是收到尾款,中間一大段時間是痛苦的,當同時多個項目進行,其實所有時間都是痛苦的。我還記得我那時常說的一句話:收到你冷冷的支票,我的心就覺得暖暖的。 

          當然一定有人接私活接的很好,只是別人的成功很難複制,但別人的失敗可以避免,如果你能避掉我以上所說的陷阱也無法保證你能成功,因為這也只是冰山一角,我已經離開接私活的狀態很久,很多事忘了也不想去想,只是希望你在決定接私活前,仔細想一下,你真的只有接私活這個選項嗎 ? 如果可以,我會建議你應該要開發自己的產品及服務。 

          來自:電子豹博客 

          posted @ 2015-06-10 14:28 Alpha 閱讀(2238) | 評論 (0)編輯 收藏
          阿里云服務器優惠券

          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

          阿里云服務器優惠券
          posted @ 2014-08-05 15:24 Alpha 閱讀(15606) | 評論 (0)編輯 收藏

                  公司發布的SEO專員招聘有一段時間了,一直沒有找到合適的人選, 一方面專門從事這塊職業的人員比較少,另一方面對這個職位有一定了解的人也比較少.那么我們所說的seo專員是什么樣的一個職位呢? 今天我們來探討一下,在網上搜索了一個相關資料,找到這么一篇文章:http://seo.aizhan.com/qa/542.html,我們看看文章里面的表述:

                  其實seo專員的主要職責就是執行完成SEO主管制定的SEO策略和優化目標任務,通常需要做大量的內容編輯、軟文發布和外鏈建設等各種體力活。現在也有很多公司在發布招聘的時候也有專門招聘SEO外鏈專員這樣的職位,有一定規模的網站也會分為SEO網站優化、SEO網站編輯、SEO外鏈專員等這樣的細分崗位,每個崗位根據SEO優化工作的側重點不同,執行完成的工作重點也是不一樣的。那么今天我們要講的SEO專員的具體工作是什么?做好這個職位需要具備什么樣的素質?
                 SEO專員的具體工作,說到底核心工作就是研究搜索引擎,完成網站內容建設,豐富網站的內容,到各大網站平臺發布定量合適的外鏈,交換友情鏈接,幫助網站獲得關鍵詞排名,并做好數據分析與跟蹤。

                 在這篇文章里講述了什么是SEO專員, SEO專員的具體工作,說到底核心工作就是研究搜索引擎,完成網站內容建設,豐富網站的內容,到各大網站平臺發布定量合適的外鏈,交換友情鏈接,幫助網站獲得關鍵詞排名,并做好數據分析與跟蹤。 但是要找到一名有耐心,有良好的溝通能力,超強的執行力,有比較強的心里承受能力,受得了寂寞的SEO專員卻是一件不容易的事情。

          發布一則房民網SEO專員招聘要求:
          任職要求:
          1、男女不限,大專以上學歷,年齡在20-35歲之間;
          2、對互聯網有濃厚的興趣,熟悉網站的運作和推廣的各種方式,能夠根據公司的需求獨立策劃網站推廣方案并執行;會熟練打字操作常用辦公軟件;
          3、有一定的分析判斷能力,能根據推廣效果提出調整建議,具有敏銳的思維和創新能力,思維開闊;
          4、工作認真、細致、敬業,有較強的溝通能力和團隊合作精神;
          5、1年以上相關工作經歷或精通網站編輯及平面設計者或有一定的文字寫作能力者優先。

          崗位職責:
          1、負責完成網站內容建設,友鏈外鏈建設,關鍵字優化,提高網站排名、搜索引擎收錄量;
          2、執行在線推廣活動,收集推廣反饋數據,不斷改進推廣效果; 
          3、及時提出網絡推廣改進建議,給出實際可行的改進方案。

          快來加入吧:)
          posted @ 2013-11-24 10:04 Alpha 閱讀(1559) | 評論 (2)編輯 收藏
                一直從事于開發與運維相關技術的研究實踐,最近在做幾個房產網分站的SEO優化技術儲備, 緣于長沙房產網的百度快照陰情不定讓人很蛋疼,于是對此進行了深入的研究,發現SEO網站優化也是一門相當有技術含量的技術活,涉及的知識點和技術面都要廣才能掌握大局,同時也要調動團隊各環節,從網站的最初版面功能策劃到頁面的視覺設計和代碼編寫,再到程序開發時的架構設計,最后做內容時的內容編排等一系列的問題都得考慮到,且都要執行到位,否則任何一個環節沒做好都有可能影響到整個SEO優化的效果.因此,今天開辟一個新版塊,專門從事SEO優化技術的研究與實踐.

                目前在拿房產網的四個分站進行實戰研究,希望能從中找到一些答案,這四個站的主關鍵詞也是相當有競爭難度,比如東莞房產網這個關鍵詞的收錄量有250多萬,但是http://dg.fmw.cn/這個域名的百度收入占有量卻只有兩位數,而比東莞房產網遲了一個多月上線的昆明房產網,這個站域名是http://km.fmw.cn/,它收錄量都上三位數了,遠遠超過了東莞房產網的收入量,這讓人更是摸不著頭腦.表現最滿意的是佛山房產網,它同樣比東莞房產網上線遲了一個多月,但是收入量等各方面指數上升很明顯.同樣的網站架構,同樣每天都有堅持在做內容,但是卻有不一樣的表現,這是一個值得研究的課題.

          SEO既Search Engine Optimization,翻譯為搜索引擎優化,是一種利用技術手段提升網站在搜索引擎之中的排名的方式,讓搜索引擎更為信任網站,通過排在搜索引擎的前頁從而獲得更多的流量。

                希望在接下來的SEO優化研究和實踐工作中能找到這一系列的答案,屆時房民網與大家一起來分享. 
          posted @ 2013-10-09 00:12 Alpha 閱讀(1437) | 評論 (0)編輯 收藏

          給大家推薦一處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  購買主機立即省錢!


          posted @ 2013-08-19 01:04 Alpha 閱讀(1839) | 評論 (1)編輯 收藏
          1.首先確認服務器出于安全的狀態,也就是沒有人能夠任意地連接MySQL數據庫。
          因為在重新設置MySQL的root密碼的期間,MySQL數據庫完全出于沒有密碼保護的
          狀態下,其他的用戶也可以任意地登錄和修改MySQL的信息。可以采用將MySQL對
          外的端口封閉,并且停止Apache以及所有的用戶進程的方法實現服務器的準安全
          狀態。最安全的狀態是到服務器的Console上面操作,并且拔掉網線。
          2.修改MySQL的登錄設置:
          # vi /etc/my.cnf
          在[mysqld]的段中加上一句:skip-grant-tables
          例如:
          [mysqld]
          datadir=/var/lib/mysql
          socket=/var/lib/mysql/mysql.sock
          skip-grant-tables
          保存并且退出vi。
          3.重新啟動mysqld
          # /etc/init.d/mysqld restart
          Stopping MySQL: [ OK ]
          Starting MySQL: [ OK ]
          4.登錄并修改MySQL的root密碼
          # /usr/bin/mysql
          Welcome to the MySQL monitor. Commands end with ; or \g.
          Your MySQL connection id is 3 to server version: 3.23.56
          Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
          mysql> USE mysql ;
          Reading table information for completion of table and column names
          You can turn off this feature to get a quicker startup with -A
          Database changed
          mysql> UPDATE user SET Password = password ( 'new-password' ) WHERE User = 'root' ;
          Query OK, 0 rows affected (0.00 sec)
          Rows matched: 2 Changed: 0 Warnings: 0
          mysql> flush privileges ;
          Query OK, 0 rows affected (0.01 sec)
          mysql> quit
          Bye
          5.將MySQL的登錄設置修改回來
          # vi /etc/my.cnf
          將剛才在[mysqld]的段中加上的skip-grant-tables刪除
          保存并且退出vi。
          6.重新啟動mysqld
          # /etc/init.d/mysqld restart
          Stopping MySQL: [ OK ]
          Starting MySQL: [ OK ]
          posted @ 2013-04-19 11:39 Alpha 閱讀(1732) | 評論 (0)編輯 收藏
          阿里云服務器優惠券

          經常使用CentOS的朋友,可能會遇到和我一樣的問題。開啟了防火墻導致80端口無法訪問,剛開始學習centos的朋友可以參考下。

          經常使用CentOS的朋友,可能會遇到和我一樣的問題。最近在Linux CentOS防火墻下安裝配置 ORACLE 
          數據庫的時候,總顯示因為網絡端口而導致的EM安裝失敗,遂打算先關閉一下CentOS防火墻。偶然看到CentOS防火墻的配置操作說明,感覺不錯。執

          行”setup”命令啟動文字模式配置實用程序,在”選擇一種工具”中選擇”防火墻配置”,然后選擇”運行工具”按鈕,出現CentOS防火墻配置界面,
          將”安全級別”設為”禁用”,然后選擇”確定”即可.

          這樣重啟計算機后,CentOS防火墻默認已經開放了80和22端口

          簡介:CentOS是Linux家族的一個分支。

          CentOS防火墻在虛擬機的CENTOS裝好APACHE不能用,郁悶,解決方法如下

          /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
          /sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT

          然后保存:

          /etc/rc.d/init.d/iptables save
          centos 5.3,5.4以上的版本需要用
          service iptables save
          來實現保存到配置文件。
          這樣重啟計算機后,CentOS防火墻默認已經開放了80和22端口。

          這里應該也可以不重啟計算機:

          /etc/init.d/iptables restart

          CentOS防火墻的關閉,關閉其服務即可:

          查看CentOS防火墻信息:/etc/init.d/iptables status

          關閉CentOS防火墻服務:/etc/init.d/iptables stop

          永久關閉?不知道怎么個永久法:

          chkconfig –level 35 iptables off

          上面的內容是針對老版本的centos,下面的內容是基于新版本。

          iptables -P INPUT DROP

          這樣就拒絕所有訪問 CentOS 5.3 本系統數據,除了 Chain RH-Firewall-1-INPUT (2 references) 的規則外 , 呵呵。

          用命令配置了 iptables 一定還要 service iptables save 才能保存到配置文件。

          cat /etc/sysconfig/iptables 可以查看 防火墻 iptables 配置文件內容

          # Generated by iptables-save v1.3.5 on Sat Apr 14 07:51:07 2001
          *filter
          :INPUT DROP [0:0]
          :FORWARD ACCEPT [0:0]
          :OUTPUT ACCEPT [1513:149055]
          :RH-Firewall-1-INPUT - [0:0]
          -A INPUT -j RH-Firewall-1-INPUT
          -A FORWARD -j RH-Firewall-1-INPUT
          -A RH-Firewall-1-INPUT -i lo -j ACCEPT
          -A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
          -A RH-Firewall-1-INPUT -p esp -j ACCEPT
          -A RH-Firewall-1-INPUT -p ah -j ACCEPT
          -A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
          -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
          -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
          -A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
          -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
          -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
          COMMIT
          # Completed on Sat Apr 14 07:51:07 2001

          另外補充:
          CentOS 防火墻配置 80端口
          看了好幾個頁面內容都有錯,下面是正確方法:
          #/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
          #/sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT

          然后保存:
          #/etc/rc.d/init.d/iptables save

          再查看是否已經有了:
          [root@vcentos ~]# /etc/init.d/iptables status
          Table: filter
          Chain INPUT (policy ACCEPT)
          num target prot opt source destination
          1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:80
          2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
          3 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

          Chain FORWARD (policy ACCEPT)
          num target prot opt source destination
          1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

          * 設置iptables為自動啟動
          chkconfig --level 2345 iptables on

          可能因為大家使用的版本不一,所有使用方法也略有不同。

          如果需要遠程管理mysql,則使用以下指令臨時打開,用完后關閉 

          * 打開指令 
          iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 3306 -j ACCEPT 

          * 關閉指令 
          iptables -D INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 3306 -j ACCEPT

          nginx 80 端口訪問不了?
          添加一個本地回路
           iptables -A INPUT -i lo -j ACCEPT 
          阿里云服務器優惠券
          posted @ 2012-09-17 23:59 Alpha 閱讀(32169) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 若尔盖县| 平定县| 砚山县| 邳州市| 揭阳市| 安溪县| 乌海市| 错那县| 呼图壁县| 淮阳县| 肃宁县| 乐平市| 通山县| 永平县| 塘沽区| 裕民县| 东海县| 孟村| 抚宁县| 康定县| 龙川县| 钟山县| 柞水县| 疏附县| 瑞丽市| 青冈县| 绍兴县| 左贡县| 松滋市| 苍南县| 中西区| 桑植县| 安仁县| 大化| 玉环县| 仁怀市| 凤翔县| 新营市| 阜阳市| 岳阳市| 洱源县|