nginx 외부링크 차단

nginx RSS Icon ATOM Icon 2016/12/02 14:23 visualp

이미지 외부링크 차단하기

이미지 외부링크 차단하기 에 대한 설명이며
Nginx 기준입니다.
nginx.conf file에 아래의 정보를 추가하시면 됩니다.


localtion ~\.(jpg?g|png|gif)${

   valid_referers none blocked domain.com*.domain.com;
   if($invalid_referer){
       return403;
   }
}
2016/12/02 14:23 2016/12/02 14:23
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/716

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/716

1. 맨 끝에 있는 콤마(,)를 제거하는 경우


<update id="updateAuthorIfNecessary" parameterType="domain.blog.Author">

UPDATE AUTHOR
<trim prefix="SET" suffixOverrides=",">
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio},</if>
</trim>
WHERE id=#{id}
</update>
 
맨앞에 SET을 붙이고 if안에 무엇이 들어가도 맨 끝에 있는 콤마를 지우겠다는 것이다.
 
 
 
2. 맨 앞에 있는 연산자를(AND 또는 OR) 제거하는 경우
 
 
<select id="selectInfo" parameterType="domain.blog.Author" resultType="authorResultMap">
 SELECT * FROM AUTHOR
 <trim prefix="WHERE" prefixOverrides="AND |OR">
<if test="username != null>AND username=#{username}</if>
<if test="password != null>OR password=#{password}</if>
<if test="email != null>AND email=#{email}</if>
</trim>
2016/12/01 15:08 2016/12/01 15:08
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/715

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/715

html5 - 숫자패드

웹표준 RSS Icon ATOM Icon 2016/12/01 11:08 visualp
<input type="number" pattern="[0-9]*" inputmode="numeric" placeholder="">
2016/12/01 11:08 2016/12/01 11:08
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/714

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/714


-- Maria DB max connection 수 확인

SHOW VARIABLES LIKE '%max_connection%'

-- Maria DB에 접속되어 있는 client 정보 리스트

SHOW PROCESSLIST;

-- Maria DB max connection 수 조절

SET GLOBAL max_connections = 10000;

//status 관련 값
show status like '%CONNECT%';

Max_used_connections <--현재 연결된 접속수

Threads_connected  <-- 연결되었던 최대 접속수

2016/10/13 09:45 2016/10/13 09:45
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/713

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/713

using System;

class Program {
    static void Main(string[] args) {
        System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
        throw new Exception("Kaboom");
    }

    static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e) {
        Console.WriteLine(e.ExceptionObject.ToString());
        Console.WriteLine("Press Enter to continue");
        Console.ReadLine();
        Environment.Exit(1);
    }
}

// c#에서 Console(콘솔) 어플리케이션에서 글로벌 에러 처리
   반복 작업시 유용하게 이용

 

 

2016/10/13 09:14 2016/10/13 09:14
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/712

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/712

phpmyadmin timeout 시간 설정

PHP RSS Icon ATOM Icon 2016/05/19 17:20 visualp
config.inc.php
add to below end of line !~
$cfg['LoginCookieValidity']=3600*24*365;
2016/05/19 17:20 2016/05/19 17:20
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/711

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/711

1. 톰켓 클러스터링 설정(config tomcat clustering)
[참고]
http://khaidoan.wikidot.com/tomcat-cluster-session-replication-without-multicasting
참고 하여 설정 함

ip 기반으로 서버 분산 처리 하는 경우
한 서버에 여러 개의 톰켓을 세팅 하는 방법은 검색하면 쉽게 해결 할 수 있음
본 글에서는 서로다른  ip주소 톰켓 을 세션 클러스터링 하기 위해서 ~


 <Manager className="org.apache.catalina.ha.session.DeltaManager"
             expireSessionsOnShutdown="false"
             notifyListenersOnReplication="true" />
바로 이부분이 아이피 기반 설정을 하기 위해서 필요함 Manager
톰켓 메니저의 자세한 설명은 tomcat.apache.org에 방문하면 확인 할 수 있음.

domain <--부분은 서로 일치 해야하며 , 
port <-- 서로다른 서버 임으로 4100포트로 통일

HOST 엘리먼트의 CONTEXT엘리먼트 PATH는 일치 해야함
session은 context기반으로 생성 됨으로 


붉은 색으로 표시 된 부분이 설정의 핵심임 UNIQUE아이디는 서로 달라야 함

LocalMember 은 자신의 서버 정보를 입력하면 되고

Member  은 원격지 서버의 정보를 입력 하면됨


마지막으로 

배포하는 어플리케이션의 web.xml에는 
<distributable />엘리먼트를 추가한다.


이렇게 하면 우선 서버 설정은 끝 
NGINX에서 로드벨런싱 세팅

server {
 
    listen       80;
    server_name  ssogate.fourfree.com;
    client_max_body_size 100M;
 
        location / {
                proxy_redirect     off;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $remote_addr;
                proxy_pass http://tomcat;
        }
 
        location ~^/ssogate2/* {
                proxy_redirect     off;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $remote_addr;
                proxy_pass http://tomcat2;
        }
}

ssogate.fourfree.com 서버의  nginx 설정 입니다.
ssogate.fourfree.com <-http://tomcat;
ssogate.fourfree.com/ssogate2/ <-- http://tomcat2;
으로 접근 하도록 설정 함 니다.

비록 서브 도메인이나 / 서로다른 도메인을 가지고 session을 공유 한것은 아니지만
사이트 내에서 덩치가 큰 서비스를 분리해 주기 위해서 tomcat 클러스터링을 이용했습니다.

소규모 사이트에서는 괜찮은 방법 같아 보입니다. sso 솔루션을 구매 하거나 josso를 이용해서 구축 해야 하지만 .
간단하게 session을 공유 할 수 있습니다. 
이방식으로 사이트 개발 후 서버에 배포 하려고 합니다 .~




server.xml1 설정
---------------------------------------------
 <Host name="ssogate.fourfree.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
        <!--
                <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->
                <Alias>ssogate.fourfree.com</Alias>
                <Context path="/" docBase="/home/homepage/public_html" reloadable="true" workDir="/home/homepage/public_html/WEB-INF/classes" distributable="true"  className="org.apache.catalina.ha.context.ReplicatedContext"  sessionCookieDomain=".fourfree.com"  >
 
                <Manager className="org.apache.catalina.ha.session.DeltaManager"
             expireSessionsOnShutdown="false"
             notifyListenersOnReplication="true" />
 
 
                </Context>
 
                <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
           channelSendOptions="8">
 
    <Manager className="org.apache.catalina.ha.session.DeltaManager"
             expireSessionsOnShutdown="false"
             notifyListenersOnReplication="true" />
 
    <Channel className="org.apache.catalina.tribes.group.GroupChannel">
      <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                address="1.220.141.43"
                port="4100"
                autoBind="100"
                selectorTimeout="5000"
                maxThreads="6" />
 
      <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
        <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
      </Sender>
 
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
 
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
 
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor" />
 
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
 
        <LocalMember className="org.apache.catalina.tribes.membership.StaticMember"
                                                port="4100"
                                                securePort="-1"
                                                host="ssogate.fourfree.com"
                                                domain="tomcat-cluster"
                                                uniqueId="{15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0}"/>
 
        <Member className="org.apache.catalina.tribes.membership.StaticMember"
                host="ssogate2.fourfree.com"
                port="4100"
                securePort="-1"
                domain="tomcat-cluster"
                uniqueId="{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}" />


      </Interceptor>
    </Channel>
 
    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
           filter="" />
 
    <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" />
 
    <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
  </Cluster>
</Host>



=============================================================================================================================
server.xml2 설정
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
 
        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->
 
        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>
 
      <!--
 <Context docBase="C:\Users\visualp\Desktop\java\sts\workspace-sts-3.6.2.RELEASE\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ROOT" path="" reloadable="false"/>
 -->
 <Alias>ssogate.fourfree.com</Alias>
 <Alias>ssogate2.fourfree.com</Alias>
 <Context docBase="C:\Users\visualp\Desktop\java\sts\workspace-sts-3.6.2.RELEASE\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\homepage" path="/" reloadable="true" source="org.eclipse.jst.jee.server:homepage" distributable="true"
className="org.apache.catalina.ha.context.ReplicatedContext"
sessionCookieDomain=".fourfree.com"
 >
 
<Manager 
className="org.apache.catalina.ha.session.DeltaManager" 
expireSessionsOnShutdown="false" 
notifyListenersOnReplication="true"
/>
 
 </Context>
 
 
<Cluster 
channelSendOptions="6" 
channelStartOptions="3" 
className="org.apache.catalina.ha.tcp.SimpleTcpCluster" defaultMode="true">
 
 
 
<Manager 
className="org.apache.catalina.ha.session.DeltaManager" 
expireSessionsOnShutdown="false" 
notifyListenersOnReplication="true"
/>
 
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<Receiver 
address="61.32.203.30" 
autoBind="0" 
domain="tomcat-cluster"
className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
maxThreads="6" 
port="4100" 
selectorTimeout="5000"
/>
<!-- <Interceptor className="com.dm.tomcat.interceptor.DisableMulticastInterceptor" /> -->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor" staticOnly="true"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
 
<LocalMember className="org.apache.catalina.tribes.membership.StaticMember"
port="4100"
securePort="-1"
host="ssogate2.fourfree.com"
domain="tomcat-cluster"
uniqueId="{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}"/>
 
 
<Member className="org.apache.catalina.tribes.membership.StaticMember" 
port="4100" 
securePort="-1"
host="ssogate.fourfree.com" 
domain="tomcat-cluster"
uniqueId="{15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0}" />
/>
 
</Interceptor>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" 
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;" 
/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
</Host>




2016/04/08 15:11 2016/04/08 15:11
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/710

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/710

nignx , ip_hash 옵션 , Upstream

Linux RSS Icon ATOM Icon 2016/03/30 09:20 visualp


형식

upstream 이름 {
    [ip_hash;]
    server host 주소:포트 [옵션];
    .....
}

옵션

옵션으로 올 수 있는 값은 아래와 같다.

  • ip_hash : 같은 방문자로부터 도착한 요청은 항상 같은 업스트림 서버가 처리 할 수 있게 한다.
  • weight=n : 업스트림 서버의 비중을 나타낸다. 이 값을 2로 설정하면 그렇지 않은 서버에 비해 두배 더 자주 선택된다.
  • max_fails=n : n으로 지정한 횟수만큼 실패가 일어나면 서버가 죽은 것으로 간주한다.
  • fail_timeout=n : max_fails가 지정된 상태에서 이 값이 설정만큼 서버가 응답하지 않으면 죽은 것으로 간주한다.
  • down : 해당 서버를 사용하지 않게 지정한다. ip_hash; 지시어가 설정된 상태에서만 유효하다.
  • backup : 모든 서버가 동작하지 않을 때 backup으로 표시된 서버가 사용되고 그 전까지는 사용되지 않는다.

예제

예를들면 아래와 같다.

upstream backend {
    ip_hash;
    server 192.168.125.142:9000 weight=3;
    server 192.168.125.143:9000;
    server 192.168.125.144:9000 max_fails=5 fail_timeout=30s;
    server unix:/var/run/php5-fpm.sock backup;
}

위의 설정을 풀어보면 아래와 같다.

같은 IP는 같은 업스트림 서버에 접속한다.
(ip_hash) 192.168.125.142 서버는 다른 서버 대비 3배 더 자주 사용된다.
192.168.125.144 서버는 30초 동안 응답하지 않는 상태가 5번 지속되면 죽은 것으로 간주하고 더 이상 요청을 보내지 않는다.
같은 호스트에 설치되서 소켓을 통해서 통신하는 FastCGI 에플리케이션은 백업용도이기 때문에 평소에는 사용하지 않다가 나머지 서버들이 불능상태가 되었을 때 자동으로 활성화된다.

2016/03/30 09:20 2016/03/30 09:20
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/709

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/709

1. Servlet 3.1 deployment descriptor

Java EE 7 XML schema, namespace is http://xmlns.jcp.org/xml/ns/javaee/

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
</web-app>


2. Servlet 3.0 deployment descriptor

Java EE 6 XML schema, namespace is http://java.sun.com/xml/ns/javaee

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
</web-app>

3. Servlet 2.5 deployment descriptor

Java EE 5 XML schema, namespace is http://java.sun.com/xml/ns/javaee

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

</web-app

>


4. Servlet 2.4 deployment descriptor

J2EE 1.4 XML schema, namespace is http://java.sun.com/xml/ns/j2ee

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">

  <display-name>Servlet 2.4 Web Application</display-name>
</web-app>


5. Servlet 2.3 deployment descriptor

J2EE 1.3 DTDs schema. This web.xml file is too old, highly recommend you to upgrade it.

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Servlet 2.3 Web Application</display-name>
</web-app>

[원문]: http://www.mkyong.com/web-development/the-web-xml-deployment-descriptor-examples/

2016/03/23 15:54 2016/03/23 15:54
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/708

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/708

c# image resizing & reduce file size

C# RSS Icon ATOM Icon 2016/03/04 10:58 visualp

[원문]
http://stackoverflow.com/questions/4161873/reduce-image-size-c-sharp

public static void SaveJpeg(string path, Image img, int quality)
        {
            if (quality < 0 || quality > 100)
                throw new ArgumentOutOfRangeException("quality must be between 0 and 100.");

            // Encoder parameter for image quality
            EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
            // JPEG image codec
            ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
            EncoderParameters encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = qualityParam;
            img.Save(path, jpegCodec, encoderParams);
        }

        /// <summary>
        /// Returns the image codec with the given mime type
        /// </summary>
        private static ImageCodecInfo GetEncoderInfo(string mimeType)
        {
            // Get image codecs for all image formats
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

            // Find the correct image codec
            for (int i = 0; i < codecs.Length; i++)
                if (codecs[i].MimeType == mimeType)
                    return codecs[i];

            return null;
        }

2016/03/04 10:58 2016/03/04 10:58
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.visualp.com/rss/response/707

댓글+트랙백 ATOM :: http://blog.visualp.com/atom/response/707